1. How to test OTG FSM(HNP and SRP) ----------------------------------- To show how to demo OTG HNP and SRP functions via sys input files with 2 Freescale i.MX6Q sabre SD boards. 1.1 How to enable OTG FSM in menuconfig --------------------------------------- Select CONFIG_USB_OTG_FSM, rebuild kernel Image and modules. If you want to check some internal variables for otg fsm, select CONFIG_USB_CHIPIDEA_DEBUG, there are 2 files which can show otg fsm variables and some controller registers value: cat /sys/kernel/debug/ci_hdrc.0/otg cat /sys/kernel/debug/ci_hdrc.0/registers 1.2 Test operations ------------------- 1) Power up 2 Freescale i.MX6Q sabre SD boards with gadget class driver loaded (e.g. g_mass_storage). 2) Connect 2 boards with usb cable with one end is micro A plug, the other end is micro B plug. The A-device(with micro A plug inserted) should enumrate B-device. 3) Role switch On B-device: echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req B-device should take host role and enumrate A-device. 4) A-device switch back to host. On A-device: echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req or, on B-device: echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req A-device should switch back to host and enumrate B-device. 5) Remove B-device(unplug micro B plug) and insert again in 10 seconds, A-device should enumrate B-device again. 6) Remove B-device(unplug micro B plug) and insert again after 10 seconds, A-device should NOT enumrate B-device. if A-device wants to use bus: On A-device: 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 if B-device wants to use bus: On B-device: echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req 7) A-device power down the bus. On A-device: echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop A-device should disconnect with B-device and power down the bus. 8) B-device does data pulse for SRP. On B-device: echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req A-device should resume usb bus and enumrate B-device. 1.3 Reference document ---------------------- "On-The-Go and Embedded Host Supplement to the USB Revision 2.0 Specification July 27, 2012 Revision 2.0 version 1.1a" 1.4 OTG compliance test ---------------------- Only below 3 popular gadget drivers are declared to be USB OTG and EH 2.0 compliant(with otg descriptor comply with USB OTG and EH 2.0 as a peripheral): - mass storage - ether - serial 1.5 Runtime enable and disable full HNP --------------------------------------- One more input file is created: /sys/bus/platform/devices/ci_hdrc.0/inputs/hnp_enable Defaultly USB OTG full HNP(do role switch by SW protocol, no need exchange OTG plug) is not enabled, user can enable or disable it after disconnect from other end device by: echo 1 or 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/hnp_enable If this input is 0, only OTG role switch by ID pin detection can be supported. 1.6 Enable and test USB OTG ADP ---------------------- Enable: 1) Enable OTG FSM as 1.1 2) Add "adp-support" properity in dts for your hardware Test sequence: 1) Connect 2 OTG devices, enable HNP by enable hnp_enable at 2 boards echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/hnp_enable 2) After A-device ends session(remove B-device and wait 10s, or a_bus_drop) 3) Remove B-device, B-device will show "OTG device detached". 4) Insert B-device, A-device will enumerate B-device. 2. How to enable USB as system wakeup source ----------------------------------- Below is the example for how to enable USB as system wakeup source at imx6 platform. 2.1 Enable core's wakeup echo enabled > /sys/bus/platform/devices/ci_hdrc.0/power/wakeup 2.2 Enable glue layer's wakeup echo enabled > /sys/bus/platform/devices/2184000.usb/power/wakeup 2.3 Enable PHY's wakeup (optional) echo enabled > /sys/bus/platform/devices/20c9000.usbphy/power/wakeup 2.4 Enable roothub's wakeup echo enabled > /sys/bus/usb/devices/usb1/power/wakeup 2.5 Enable related device's wakeup echo enabled > /sys/bus/usb/devices/1-1/power/wakeup If the system has only one usb port, and you want usb wakeup at this port, you can use below script to enable usb wakeup. for i in $(find /sys -name wakeup | grep usb);do echo enabled > $i;done;