ChipIdea高速双角色控制器驱动

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

演示如何通过sys输入文件,在两块飞思卡尔i.MX6Q sabre SD板上演示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. 启动两块已加载小工具类驱动(例如g_mass_storage)的飞思卡尔i.MX6Q sabre SD板。

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

    A设备(插入micro 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作为系统唤醒源

以下是在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;