USB(通用串行总线)是一种用于连接计算机和外部设备的通用接口标准。USB接口分为两种角色:设备(device)和主机(host)。USB OTG(On-The-Go)是一种USB接口的扩展功能,它允许设备在主机和设备之间切换角色,即在需要时可以充当USB主机或USB设备。
USB OTG功能的主要特点包括:
1、主机模式(Host Mode):在主机模式下,USB OTG设备可以充当USB主机,与其他USB设备进行通信。它可以连接外部USB设备,如键盘、鼠标、打印机等,并与它们进行数据传输和控制。
2、设备模式(Device Mode):在设备模式下,USB OTG设备可以充当USB设备,与其他USB主机进行通信。它可以连接到计算机或其他USB主机,并与它们进行数据传输和控制。
3、自动切换:USB OTG设备可以根据需要自动切换角色。当连接到USB主机时,它会自动切换到设备模式,充当USB设备。当连接到USB设备时,它会自动切换到主机模式,充当USB主机。
4、电源供应:USB OTG设备可以在主机模式下向连接的USB设备提供电源供应,使得USB设备无需额外的电源适配器即可工作。
5、数据传输:USB OTG设备可以在主机模式和设备模式下进行数据传输。它可以发送和接收数据,如文件、音频、视频等。
这里主要介绍 SD012_G9H_REF_A02_(域控套件)_11 的 USB OTG 功能实现,用到的是 SDK 是 PTG5.1。
二、模块介绍
如图,G9H 有两个 USB3.0 接口,这里分别接了两个 U盘,方便演示。
三、代码修改
路径:/buildsystem/yocto/source/linux/arch/arm64/boot/dts/semidrive/g9h.dtsi
sdrv,scr_opmode = <SCR_SEC__spi8_i_opmode>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; };
usbdrd3_0: usb3@31220000 { compatible = "semidrive,dwc3"; #address-cells = <2>; #size-cells = <2>; ranges; clocks = <&HIS_BUS_2_USB1>, <&HIS_BUS_3_USB1>; clock-names = "axi_clk", "apb_clk"; status = "disabled";
usb0: dwc3 { compatible = "snps,dwc3"; reg = <0x0 0x31220000 0x0 0x20000>; interrupts = <0 72 4>; - dr_mode = "peripheral"; + dr_mode = "otg"; phy_type = "utmi_wide"; phys = <&usbdrd_phy0 0>; phy-names = "usb3-phy"; snps,dis_u3_susphy_quirk; maximum-speed = "high-speed"; + extcon = <&usb3_id0>; status = "disabled"; }; };
usbdrd_phy0: phy@31240000 { compatible = "semidrive,usb-phy"; reg = <0x0 0x31240000 0x0 0x20000>; #phy-cells = <1>; }; + usb3_id0: usb3-id0 { + compatible = "linux,extcon-usb-gpio"; + no_id_gpio_quirk; + };
usbdrd3_1: usb3@31260000 { compatible = "semidrive,dwc3"; #address-cells = <2>; #size-cells = <2>; ranges; clocks = <&HIS_BUS_2_USB2>, <&HIS_BUS_3_USB2>; clock-names = "axi_clk", "apb_clk"; status = "disabled";
usb1: dwc3 { compatible = "snps,dwc3"; reg = <0x0 0x31260000 0x0 0x20000>; interrupts = <0 75 4>; - dr_mode = "host"; + dr_mode = "otg"; phy_type = "utmi_wide"; phys = <&usbdrd_phy1 0>; phy-names = "usb3-phy"; snps,dis_u3_susphy_quirk; + extcon = <&usb3_id1>; status = "disabled"; }; };
usbdrd_phy1: phy@31280000 { compatible = "semidrive,usb-phy"; reg = <0x0 0x31280000 0x0 0x20000>; #phy-cells = <1>; }; + usb3_id1: usb3-id1 { + compatible = "linux,extcon-usb-gpio"; + no_id_gpio_quirk; + }; |
四、验证
以 USB1 例,以下是需要用到的一下命令。
# 查看是否支持 OTG cat /proc/device-tree/soc/usb3@31220000/dwc3/dr_mode # 设置host模式 echo host > /sys/kernel/debug/31220000.dwc3/mode # 读取当前模式 cat /sys/kernel/debug/31220000.dwc3/mode # 设置device模式 echo device > /sys/kernel/debug/31220000.dwc3/mode # 读取当前模式 cat /sys/kernel/debug/31220000.dwc3/mode |
以下是验证 USB1/2 是否支持 OTG 模式。
以下是验证 USB1。
以下是验证 USB2。
五、参考文档
1、《SD012_G9H_REF_A02_SCH.pdf》
2、《G9_Processor_TRM_Rev01.01.pdf》
六、总结
以上步骤在 G9H 上实现了 USB 的 OTG 功能 。接下来将会更新更多关于 SemiDrive G9 系列的文章,感兴趣的可以在评论区评论或者关注。
评论