介绍

通用串行总线即插即用(USB OTG)最初由 Linux USB 子系统支持,结合 Realtek 专门设计的 USB PHY 驱动程序以及对 DWC2 USB 控制器驱动程序的一些修改。

架构

USB 软件架构如下图所示。

../../rst_linux/7_usb/figures/usb_software_architecture.svg

实现

原始 USB 由 Linux USB 子系统支持。

文件

描述

<linux>/drivers/usb/dwc2/

由Realtek修改的DWC2主机和设备控制器驱动程序

<linux>/drivers/usb/core/

HCD 核心

<linux>/drivers/usb/gadget/

Gadget 核心

<linux>/drivers/usb/gadget/function/

设备类,例如ADB、CDC ACM、HID、MSC等。

<linux>/drivers/usb/class/cdc-acm.*

CDC ACM 主机类

<linux>/drivers/usb/storage/*

MSC 主机类

参考 usb system v5.4 或者 usb system v6.6 获取 USB 子系统的更多细节。

Realtek USB PHY 驱动程序实现为以下文件:

文件

描述

<linux>/drivers/rtkdrivers/usb_phy/Kconfig

USB PHY 驱动器 Kconfig

<linux>/drivers/rtkdrivers/usb_phy/Makefile

USB PHY 驱动器 Makefile

<linux>/drivers/rtkdrivers/usb_phy/phy-rtk-usb.c

USB PHY 函数

<linux>/drivers/rtkdrivers/usb_phy/phy-rtk-usb.h

USB PHY 接口声明

配置

设备树配置

USB PHY 设备树配置

USB PHY 的设备树节点在 <dts>/rtl8730e-ocp.dtsi 中定义:

usb_phy: usb-phy@41000000 {
   compatible = "realtek,otg-phy";
   reg = <0x400B0000 0x20>,
   <0x41000060 4>,
   <0x42000100 0x10>,
   <0x4200825C 4>;
   #phy-cells = <0>;
   clocks = <&rcc RTK_CKE_USB>;
   rtk,cal-data = <0x00 0xE0 0x9D>,
      <0x00 0xE1 0x19>,
      <0x00 0xE2 0xDB>,
      <0x00 0xE4 0x68>,
      <0x01 0xE5 0x0A>,
      <0x01 0xE6 0xD8>,
      <0x02 0xE7 0x52>,
      <0x01 0xE0 0x04>,
      <0x01 0xE0 0x00>,
      <0x01 0xE0 0x04>;
   rtk,usb-phandle = <&usb>;
   rtk,usb-force-role-en = <1>;
   status = "okay";
};

USB PHY 的设备树配置如下所列:

属性

描述

可配置?

compatible

用于将 Realtek USB PHY 驱动程序与 USB PHY 设备匹配的 ID。

reg

USB PHY 寄存器资源

#phy-cells

指示需要多少个单元来专门描述一个 USB PHY,仅一个 USB PHY 时固定为 0。

clocks

USB PHY 的时钟源

rtk,cal-data

USB PHY 的校准数据

rtk,usb-phandle

USB PHY 的 USB 指针句柄

rtk,usb-force-role-en

启用在 USB 主机模式和设备模式之间强制切换。

1/0

status

USB PHY 状态

disabled/okay

默认情况下,USB PHY 节点是启用的。要禁用它,可以在更高级别的设备树文件中通过节点引用将节点状态覆盖为 disabled,例如芯片特定的设备树文件或电路板特定的设备树文件:

&usb_phy{
   status = "disabled";
};

USB 设备树配置

USB 的设备树节点在 <dts>/rtl8730e-ocp.dtsi 中定义:

usb: usb@40080000 {
   compatible = "realtek,dwc-otg";
   reg = <0x40080000 0x20000>;
   interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
   g-rx-fifo-size = <512>;
   g-np-tx-fifo-size = <256>;
   g-tx-fifo-size = <128 120>;
   status = "okay";
   endpoints {
      ep1in {
         ep_name = "ep1in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep2out {
         ep_name = "ep2out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep3in {
         ep_name = "ep3in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep4out {
         ep_name = "ep4out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep5in {
         ep_name = "ep5in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep5out {
         ep_name = "ep5out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
   };
};

USB 的设备树配置如下所示:

属性

描述

可配置?

compatible

用于将 DWC2 控制器驱动与 USB OTG 设备匹配的 ID。

reg

USB 寄存器资源

interrupts

USB 的 GIC 中断

g-rx-fifo-size

USB 设备的周期性接收 FIFO 大小(单位:DWORDS)。

16~512

g-np-tx-fifo-size

USB 设备的非周期性传输 FIFO 大小(单位:DWORDS)。

16~256

g-tx-fifo-size

在专用 FIFO 模式下的 TX FIFO 大小数组。每个值对应一个起始端点(单位:DWORDS)。Realtek USB 在共享 FIFO 模式下工作,因此此配置将被忽略。

16~256

status

USB 设备状态

disabled/okay

endpoints

允许 USB 端点地址配置以满足特定客户需求。

备注

  • 总数据 FIFO 深度为 1016,这意味着 \(g-rx-fifo-size + g-np-tx-fifo-size + g-tx-fifo-size\) 的结果不应大于 1016。

  • 除非确有必要,否则不要更改默认配置。

USB 节点默认是启用的。要禁用它,可以在更高级别的设备树文件中,通过节点引用将节点状态覆盖为 disabled,例如芯片特定的设备树文件或板子特定的设备树文件:

&usb{
   status = "disabled";
};

编译配置

USB 功能可以配置为内核固件中的内置功能或独立的内核模块。

内置编译配置

将 USB 功能编译到内核固件中:

  1. Device Drivers > Drivers for Realtek > USB PHY driver 选择 Y

    ../../rst_linux/7_usb/figures/select_y_for_usb_phy_driver.png
  2. Device Drivers > USB support 选择 Y

    ../../rst_linux/7_usb/figures/select_y_for_usb_support.png
  3. 选择所需的 USB 模式。

    1. 对于 USB 主机模式,在 Device Drivers > USB support > Support for Host-side USB 选择 Y

    2. 对于 USB 设备模式,在 Device Drivers > USB support > USB Gadget Support 选择 Y

    3. 对于 USB 即插即用模式,在 Device Drivers > USB support > Support for Host-side USBDevice Drivers > USB support > USB Gadget Support 中都选择 Y

    ../../rst_linux/7_usb/figures/select_required_usb_mode.png
  4. Device Drivers > USB support > DesignWare USB2 DRD Core Support 选择 Y

    ../../rst_linux/7_usb/figures/select_y_for_designware_usb2_drd_core_support.png
  5. 检查 DWC2 模式选择。

    1. 对 USB 主机模式,在 Host only mode 选择 Y

    2. 对 USB 设备模式,在 Gadget only mode 选择 Y

    3. 对 USB 即插即用模式,在 Dual Role mode 选择 Y

    ../../rst_linux/7_usb/figures/check_dwc2_mode_selection.png
  6. 选择所需类别的配置,详情请参阅以下部分。

模块配置

要将 USB 功能编译为内核模块:

  1. Device Drivers > Drivers for Realtek > USB PHY driver 选择 M

    ../../rst_linux/7_usb/figures/select_m_for_usb_phy_driver_module.png
  2. Device Drivers > USB support 选择 Y

    ../../rst_linux/7_usb/figures/select_y_for_usb_support.png
  3. 选择所需的 USB 模式。

    1. 对于主机模式,在 Device Drivers > USB support > Support for Host-side USB 选择 M

    2. 对于设备模式,在 Device Drivers > USB support > USB Gadget Support 选择 M

    3. 对于即插即用模式,在 Device Drivers > USB support > Support for Host-side USBDevice Drivers > USB support > USB Gadget Support 全都选择 M

    ../../rst_linux/7_usb/figures/select_required_usb_mode.png
  4. Device Drivers > USB support > DesignWare USB2 DRD Core Support 选择 M

    ../../rst_linux/7_usb/figures/select_m_for_designWare_usb2_drd_core_support.png
  5. 检查 DWC2 模式选择。

    1. 对 USB 主机模式,在 Host only mode 选择 Y

    2. 对 USB 设备模式,在 Gadget only mode 选择 Y

    3. 对 USB 即插即用模式,在 Dual Role mode 选择 Y

    ../../rst_linux/7_usb/figures/check_dwc2_mode_selection.png
  6. 选择所需类别的配置,详情请参阅以下部分。

  7. 在运行时载入内核模块。

    这里的 <kernel_ver> 取决于内核版本,例如 5.4.63。

    1. 对于主机模式,输入以下命令序列以在加载任何 USB 类特定模块之前加载 USB 通用主机驱动程序:

      insmod /lib/modules/<kernel_ver>/kernel/drivers/rtkdrivers/usb_phy/phy-rtk-usb.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/common/usb-common.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/core/usbcore.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/dwc2/dwc2.ko
      
    2. 对于设备模式,输入以下命令序列以在加载任何 USB 类特定模块之前加载 USB 通用设备驱动程序:

      insmod /lib/modules/<kernel_ver>/kernel/drivers/rtkdrivers/usb_phy/phy-rtk-usb.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/common/usb-common.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/udc/udc-core.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/libcomposite.ko
      insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/dwc2/dwc2.ko
      

USB 主机用途

在 USB 主机模式下,USB OTG 可以枚举已连接的 USB 设备并启动 USB 传输。

本节仅描述了几个主机类的使用,更多信息请参阅 usb v5.4 或者 usb v6.6.

CDC ACM 类

配置

除了通用的 USB 主机配置之外,还需要额外的配置来支持 USB CDC ACM 类驱动程序,用户可以选择将其配置为内置功能或独立的内核模块。

以下配置提供了支持典型 CDC ACM 设备(如 USB 串口)的示例。

根据需要调整配置。

内置编译配置

进入 USB support 菜单,输入 Y 选择 USB Modem (CDC ACM) supportUSB Serial Converter support 选项:

../../rst_linux/7_usb/figures/type_y_usb_modem_support.png

模块配置

  1. 进入 USB support 菜单,输入 M 选择 USB Modem (CDC ACM) supportUSB Serial Converter support 选项:

    ../../rst_linux/7_usb/figures/type_m_usb_modem_support.png
  2. 在加载常用 USB 主机模块后,加载 CDC ACM 类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/class/cdc-acm.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/serial/usbserial.ko
    

应用的 APIs

请参考 usb guide x332

用途

一旦配置为 CDC ACM 主机,SoC 将识别连接的 CDC ACM 设备为 TTY 设备,并能够通过 TTY 接口与 CDC ACM 设备进行通信。

  1. 将 CDC ACM 设备通过 USB 电缆连接到 SoC,控制台上将打印以下日志:

    dwc2 40080000.usb: Set speed to high-speed
    usb 1-1: new high-speed USB device number 2 using dwc2
    dwc2 40080000.usb: Set speed to high-speed
    cdc_acm 1-1:1.0: ttyACM0: USB ACM device
    
  2. 通过设备节点 /dev/ttyACM0 与 CDC ACM 设备通信,例如:

    1. 向 CDC ACM 设备发送数据:

      echo helloworld > /dev/ttyACM0
      
    2. 从 CDC ACM 设备接收数据:

      cat /dev/ttyACM0
      

请参考 <sdk>/tests/usbh_cdc_acm 以获取 CDC ACM 主机演示。

大容量存储类

配置

除了常见的 USB 主机配置外,还需要额外的配置来支持 USB 大容量存储类驱动程序,用户可以选择将其配置为内置功能或独立的内核模块。

以下配置提供了一个示例来支持典型的大容量存储设备:使用瑞昱读卡器解决方案的 UDISK,并格式化为 FAT32 文件系统。

USB 大容量存储类驱动程序所需的常见配置:

  1. Device Drivers > SCSI device support > SCSI device supportDevice Drivers > SCSI device support > SCSI disk support

    ../../rst_linux/7_usb/figures/scsi_device_disk_support.png
  2. File systems > DOS/FAT/NT Filesystems > VFAT (Windows-95) fs support

    ../../rst_linux/7_usb/figures/vfat_windows_95_fs_support.png
  3. File systems > Native language support > Codepage 437(United States, Canada)File systems > Native language support > NLS ISO 8859-1 (Latin 1; Western European Languages)`

    ../../rst_linux/7_usb/figures/codepage_437.png
    ../../rst_linux/7_usb/figures/nls_ios_8859_1.png

根据需要调整配置。

内置编译配置

进入 USB support 菜单,输入 Y 选择 USB Mass Storage supportRealtek Card Reader support 选项:

../../rst_linux/7_usb/figures/type_y_usb_mass_storage_support.png

模块配置

  1. 进入 USB support 菜单,输入 M 选择 USB Mass Storage support 然后是 Realtek Card Reader support 选项:

    ../../rst_linux/7_usb/figures/type_m_usb_mass_storage_support.png
  2. 在加载通用 USB 主机模块后,加载大容量存储类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/storage/usb-storage.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/storage/ums-realtek.ko
    

应用 APIs

请参考 usb guide x498

用途

以下是使用支持的 UDISK 测试 USB 主机大容量存储驱动程序的示例。

  1. 将 UDISK 连接到 SoC,控制台将输出以下日志。

    usb 1-1: USB disconnect, device number 2
    dwc2 40080000.usb: Set speed to high-speed
    usb 1-1: new high-speed USB device number 3 using dwc2
    dwc2 40080000.usb: Set speed to high-speed
    usb-storage 1-1:1.0: USB Mass Storage device detected
    scsi host0: usb-storage 1-1:1.0
    scsi 0:0:0:0: Direct-Access TOSHIBA USB FLASH DRIVE PMAP PQ: 0 ANSI: 6
    sd 0:0:0:0: [sda] 30253056 512-byte logical blocks: (15.5 GB/14.4 GiB)
    sd 0:0:0:0: [sda] Write Protect is off
    sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
    sda: sda1
    sd 0:0:0:0: [sda] Attached SCSI removable disk
    
  2. 挂载 UDISK 设备。

    mkdir /mnt/udisk
    mount -t vfat /dev/sda1 /mnt/udisk
    
  3. 访问 UDISK 设备。创建一个文件并进行读写操作。

    cd /mnt/udisk
    echo hello >> test.txt
    cat test.txt
    hello
    
  4. 卸载 UDISK 设备。

    umount /mnt/udisk
    
  5. 断开 UDISK 设备连接。

    usb 1-1: USB disconnect, device number 2
    

UVC 类

配置

除了常见的 USB 主机配置,支持 USB UVC 类驱动程序需要额外的配置,并且用户可以选择将其配置为内置功能或独立的内核模块。

以下配置提供了一个支持典型 UVC 设备(如 UVC 摄像头)的示例。

UVC 摄像头所需的常见配置,在 SDK 中默认选中:

  1. Device Drivers > Multimedia support

    ../../rst_linux/7_usb/figures/multimedia_support.png
  2. Device Drivers > Multimedia support > Cameras/video grabbers support, Media Controller API, V4L2 sub-device userspace API, Media USB Adapters

    ../../rst_linux/7_usb/figures/options_in_multimedia_support.png

内置编译配置

进入 Media USB Adapters 输入 Y 选择 USB Video Class (UVC)

../../rst_linux/7_usb/figures/y_for_usb_video_class.png

模块配置

  1. 进入 Media USB Adapters 输入 M 选择 USB Video Class (UVC)

    ../../rst_linux/7_usb/figures/m_for_usb_video_class.png
  2. 在加载常见的 USB 主机模块后,加载有关 UVC 类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/media/usb/uvc/uvcvideo.ko
    

应用 APIs

它将 UVC 设备视为 V4L2 设备。请参阅 linux video 以获取有关 V4L2 API 的更多信息。

用途

以下是典型 UVC 设备(如 USB 摄像头)的简单用法示例:

一旦 USB 摄像头插入 USB 电缆,控制台上将打印以下日志。

dwc2 40080000.usb: Set speed to high-speed
usb 1-1: new high-speed USB device number 2 using dwc2
dwc2 40080000.usb: Set speed to high-speed
uvcvideo: Found UVC 1.00 device USB Camera (0bda:5842)
input: USB Camera: USB Camera as /devices/platform/ocp/40080000.usb/usb1/1-1/1-1:1.0/input/input1

用户可以使用带有 V4L2 库 API 的 IOCTL 访问 USB 摄像头。

<sdk>/tests/usbh_uvc 目录下找到 UVC 演示,这是一个从 UVC 摄像头捕获图像并将其保存到 SD 卡的示例。

备注

在运行 UVC 演示之前,应先挂载 SD 卡。

供应商类

供应商类是为用户设计的,用于开发自定义的 USB 主机类。

配置

除了常见的 USB 主机配置外,还需要额外的配置来支持 USB 供应商类驱动程序,用户可以选择将其配置为内置功能或独立的内核模块。

内置编译配置

输入 Y 选择 USB 测试驱动:

../../rst_linux/7_usb/figures/y_for_usb_testing_driver.png

模块配置

  1. 输入 M 选择 USB 测试驱动:

    ../../rst_linux/7_usb/figures/m_for_usb_testing_driver.png
  2. 在加载常见的 USB 主机模块后,加载有关供应商类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/misc/usbtest.ko
    

应用 APIs

无。

用途

<sdk>/tests/usbh_vendor 目录下找到用于用户空间的 USB 主机供应商示例。

USB 小工具使用

在 USB 小工具模式下,USB OTG 可以被连接的 USB 主机枚举,并响应 USB 传输请求。

USB 小工具类有两种配置模式:

  • Configfs 模式:通过 configfs 配置 USB 小工具功能。

  • 传统模式:USB 小工具的预设配置。

本节采用 configfs 模式。

本节仅描述了几个设备类的使用,更多信息请参考 usb support v5.4usb support v6.6

CDC ACM 类

配置

除了常见的 USB 设备配置外,还需要额外的配置来支持 USB CDC ACM 类,用户可以选择将其配置为内建功能或独立的内核模块。

内置编译配置

在 USB 小工具支持中输入 Y 以选择以下选项:

  • 通过 configfs 可配置的 USB 小工具功能

  • 串口小工具控制台支持

  • 抽象控制模型 (CDC ACM)

    ../../rst_linux/7_usb/figures/cdc_acm_built_in_configuration_options_usb_gadget_support.png

模块配置

  1. 在 USB 小工具支持中选择以下选项:

    • 输入 M 选择 USB Gadget functions configurable through configfs

    • 输入 Y 选择 Serial gadget console support

    • 输入 Y 选择 Abstract Control Model (CDC ACM)

    ../../rst_linux/7_usb/figures/cdc_acm_module_configuration_options_usb_gadget_support.png
  2. 在加载通用 USB 设备模块后,加载有关 CDC ACM 类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/u_serial.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/usb_f_acm.ko
    

应用 APIs

请参考 usb guide

用途

这是将板子设置为 CDC ACM 设备的示例。

  1. 通过 USB 数据线将板子连接到 PC。

  2. 在板子的控制台中运行以下命令。

    mkdir /mnt/config
    mount none /mnt/config -t configfs
    cd /mnt/config/usb_gadget
    mkdir cdc && cd cdc
    echo 0x0200 > bcdUSB
    echo 0x02 > bDeviceClass
    echo 0x02 > bDeviceSubClass
    echo 64 > bMaxPacketSize0
    echo 0x8730 > idProduct
    echo 0x0BDA > idVendor
    mkdir strings/0x409
    echo "Realtek" > strings/0x409/manufacturer
    echo "VCOM" > strings/0x409/product
    echo "123456789AB" > strings/0x409/serialnumber
    mkdir configs/c.1
    echo 120 > configs/c.1/MaxPower
    mkdir configs/c.1/strings/0x409
    echo "acm" > configs/c.1/strings/0x409/configuration
    mkdir functions/acm.ttyS1
    ln -s functions/acm.ttyS1 configs/c.1/
    echo 40080000.usb > UDC
    
  3. 在 PC 上找到正确的 COM 端口,并打开它。

  4. 从板子向 PC 的 COM 端口发送 12345

    在板子控制台中输入命令:

    echo 12345 > /dev/ttyGS0
    

    PC 的 COM 端口将接收到字符串 12345

  5. 从 PC 的 COM 端口接收字符串。

    在板子控制台输入命令:

    cat /dev/ttyGS0
    

    从 PC 的 COM 端口发送字符串 12345 ,然后板子将接收到字符串 12345

备注

Win7 不能直接驱动 CDC ACM 设备。需要安装特定驱动程序: <sdk>/tools/image_tool/RtkUsbCdcAcmSetup.INF 。并且此驱动程序中的 PID / VID 应该与 CDC ACM 设备描述符一致。

备注

如果 PC COM 无法打开,请在 <linux>/drivers/usb/gadget/function/f_acm.c 中注释以下代码以临时解决问题:

static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value,
void *data, unsigned length)
{
   /* ep_queue() can complete immediately if it fills the fifo... */
   spin_unlock(&acm->lock);
   //status = usb_ep_queue(ep, req, GFP_ATOMIC);
   spin_lock(&acm->lock);
}

