ChipIdea 高速双角色控制器驱动程序¶
1. 如何测试 OTG FSM(HNP 和 SRP)¶
展示如何通过带有 2 个 Freescale i.MX6Q Sabre SD 板的系统输入文件演示 OTG HNP 和 SRP 功能。
1.1 如何启用 OTG FSM¶
1.1.2 在您的控制器节点的 dts 文件中添加以下条目¶
otg-rev = <0x0200>;
adp-disable;
1.2 测试操作¶
启动 2 个加载了 gadget 类驱动程序(例如 g_mass_storage)的 Freescale i.MX6Q Sabre SD 板。
用 USB 电缆连接 2 个板:一端是 micro A 插头,另一端是 micro B 插头。
A 设备(插入 micro A 插头)应枚举 B 设备。
角色切换
在 B 设备上
echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
B 设备应承担主机角色并枚举 A 设备。
A 设备切换回主机。
在 B 设备上
echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
或者,通过引入 HNP 轮询,B 主机可以知道 A 外围设备何时希望处于主机角色,因此此角色切换也可以通过响应 B 主机的轮询在 A 外围设备侧触发。 这可以在 A 设备上完成
echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
A 设备应切换回主机并枚举 B 设备。
移除 B 设备(拔下 micro B 插头),并在 10 秒后重新插入;A 设备应再次枚举 B 设备。
移除 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
A 设备关闭总线电源。
在 A 设备上
echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
A 设备应断开与 B 设备的连接并关闭总线电源。
B 设备为 SRP 执行数据脉冲。
在 B 设备上
echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
A 设备应恢复 USB 总线并枚举 B 设备。
1.3 参考文档¶
“USB 2.0 规范的 On-The-Go 和嵌入式主机补充,2012 年 7 月 27 日,修订版 2.0 版本 1.1a”
2. 如何启用 USB 作为系统唤醒源¶
以下是如何在 imx6 平台上启用 USB 作为系统唤醒源的示例。
2.1 启用内核的唤醒
echo enabled > /sys/bus/platform/devices/ci_hdrc.0/power/wakeup
2.2 启用粘合层的唤醒
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 唤醒,您可以使用以下脚本启用 USB 唤醒
for i in $(find /sys -name wakeup | grep usb);do echo enabled > $i;done;