ChipIdea 高速双角色控制器驱动程序

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

展示如何通过带有 2 个 Freescale i.MX6Q Sabre SD 板的系统输入文件演示 OTG HNP 和 SRP 功能。

1.1 如何启用 OTG FSM

1.1.1 在 menuconfig 中选择 CONFIG_USB_OTG_FSM,重新构建内核

映像和模块。 如果您想检查 otg fsm 的一些内部变量,请挂载 debugfs,有 2 个文件可以显示 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. 启动 2 个加载了 gadget 类驱动程序(例如 g_mass_storage)的 Freescale i.MX6Q Sabre SD 板。

  2. 用 USB 电缆连接 2 个板:一端是 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 外围设备何时希望处于主机角色,因此此角色切换也可以通过响应 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 参考文档

“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;