HID 类

配置

除了常见的 USB 设备配置外,还需要额外的配置来支持 USB HID 类,并且用户可以选择将其配置为内置功能或独立的内核模块。

确保选择了 HID bus supportGeneric HID driver

../../rst_linux/7_usb/figures/hid_bus_support_generic_hid_driver.png

实际上,上述配置在 SDK 中默认启用以支持 ADB。

内置编译配置

  1. 在 USB 小工具支持中输入 Y 以选择以下选项:

    • 可通过 configfs 配置的 USB Gadget 功能

    • 串行设备控制台支持

    • HID 功能

    ../../rst_linux/7_usb/figures/hid_built_in_configuration_options_usb_gadget_support.png

模块配置

  1. 在 USB 小工具支持中选择下列项目:

    • 输入 M 选择 USB Gadget functions configurable through configfs

    • 输入 Y 选择 HID function

    ../../rst_linux/7_usb/figures/hid_module_configuration_options_usb_gadget_support.png
  2. 在加载通用 USB 设备模块后加载有关 HID 类的内核模块:

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/udc-core.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/usb_f_hid.ko
    

应用 APIs

请参考 usb guide x498

用途

这里有一个将板子设置为 HID 鼠标设备的示例。

  1. 配置 USB 设备:

    mkdir /mnt/config
    mount none /mnt/config -t configfs
    cd /mnt/config/usb_gadget
    mkdir hid
    cd hid
    echo 0x0200 > bcdUSB
    echo 0x03 > bDeviceClass
    echo 0x00 > bDeviceSubClass
    echo 64 > bMaxPacketSize0
    echo 0x8730 > idProduct
    echo 0x0BDA > idVendor
    mkdir strings/0x409
    echo "Realtek" > strings/0x409/manufacturer
    echo "HID" > strings/0x409/product
    echo "123456789AB" > strings/0x409/serialnumber
    mkdir configs/c.1
    echo 120 > configs/c.1/MaxPower
    mkdir configs/c.1/strings/0x409
    echo "Primary configuration" > configs/c.1/strings/0x409/configuration
    
  2. 配置 HID 报告描述符:

    mkdir functions/hid.usb0
    echo 1 > functions/hid.usb0/subclass
    echo 2 > functions/hid.usb0/protocol
    echo 4 > functions/hid.usb0/report_length
    echo -ne\\x05\\x01\\x09\\x02\\xa1\\x01\\x09\\x01\\xa1\\x00\\x05\\x09\\x19\\x01\\x29\\x03\\x15\\x00\\x25\\x01\\x95\\x03\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x05\\x81\\x03\\x05\\x01\\x09\\x30\\x09\\x31\\x09\\x38\\x15\\x81\\x25\\x7f\\x75\\x08\\x95\\x03\\x81\\x06\\xc0\\xc0> functions/hid.usb0/report_desc
    ln -s functions/hid.usb0 configs/c.1/
    echo 40080000.usb > UDC
    

