Documentation / translations / zh_CN / usb / chipidea.rst


Based on kernel version 7.2. Page generated on 2026-08-20 08:41 EST.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_CN.rst

:Original: Documentation/usb/chipidea.rst

:翻译:

 白钶凡 Kefan Bai <baikefan@leap-io-kernel.com>

:校译:


=============================
ChipIdea 高速双角色控制器驱动
=============================

1. 如何测试 OTG FSM(HNP 和 SRP)
---------------------------------

下面以两块 Freescale i.MX6Q Sabre SD 开发板为例,
说明如何通过 sysfs 输入文件演示 OTG 的 HNP 和 SRP 功能。

1.1 如何使能 OTG FSM
--------------------

1.1.1 在 ``menuconfig`` 中选择 ``CONFIG_USB_OTG_FSM``,并重新编译内核
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

重新构建内核镜像和模块。如果想查看 OTG FSM 的
一些内部变量,可以挂载 ``debugfs``;其中有两个文件
可以显示 OTG FSM 变量以及部分控制器寄存器的值::

	cat /sys/kernel/debug/ci_hdrc.0/otg
	cat /sys/kernel/debug/ci_hdrc.0/registers

1.1.2 在控制器节点对应的 ``dts`` 文件中添加以下条目
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

	otg-rev = <0x0200>;
	adp-disable;

1.2 测试步骤
------------

1) 给两块 Freescale i.MX6Q Sabre SD 开发板上电,
   并加载 gadget 类驱动(例如 ``g_mass_storage``)。

2) 用 USB 线连接两块开发板:
   一端是 micro A 插头,另一端是 micro B 插头。

   插入 micro A 插头的一端是 A 设备,它应枚举另一端的 B 设备。

3) 角色切换

   在 B 设备上执行::

	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req

   B 设备应接管主机角色并枚举 A 设备。

4) A 设备切回主机角色

   在 B 设备上执行::

	echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req

   或者,通过引入 HNP 轮询,B 端主机可以知道
   A 端外设希望切换为主机角色,因此这次角色切换
   也可以通过 A 端外设响应 B 端主机的轮询,
   在 A 侧触发。
   这可以通过在 A 设备上执行下面的命令来完成::

	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req

   A 设备应切回主机角色并枚举 B 设备。

5) 拔掉 B 设备(拔掉 micro B 插头),
   并在 10 秒内重新插入;
   A 设备应重新枚举 B 设备。

6) 拔掉 B 设备(拔掉 micro B 插头),
   并在 10 秒后重新插入;
   A 设备不应重新枚举 B 设备。

   如果 A 设备希望使用总线:

   在 A 设备上执行::

	echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req

   如果 B 设备希望使用总线:

   在 B 设备上执行::

	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req

7) A 设备关闭总线供电

   在 A 设备上执行::

	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop

   A 设备应断开与 B 设备的连接,并关闭总线供电。

8) B 设备发出 SRP 数据脉冲

   在 B 设备上执行::

	echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req

   A 设备应恢复 USB 总线并枚举 B 设备。

1.3 参考文档
------------
《On-The-Go and Embedded Host Supplement
to the USB Revision 2.0 Specification
July 27, 2012 Revision 2.0 version 1.1a》

2. 如何将 USB 用作系统唤醒源
----------------------------
下面是在 i.MX6 平台上把 USB 用作系统唤醒源的示例。

2.1 使能核心控制器的唤醒功能::

	echo enabled > /sys/bus/platform/devices/ci_hdrc.0/power/wakeup

2.2 使能 glue 层的唤醒功能::

	echo enabled > /sys/bus/platform/devices/2184000.usb/power/wakeup

2.3 使能 PHY 的唤醒功能(可选)::

	echo enabled > /sys/bus/platform/devices/20c9000.usbphy/power/wakeup

2.4 使能根集线器的唤醒功能::

	echo enabled > /sys/bus/usb/devices/usb1/power/wakeup

2.5 使能相关设备的唤醒功能::

	echo enabled > /sys/bus/usb/devices/1-1/power/wakeup

如果系统只有一个 USB 端口,
而你希望在该端口上启用 USB 唤醒功能,
可以使用下面的脚本::

	for i in $(find /sys -name wakeup | grep usb);do echo enabled > $i;done;