【SemiDrive G9H】【PTG5.1】: G9 实现获取 USB 的 OTG 功能

一、概述

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盘,方便演示。

usb1


三、代码修改

路径:/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 系列的文章,感兴趣的可以在评论区评论或者关注。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论