一旦将板子连接到 HID 主机后,可以使用接口 /dev/hidg0 与主机进行通信。以下是一个示例,使光标向右和向下移动 0x40 像素:

echo -ne "\0\x40\x40\0" > /dev/hidg0

以下是鼠标协议。

BYTE0
|-- bit7~bit3: RSVD
|-- bit2: middle button press
|-- bit1: right button press
|-- bit0: left button press
BYTE1: x-axis value, -128~127
BYTE2: y-axis value, -128~127
BYTE3: wheel value, -128~127

大容量存储类

配置

除了常见的 USB 设备配置外,还需要额外的配置来支持 USB 大容量存储类,用户可以选择将其配置为内置功能或独立的内核模块。

内置编译配置

  1. 在 USB 小工具支持中键入 Y 以选择以下选项:

    • 通过 configfs 可配置的 USB Gadget 功能

    • 大容量存储

    ../../rst_linux/7_usb/figures/mass_storage_built_in_configuration_options_usb_gadget_support.png

模块配置

  1. 在 USB Gadget 支持中选择以下项目:

    • 输入 M 选择 USB Gadget functions configurable through configfs

    • 输入 Y 选择 Mass storage

    ../../rst_linux/7_usb/figures/mass_storage_module_configuration_options_usb_gadget_support.png
  2. 在加载通用 USB 设备模块后,加载关于 MSC 类的内核模块。

insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/udc-core.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/libcomposite.ko

应用 APIs

请参考 usb guide x498

用途

将开发板设置为 USB Gadget 大容量存储设备的示例,使用 SD 卡作为存储介质:

  1. 配置开发板的 SD 卡,详情请参考 SDIO 主机章节。

  2. 将开发板连接到电脑。

  3. 在开发板控制台中运行以下命令。

    mkdir /mnt/config
    mount none /mnt/config -t configfs
    cd /mnt/config/usb_gadget
    mkdir msc && cd msc
    echo 0x0200 > bcdUSB
    echo 0x8730 > idProduct
    echo 0x0BDA > idVendor
    mkdir strings/0x409
    echo "Realtek" > strings/0x409/manufacturer
    echo "MSC" > strings/0x409/product
    echo "123456789AB" > strings/0x409/serialnumber
    mkdir configs/c.1
    echo 120 > configs/c.1/MaxPower
    mkdir configs/c.1/strings/0x409
    echo "mass_storage" > configs/c.1/strings/0x409/configuration
    mkdir functions/mass_storage.0
    echo /dev/mmcblk0 >functions/mass_storage.0/lun.0/file
    echo 1 > functions/mass_storage.0/lun.0/removable
    echo 0 > functions/mass_storage.0/lun.0/nofua
    ln -s functions/mass_storage.0 configs/c.1/
    echo 40080000.usb > UDC
    

