ChipIdea高速双角色控制器驱动¶
1. 如何测试OTG FSM(HNP和SRP)¶
演示如何通过sys输入文件,在两块飞思卡尔i.MX6Q sabre SD板上演示OTG HNP和SRP功能。
1.1 如何启用OTG FSM¶
1.1.2 在dts文件中为控制器节点添加以下条目¶
otg-rev = <0x0200>;
adp-disable;
1.2 测试操作¶
启动两块已加载小工具类驱动(例如g_mass_storage)的飞思卡尔i.MX6Q sabre SD板。
用USB线连接两块板:一端是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外设何时希望扮演主机角色,因此此角色切换也可以通过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 参考文档¶
“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作为系统唤醒源¶
以下是在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;