Edit online

USB OTG 配置

3 Dec 2024
Read time: 4 minute(s)

OTG 模式配置

OTG 可以配置成 Auto 模式 或者 Manual 模式 :
  • Auto 模式。根据 id-pin GPIO 管脚的电平来决定当前 OTG 端口工作模式为 Host / Device

    配置 OTG 为 Auto 模式时,id-pin 是必须要配置的,需要配置 id-pin GPIO 的名称和极性。相关 menuconfig 配置:
    > Local packages options
       > Third-party packages options
           [*] CherryUSB: tiny and portable USB host/device stack for embedded system with USB IP  --->
               [*]   Enable usb otg mode  --->
                   Select otg switch (Auto (Id pin detect))  --->
                   -*-   Using id-pin gpio  --->
                       (PF.15) GPIO name
                       Select GPIO polarity (Input value: 0 = Host, 1 = Device)  --->
  • OTG 工作在 Manual 模式时,由用户手工来切换 Host/Device 模式。相关 menuconfig 配置:
    > Local packages options
       > Third-party packages options
           [*] CherryUSB: tiny and portable USB host/device stack for embedded system with USB IP  --->
               [*]   Enable usb otg mode  --->
                   Select otg switch (Manual)  --->
                   Select default mode (Device)  --->
    手工切换 Host/Device 模式的命令为 set_otg_mode:
    aic /> set_otg_mode host
    Usb otg auto mode (switch usb0 to host).
    aic />
    aic /> set_otg_mode device
    Usb otg manual mode (switch usb0 to device).
两种模式对应 DTS 文件中的 otg 节点的不同配置:
Mode DTS otg-mode 属性 DTS xxx-gpios 属性 运行时 Host / Device 切换方法
Auto otg-mode = "auto"; (如果没有配置 otg-mode 属性, 默认也是 Auto 模式) id-gpios 属性必须配置。 vbus-en-gpiosdp-sw-gpios 属性根据硬件配置选配。 OTG 驱动根据 id-gpios 管脚的电平变化 自动切换 USB 工作模式为 Host / Device
Force otg-mode = "device"; 或者 otg-mode = "host"; id-gpios 属性不需要配置。 vbus-en-gpiosdp-sw-gpios 属性根据硬件配置选配。 需要配置文件节点来手工切换: echo devices > /sys/devices/platform/soc/soc\:usb-otg/otg_mode 或者 echo host > /sys/devices/platform/soc/soc\:usb-otg/otg_mode

OTG 相关 GPIO

从上面配置可以看到和 OTG 功能相关的 GPIO 管脚有 3 个:

  • id-gpios 。用来检测当前插入的是不是 OTG 线,如果为 OTG 线则需要把本机切换到 USB Host 模式,否则本机切换到 USB Device 模式。该管脚在 Auto 模式 模式下是必须配置的,如果缺少该管脚 OTG 只能工作在 Manual 模式手工进行切换。

  • vbus-en-gpios 。该管脚是用来控制 VBUS 的 5V 输出的,通常情况下:切换到 USB Host 模式时需要使能本机端的 VBUS 5V 输出给对端 Device 供电,切换到 USB Device 模式时需要关闭本机端的 VBUS 5V 输出转而对端 Host 的供电。(实际使用上来说,不论本端是 Host/Device 模式,也可以在 VBUS 上一直供电 5V 两边 VBUS 无压差则无漏电,这种情况下 vbus-en-gpios 无需配置。)

  • dp-sw-gpios 。该管脚是在 OTG 外出两个独立 Host、Device 端口时,用来控制外部 Switch 的。非该模式时, dp-sw-gpios 无需配置。


    image2

3 个 GPIO 管脚的具体使用场景如上图所示,用户根据自己的使用场景来选择配置哪些 GPIO。每个 GPIO 的 输入输出正反电平有效,可以通过 menuconfig 菜单中的 GPIO polarity 选项来配置。

USB Host/Device 配置

在 OTG 模式下 CherryUSB 的 Device Mode 和 Host Mode 都必须使能,并且需要配置上相应应用。下图实例使能了 Host U 盘 和 Device MSC RAM disk 设备:
> Local packages options
   > Third-party packages options
       [*] CherryUSB: tiny and portable USB host/device stack for embedded system with USB IP  --->
           [*]   Enable usb otg mode  --->
           [*]   Enable usb device mode  --->
               [*]   Enable usb msc device  --->
                   Use ram or storage template (msc ram)  --->
           [*]   Enable usb host mode  --->
               [*]   Enable usb msc driver  --->
                   [*]   Use msc template