3. USB操作指南

3.1. 操作准备

USB 2.0 Host/Device的操作准备如下:

  • U-boot and Linux 内核使用SDK发布的U-boot 与 Kernel。

  • 文件系统可以使用本地文件系统ext4或squashfs,也可以使用NFS。

  • Shell script“run_usb.sh”. run_usb.sh使用内核的USB ConfigFS功能来客制化USB device装置.使用者可参考并修改run_usb.sh来变更PID/VID与function的相关参数. 详细操作可参考内核文件” linux/Documentation/usb/gadget_configfs.txt”。

3.2. Uboot操作过程

3.2.1. Uboot下USB Host配置

Uboot下只支持U盘和硬盘储存设备. USB host在uboot默认为关闭,须打开相关config。

步骤1. 打开uboot下USB相关的驱动:

在板级 U-Boot 配置文件中使能下列选项。配置文件路径一般为 build/boards/cv184x/板名/u-boot/cvitek_板名_defconfig 。 请将路径中的 板名 替换为实际板级目录名(例如 cv1842hp_wevb_0014a_emmc),具体以 SDK 为准。

CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_STORAGE=y
CONFIG_CMD_USB=y

若需更详细的 USB DWC2 调试日志(可选),可在同一 defconfig 中增加:

CONFIG_USB_DWC2_VERBOSE_DEBUG=y

3.2.2. Uboot下U盘

启动Uboot USB Host前的准备:

Uboot下USB Host不支持热插入,须在启动USB host前先插上设备. 若平台上有USB Hub,须确认Hub电源已打开,USB路径的Switch切到Host connector。

以cv184x为例(对应方法同样适用于cv181x):

平台上电,进入uboot命令行,输入命令: usb start,观察是否识别成功。

cv184x# usb start
starting USB...
Bus usb@04340000: USB DWC2
scanning bus usb@04340000 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found

若usb start后出现枚举报错或无法检测到设备,可在uboot命令行执行setenv usb_pgood_delay XXX,可针对预热较慢或是中间串了Hub的设备调整timeout值,建议取值范围为1000-3000。

识别完成后,再输入命令: usb tree,查看识别拓扑与速率。以下举例 USB host 串接 Hub 与 Mass Storage 设备。

cv184x# usb tree
USB device tree:
  1  Hub (480 Mb/s, 0mA)
  |   U-Boot Root Hub
  |
  +-2  Hub (480 Mb/s, 100mA)
    |
    +-3  Mass Storage (480 Mb/s, 500mA)
         Prolific Technology Inc. USB SD Card Reader      ABCDEF0123456789AB

也可执行 usb storage 查看当前识别的 USB 存储设备摘要:

cv184x# usb storage
  Device 0: Vendor:          Rev: 1.00 Prod: SD Card Reader
            Type: Removable Hard Disk
            Capacity: 960.0 MB = 0.9 GB (1966080 x 512)

初始化及应用:

识别完成后可进入以下操作。

步骤1. 查看设备信息

  • 命令行执行: usb info 可列出控制器上所有设备;执行 usb info [dev] 可查看指定设备号详情。

cv184x# usb info
1: Hub,  USB Revision 1.10
 -  U-Boot Root Hub
 - Class: Hub
 - PacketSize: 8  Configurations: 1
 - Vendor: 0x0000  Product 0x0000 Version 0.0
   Configuration: 1
   - Interfaces: 1 Self Powered 0mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

2: Hub,  USB Revision 2.0
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x058f  Product 0x6254 Version 1.0
   Configuration: 1
   - Interfaces: 1 Self Powered Remote Wakeup 100mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms

3: Mass Storage,  USB Revision 2.10
 - Prolific Technology Inc. USB SD Card Reader      ABCDEF0123456789AB
 - Class: (from Interface) Mass Storage
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x067b  Product 0x2731 Version 1.0
   Configuration: 1
   - Interfaces: 1 Bus Powered 500mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 2
     - Class Mass Storage, Transp. SCSI, Bulk only
     - Endpoint 1 Out Bulk MaxPacket 512
     - Endpoint 2 In Bulk MaxPacket 512

步骤2. FAT 文件系统列举与写入(可选)

  • 若 U 盘分区为 FAT,可使用 fatls 列举文件、fatwrite 写入文件。设备与分区号请按实际环境修改(下例为 usb 0 第一个分区 1)。

cv184x# fatls usb 0:1 /
            System Volume Information/
  2552840   boot.emmc
  9887872   cfg.emmc
 53395776   data.emmc
   555520   fip.bin
            temp/
   555520   fip_spl.bin
      991   partition_emmc.xml
  3593016   ramboot.itb
  5963904   rootfs.emmc
  4919424   system.emmc
   811136   yoc.bin
  2627628   boot.spinor
  1048704   data.spinor
      959   partition_spinor.xml
  2240512   rootfs.spinor
     7712   run_usb.sh
  1048576   test.bin

