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;