该开发板将在电脑上被识别为 UDISK。

供应商类

供应商类旨在供用户开发自定义的 USB 设备类。

配置

除了常见的 USB 设备配置外,还需要额外的配置来支持 USB 供应商类驱动程序。用户可以选择将其配置为内建功能或独立的内核模块。

内置编译配置

  1. 在 USB 小工具支持中输入 Y 以选择以下选项:

    • 通过 configfs 可配置的 USB Gadget 功能

    • 回环和源接收功能(用于测试)

    ../../rst_linux/7_usb/figures/vendor_built_in_configuration_options_usb_gadget_support.png

模块配置

  1. 在 USB 小工具支持中选择以下选项:

    • 输入 M 选择 USB Gadget functions configurable through configfs

    • 输入 Y 选择 Loopback and sourcesink function (for testing)

    ../../rst_linux/7_usb/figures/vendor_module_configuration_options_usb_gadget_support.png
  2. 在加载通用 USB 设备模块之后,加载有关供应商类的内核模块。

    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/udc-core.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/usb_f_ss_lb.ko
    insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/function/libcomposite.ko
    

应用 APIs

无。

用途

以下是测试 USB 小工具供应商类的步骤:

  1. 在板载控制台中运行以下命令。

    mkdir /mnt/config
    mount none /mnt/config -t configfs
    cd /mnt/config/usb_gadget
    mkdir vendor && cd vendor
    echo 0x0200 > bcdUSB
    echo 0xa4a0 > idProduct
    echo 0x0525 > idVendor
    mkdir strings/0x409
    echo "Realtek" > strings/0x409/manufacturer
    echo "Vendor" > strings/0x409/product
    echo "123456789AB" > strings/0x409/serialnumber
    mkdir configs/c.1
    mkdir configs/c.2
    echo 120 > configs/c.1/MaxPower
    echo 120 > configs/c.2/MaxPower
    mkdir configs/c.1/strings/0x409
    mkdir configs/c.2/strings/0x409
    echo "vendor1" > configs/c.1/strings/0x409/configuration
    echo "vendor2" > configs/c.2/strings/0x409/configuration
    mkdir functions/SourceSink.0
    mkdir functions/Loopback.0
    ln -s functions/SourceSink.0 configs/c.1/
    ln -s functions/Loopback.0 configs/c.2/
    echo 40080000.usb > UDC
    

备注

由于供应商类是复合设备,因此:

  • ln -s functions/SourceSink.0 configs/c.1/ 表示默认功能是 sourcesink。

  • ln -s functions/Loopback.0 configs/c.1/ 表示默认功能是 loopback。

  1. 将板子连接到 USB 主机供应商。

  2. 主机供应商和设备供应商相互测试。

    功能

    配置设定

    主机控制台命令

    设备控制台命令

    loopback

    ln -s functions/Loopback.0 configs/c.1/

    testusb -a -c1 -t30 -s256 -g32 -v1

    无需命令

    sourcesink

    ln -s functions/SourceSink.0 configs/c.1/

    testusb -a -c1 -tx -s256 -g32 -v1

    无需命令

备注

对于主机测试驱动程序,案例 30 用于测试环回功能,因此主机命令 -t30 不能更改,其他参数可以由用户修改。案例 0~29 用于测试源汇功能,所以使用 -tx ,其中 x 表示 0~29 之间的一个数字。