16 file(s), 2 dir(s)

cv184x# fatwrite usb 0:1 0x80000000 test2.bin 0x100000
1048576 bytes written in 369 ms (2.7 MiB/s)

cv184x# fatls usb 0:1 /
            System Volume Information/
  2552840   boot.emmc
  9887872   cfg.emmc
 53395776   data.emmc
   555520   fip.bin
            temp/
   555520   fip_spl.bin
      991   partition_emmc.xml
  3593016   ramboot.itb
  5963904   rootfs.emmc
  4919424   system.emmc
   811136   yoc.bin
  2627628   boot.spinor
  1048704   data.spinor
      959   partition_spinor.xml
  2240512   rootfs.spinor
     7712   run_usb.sh
  1048576   test.bin
  1048576   test2.bin

17 file(s), 2 dir(s)

步骤3. 对 U 盘进行读操作(FAT)

  • 分区为 FAT 时,可使用 fatload 将文件读入内存:fatload usb dev:part loadaddr filenamedev分区号loadaddrfilename 请按实际环境修改,示例如下:

cv184x# fatload usb 0:1 0x82000000 boot.spinor
2627628 bytes read in 272 ms (9.2 MiB/s)

步骤4. 对 U 盘进行写操作(FAT)

  • 分区为 FAT 时,可使用 fatwrite 从内存写入文件:fatwrite usb dev:part addr filename bytes。 示例如下(与步骤 2 中 fatwrite 用法一致):

cv184x# fatwrite usb 0:1 0x80000000 test2.bin 0x100000
1048576 bytes written in 369 ms (2.7 MiB/s)

3.3. linux Host

3.3.1. USB 2.0 Host 操作过程

步骤1. 内核配置

使能 USB Host 及 U 盘存储相关配置。配置文件路径一般为 build/boards/cv184x/板名/linux/板名_defconfig

CONFIG_USB_SUPPORT=y
CONFIG_USB=y
CONFIG_USB_DWC2=y
CONFIG_USB_GADGET=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_ROLE_SWITCH=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_USB_STORAGE=y

步骤2. 切换为 Host 模式

若板级通过 GPIO 控制 USB 供电或 Host/Device 切换,请根据硬件设计操作对应 GPIO。 本示例中开发板连接 Q3 三极管、断开 Q4 三极管,并连接 R127、R125。 例如使用 GPIO 450 打开 USB 供电,请根据实际情况拉高或拉低电平。

echo 450 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio450/direction
echo 1 > /sys/class/gpio/gpio450/value

将 OTG 控制器切到 Host 模式:

echo host > /proc/cviusb/otg_role
步骤3. 插入 U 盘

将 U 盘插入 USB 口,观察是否枚举成功。正常情况下串口打印类似:

[   72.061964] usb 1-1: new high-speed USB device number 2 using dwc2
[   72.315816] usb-storage 1-1:1.0: USB Mass Storage device detected
[   72.335934] scsi host0: usb-storage 1-1:1.0
[   73.363027] scsi 0:0:0:0: Direct-Access     Generic  STORAGE DEVICE   1532 PQ: 0 ANSI: 6
[   73.374407] sd 0:0:0:0: Attached scsi generic sg0 type 0
[   73.558597] sd 0:0:0:0: [sda] 30253056 512-byte logical blocks: (15.5 GB/14.4 GiB)
[   73.566961] sd 0:0:0:0: [sda] Write Protect is off
[   73.571922] sd 0:0:0:0: [sda] Mode Sense: 21 00 00 00
[   73.577899] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[   73.593961]  sda: sda1
[   73.602607] sd 0:0:0:0: [sda] Attached SCSI removable disk

sdXY 中 X 为磁盘号,Y 为分区号,请按实际环境修改。例如 log 中 sda1 表示 U 盘第一个分区; 多分区时会出现 sda1、sda2、sda3 等。

步骤4. 查看分区信息

运行 ls /dev 查看设备节点:

  • 若无 sdXY(如 sda1),表示尚未分区,需先用 fdisk /dev/sda 分区后再继续。

  • 若有 sdXY,表示已识别到 U 盘分区,可进行挂载与读写。

常用命令说明:

  • 分区操作设备节点为 sdX,示例: fdisk /dev/sda

  • 格式化分区 sdXY(如 FAT32): mkdosfs -F 32 /dev/sda1

  • 挂载分区 sdXY: mount /dev/sda1 /mnt

步骤5. 挂载 U 盘

挂载目标分区到目录(以 sda1 挂到 /mnt 为例):

mount /dev/sda1 /mnt
步骤6. 对 U 盘进行读写操作

挂载后即可按普通目录读写,例如:

# 查看 U 盘内容
ls /mnt

# 从 U 盘复制到当前目录(读)
cp /mnt/auto.sh ./

# 从当前目录复制到 U 盘(写)
cp ./data.bin /mnt/

# 使用完毕后同步并卸载
sync
umount /mnt

3.4. linux Device

3.4.1. 操作准备

使用 USB Device 前,需在设备树中确保 USB 控制器为 OTG 模式。在板级 DTS 文件中通过覆盖 usb 节点,将 dr_mode 设置为 "otg"

DTS 路径一般为 build/boards/cv184x/板名/dts_arm/板名.dts。在文件中添加或确认如下覆盖节点:

&usb {
    dr_mode = "otg";
};

修改后重新编译设备树并烧录至开发板。

3.4.2. 切换 switch GPIO

对于 EVB,会通过 switch IC 切换 Host 与 Device 通道,使用 USB 前需先操作对应 GPIO。请根据实际情况拉高或拉低电平。

echo 450 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio450/direction
echo 0 > /sys/class/gpio/gpio450/value

3.4.3. Device 作为存储设备的操作指南

  1. 内核配置 使能 USB Device 及 Mass Storage 相关配置,例如:

    CONFIG_USB_SUPPORT=y
    CONFIG_USB=y
    CONFIG_USB_DWC2=y
    CONFIG_USB_GADGET=y
    CONFIG_USB_CONFIGFS=y
    CONFIG_USB_LIBCOMPOSITE=y
    CONFIG_USB_ROLE_SWITCH=y
    CONFIG_USB_F_MASS_STORAGE=y
    CONFIG_USB_CONFIGFS_MASS_STORAGE=y
    
  2. 切换为 Device 模式

    • 参考本章 切换 switch GPIO 小节操作对应 GPIO。

    • 将 OTG 控制器切到 Device 模式:

      echo device > /proc/cviusb/otg_role
      
  3. 运行脚本 run_usb.sh 脚本位于板子 /etc 目录下:

    /etc/run_usb.sh probe msc /dev/mmcblk0p1
    /etc/run_usb.sh start
    

    mmcblkXY 表示第 X 个磁盘(eMMC 或 SD)的第 Y 个分区,请根据实际情况选择。

  4. 连接 USB 线 通过 USB 线将平台与 Host 相连,Host 即可将平台识别为 USB 存储设备,并在 /dev 下生成对应设备节点。

3.4.4. Device 作为终端设备的操作指南

  1. 内核配置 使能 USB Device 及 ACM/Serial 相关配置,例如:

    CONFIG_USB_SUPPORT=y
    CONFIG_USB=y
    CONFIG_USB_DWC2=y
    CONFIG_USB_GADGET=y
    CONFIG_USB_CONFIGFS=y
    CONFIG_USB_LIBCOMPOSITE=y
    CONFIG_USB_ROLE_SWITCH=y
    CONFIG_USB_F_ACM=y
    CONFIG_USB_CONFIGFS_ACM=y
    CONFIG_USB_G_SERIAL=y
    CONFIG_USB_U_SERIAL=y
    CONFIG_USB_F_SERIAL=y
    CONFIG_USB_CONFIGFS_SERIAL=y
    
  2. 切换为 Device 模式

    • 参考本章 切换 switch GPIO 小节。

    • 将 OTG 控制器切到 Device 模式:

      echo device > /proc/cviusb/otg_role
      
  3. 运行脚本 run_usb.sh 脚本位于板子 /etc 目录下:

    /etc/run_usb.sh probe acm
    /etc/run_usb.sh start
    
  4. 连接 USB 线 通过 USB 将平台与 Host 相连,Host 即可识别为 USB 终端设备,并生成设备节点 ttyACMX(X 为同类型终端编号)。Device 端 /dev 下会生成 ttyGSY(Y 为同类型终端编号)。Host 与 Device 可通过终端设备进行数据传输。

3.4.5. Device 作为 ADB 设备的操作指南

  1. 内核配置 使能 USB Device 及 FunctionFS 相关配置,例如:

    CONFIG_USB_SUPPORT=y
    CONFIG_USB=y
    CONFIG_USB_DWC2=y
    CONFIG_USB_GADGET=y
    CONFIG_USB_CONFIGFS=y
    CONFIG_USB_LIBCOMPOSITE=y
    CONFIG_USB_ROLE_SWITCH=y
    CONFIG_USB_F_FS=y
    CONFIG_USB_CONFIGFS_FS=y
    
  2. 切换为 Device 模式

    • 参考本章 切换 switch GPIO 小节。

    • 将 OTG 控制器切到 Device 模式:

      echo device > /proc/cviusb/otg_role
      
  3. 运行脚本 run_usb.sh 并启动 adbd 脚本位于板子 /etc 目录下。adbd 需从 SDK 目录 ramdisk/rootfs/public/adbd/<TOOLCHAIN>/usr/bin/adbd 拷贝到板子后使用:

    /etc/run_usb.sh probe adb
    /etc/run_usb.sh start
    ./adbd &
    
  4. 连接 USB 线 通过 USB 将平台与 Host 相连,Host 即可识别为 USB ADB 设备。

  5. 在 Windows 上使用 ADB

    (1)安装 / 获取 ADB

    (2)把 adb 加入系统 PATH

    • 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。

    • 在 “系统变量” 中选中 Path → “编辑” → “新建”,填入 adb 所在目录(如 C:\platform-tools),确定保存。

    • 关闭并重新打开一个 CMD 窗口使 PATH 生效。

    (3)验证并连接板子

    在新开的 CMD 中执行:

    adb version
    

    能输出版本信息说明 PATH 已生效。再执行:

    adb devices
    

    若列表中出现设备(如 xxxxxxxx device),再执行:

    adb shell
    

    即可进入 adb 控制台。

3.4.6. Device 作为 RNDIS 设备的操作指南

  1. 内核配置 使能 USB Device 及 RNDIS 相关配置,例如:

    CONFIG_USB_SUPPORT=y
    CONFIG_USB=y
    CONFIG_USB_DWC2=y
    CONFIG_USB_GADGET=y
    CONFIG_USB_CONFIGFS=y
    CONFIG_USB_LIBCOMPOSITE=y
    CONFIG_USB_ROLE_SWITCH=y
    CONFIG_USB_CONFIGFS_RNDIS=y
    CONFIG_USB_F_RNDIS=y
    CONFIG_USB_ETH_RNDIS=y
    CONFIG_USB_U_ETHER=y
    
  2. 切换为 Device 模式

    • 参考本章 切换 switch GPIO 小节。

    • 将 OTG 控制器切到 Device 模式:

      echo device > /proc/cviusb/otg_role
      
  3. 运行脚本 run_usb.sh 并设置板端 IP 脚本位于板子 /etc 目录下:

    /etc/run_usb.sh probe rndis
    /etc/run_usb.sh start
    ifconfig usb0 192.168.3.101 up
    
  4. 连接 USB 线 通过 USB 将平台与 Host 相连,Host 即可识别为 USB Remote NDIS 设备。在 Windows 上需安装 “Remote NDIS Compatible Device” 驱动。

  5. 配置 Windows 驱动 在设备管理器中为 RNDIS 设备选择驱动:Device Manager -> 右键 RNDIS,后续步骤按照下图操作。 板端与 Windows 端配置同网段 IP,随后互 ping 验证连通性。

_images/USB1.jpg _images/USB2.jpg _images/USB3.jpg _images/USB4.jpg _images/USB5.jpg _images/USB6.jpg

若出现 Windows 能 ping 通板端、板端 ping 不通 Windows 的情况,可在 Windows 侧添加入站规则允许 ICMPv4(推荐做法如下):

  • 按 Win + R,输入 wf.msc,回车,打开“高级安全 Windows 防火墙”。

  • 左侧点击“入站规则”,右侧点击“新建规则”。

  • 选择“自定义” → 下一步。

  • “此规则应用于哪些协议和端口”:协议类型选“ICMPv4”(在“自定义”或下拉中选择 ICMPv4)→ 下一步。

  • 操作:选择“允许连接” → 下一步。

  • 配置文件:域、专用、公用 三项均勾选 → 下一步。

  • 名称:填写“允许 Ping” → 完成。

完成后在板端执行(将 192.168.3.130 替换为实际 Windows IP):

ping -c 4 192.168.3.130

重新连接 USB RNDIS 时

  • 拔掉 USB 线。

  • 执行 /etc/run_usb.sh stop

  • 执行 /etc/run_usb.sh probe rndis/etc/run_usb.sh start 后再插上 USB 线。

  • 板端再次配置 IP,例如 ifconfig usb0 192.168.3.101 up

3.5. 操作中需注意问题

操作中需要注意的问题如下:

  • 系统开机后默认是Host mode. 若要使用Device mode须加载模块并执行USB ConfigFS 脚本. 当切换Device前,用户须确认以下事项:

    • USB Cable未连接Host。

    • 平台上的硬件须切换到对应的USB mode。例如: 在切换到Device mode前,须关闭平台上的USB 5V供电。若平台上有带Hub,需关闭Hub电源并切换路径Switch到Device mode connector。

  • 切换为Device mode后,若要再使用Host mode,用户须重新启动平台。

  • 当平台做终端设备时,因TTY终端特性,若在短时间内传送大量数据, 可能造成数据遗失。用户使用此功能须注意此限制。

  • 在Uboot下使用USB Host读取U盘时,注意若平台上有Hub,须打开Hub电源并切换路径Switch到正确的Connector。