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相关的驱动:
CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_STORAGE=y
CONFIG_CMD_USB=y
步骤2.
2.1 Cv180x系列修改 include/configs/cv180x-asic.h。
2.2 Cv181x 系列修改include/configs/cv181x-asic.h, 新增定义:
#define CONFIG_USB_DWC2
#define CONFIG_USB_DWC2_REG_ADDR 0x04340000
步骤3. 编译驱动. 编译uboot产生fip.bin
build_uboot
3.2.2. Uboot下U盘¶
启动Uboot USB Host前的准备:
Uboot下USB Host不支持热插入,须在启动USB host前先插上设备. 若平台上有USB Hub,须确认Hub电源已打开,USB路径的Switch切到Host connector。
以cv180x为例(对应方法同样适用于cv181x):
平台上电,进入uboot命令行,输入命令: usb start,观察否识别成功。
phobos_c906# usb start
starting USB...
USB0: Core Release: 4.00a
scanning bus 0 for devices...Device NOT ready
Request Sense returned 02 3A 00
2 USB Device(s) found
scanning usb for storage devices...2 Storage Device(s) found
若usb start后出现枚举报错或无法检测到设备,可在uboot命令行执行setenv usb_pgood_delay XXX,可针对预热较慢或是中间串了Hub的设备调整timeout值,建议取值范围为1000-3000。
识别完成后,再输入命令: usb tree,查看识别速率。以下举例一个USB host串接一个Hub与一个存储装置。
phobos_c906# usb tree
USB device tree:
1 Hub (480 Mb/s, 0mA)
| U-Boot Root Hub
|
+-2 Mass Storage (480 Mb/s, 500mA)
Generic USB3.0 Card Reader 000000001532
初始化及应用:
识别完成后可进入以下操作。
步骤1. 查看设备信息
命令行执行: usb info [dev],可以查看控制器上所有设备的信息. 示例如下。
phobos_c906# usb info 1
config for device 1
2: Mass Storage, USB Revision 2.10
- Generic USB3.0 Card Reader 000000001532
- Class: (from Interface) Mass Storage
- PacketSize: 64 Configurations: 1
- Vendor: 0x05e3 Product 0x0749 Version 21.50
Configuration: 1
- Interfaces: 1 Bus Powered 500mA
Interface: 0
- Alternate Setting 0, Endpoints: 2
- Class Mass Storage, Transp.SCSI, Bulk only
- Endpoint 1 In Bulk MaxPacket 512
- Endpoint 2 Out Bulk MaxPacket 512
步骤2. 对U盘进行读操作
命令行执行: usb read addr blk# cnt,将存储装置起始地址为blk,大小为cnt的数据读到DDR地址为addr的位置,示例如下:
phobos_c906# usb read 0x90000000 0 10
USB read: device 0 block # 0, count 16 ...16 blocks read: OK
步骤3. 对U盘进行写操作
命令行执行: usb write addr blk# cnt,将DDR地址addr,大小为cnt的数据写到存储装置起始地址为blk的位置. 示例如下:
phobos_c906# usb write 0x90000000 2000 2000
USB read: device 0 block # 8192, count 8192 ...8192 blocks write: OK
3.3. linux Host¶
3.3.1. USB 2.0 Host 操作过程¶
步骤2. 启动平台,加载ext4或squashfs,也可以使用NFS.
步骤3. 加载相关驱动
insmod usb-common.ko
insmod usbcore.ko
insmod udc-core.ko
insmod roles.ko
insmod dwc2.ko
步骤4. 设置usb角色
echo host > /proc/cviusb/otg_role
3.3.2. U盘操作范例¶
插入检测:
直接插入U盘,观察是否枚举成功. 正常情况下串口打印为:
[ 72.061964] usb 1-1: new high-speed USB device number 2 usingdwc2
[ 72.315816] usb-storage 1-1:1.0: USB Mass Storage device detected
[ 72.335934] scsihost0: usb-storage 1-1:1.0
[ 73.363027] scsi 0:0:0:0: Direct-Access Generic STORAGE DEVICE1532 PQ: 0 ANSI: 6
[ 73.374407] sd 0:0:0:0: Attached scsigeneric 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
其中,sda1表示U盘或移动硬盘上的第一个分区,当存在多个分区时,会出现sda1,sd2,sda3等字样。
初始化及应用:
插入检测后,进行如下操作:
sdXY中X代表磁盘号,Y代表分区号,请根据具体系统环境进行修改。
分区命令操作的具设备节点为sdX,范例: ~$ fdisk /dev/sda。
用mkdosfs工具格式化的具体分区为sdXY: ~$ mkdosfs -F 32 /dev/sda1。
挂载的具体分区为sdXY: ~$ mount /dev/sda1 /mnt。
查看分区信息
运行命令”ls /dev”查看系统设备文件,若没有分区信息sdXY,表示还没有分区. 请用fdisk进行分区后进入步骤2。
若有分区信息sdXY,则已经检测到U盘分区,进入步骤2。
查看格式化信息
若没有格式化,请使用mkdosfs进行格式化后进入步骤3。
若已格式化,进入步骤3。
挂载目录
运行”mount /dev/sdaXY /mnt”挂载目录。
对硬盘进行读写操作
3.4. linux Device¶
3.4.1. USB 2.0 Device 操作过程¶
步骤1. 编译USB2.0 Device相关的内核驱动模块
进入menuconfig的如下路径,并配置如下。
Device Driver --->
[*] USB support --->
<*> USB Gadget Support --->
<M> USB functions configurable through configfs
[*] Abstract Control Model (CDC ACM)
[*] Mass storage
编译内核模块,生成.ko文件。
步骤2. 启动平台,加载ext4或squashfs文件系统,也可以使用NFS。
步骤3. 平台作为Device时,须加载USB2.0 Device模块才能在Host端被识别成USB装置.
下面列出所有USB 2.0 Device相关驱动。
3.4.2. USB Device存储设备操作范例¶
步骤4. 平台作为Device时支持eMMC和SD两种存储介质,操作过程如下:
步骤5. 加载模块.
insmod configfs.ko
insmod usb-common.ko
insmod udc-core.ko
insmod libcomposite.ko
insmod usbcore.ko
insmod roles.ko
insmod dwc2.ko
步骤6. USB Device相关模块在kernel下的路径分别为:
步骤7. drivers/usb/gadget/libcomposite.ko
步骤8. drivers/usb/gadget/function/usb_f_mass_storage.ko
步骤9. fs/configfs/configfs.ko
步骤10. 將otg controller 切換至device mode
步骤11. echo device > /proc/cviusb/otg_role
步骤12. 运行shell script “usb_usb.sh”
run_usb.sh probe msc /dev/mmcblkXY
run_usb.sh start
其中mmcblkXY为第X个磁盘的eMMC或SD中第Y个分区. 请用户根据具体情况选择。
步骤13. USB Device相关模块在rootfs下的路径为: /etc/run_usb.sh
步骤14. 通过USB将平台与Host端相连,即可在Host端将平台识别成USB存储设备,并在/dev目录下生成相应的设备节点。
步骤15. 在Host端可将平台当成一个普通的USB存储设备,对其进行分区,格式化,读写等。
3.4.3. USB Device终端设备操作范例¶
平台作Device时可当作终端设备,操作如下:
- 步骤1. 插入模块.
- insmod configfs.koinsmod libcomposite.koinsmod u_serial.koinsmod usb_f_acm.koinsmod usb_f_serial.ko
USB Device相关模块在kernel下的路径分别为:
drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_serial.ko
drivers/usb/gadget/function/usb_f_acm.ko
drivers/usb/gadget/function/u_serial.ko
fs/configfs/configfs.ko
將otg controller 切換至device mode
echo device > /proc/cviusb/otg_role
运行脚本 “run_usb.sh”run_usb.sh probe acmrun_usb.sh startUSB Device相关模块在rootfs下的路径为:/etc/run_usb.sh
步骤2. 通过USB将平台与Host端相连,即可在Host端将平台识别成USB终端设备,并在/dev目录下生成相应的设备节点ttyACMX,X 为同类型终端设备号码。在device端/dev目录下会生成ttyGSY,Y为同类型终端设备号码。
Host和Device可透过终端设备进行数据传输。
3.4.4. USB Device RNDIS设备操作范例¶
平台作Device时可当作RNDIS设备,操作如下:
- 步骤3. 插入模块.
- insmod configfs.koinsmod libcomposite.koinsmod u_ether.koinsmod usb_f_ecm.koinsmod usb_f_eem.koinsmod usb_f_rndis.ko
USB Device相关模块在kernel下的路径分别为:
drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_ecm.ko
drivers/usb/gadget/function/usb_f_ecm.ko
drivers/usb/gadget/function/usb_f_rndis.ko
drivers/usb/gadget/function/u_ether.ko
fs/configfs/configfs.ko
將otg controller 切換至device mode
echo device > /proc/cviusb/otg_role
运行脚本 “run_usb.sh”run_usb.sh probe rndisrun_usb.sh startUSB Device相关模块在rootfs下的路径为:
/etc/run_usb.sh
步骤4. 通过USB将平台与Host端相连,即可在Host端将平台识别成USB Remote NDIS设备,在Windows安装”Remote NDIS Compatible Device”驱动。


步骤5. 在单板设定IP地址,例如”ifconfig usb0 192.168.3.101 up”。
步骤6. 在Window设定IP地址。

Host和Device可透过RNDIS设备进行数据传输。
3.4.5. USB Device CVITEK USB GADGET操作范例¶
平台作Device时可当作使用自定义的CVITEK USB Gadget(CVG),操作如下:
- 步骤7. 插入模块
- insmod configfs.koinsmod libcomposite.koinsmod usb_f_cvg.ko
USB Device相关模块在kernel下的路径分别为:
drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_cvg.ko
fs/configfs/configfs.ko
將otg controller 切換至device mode
echo device > /proc/cviusb/otg_role
运行脚本 “run_usb.sh”run_usb.sh probe cvgrun_usb.sh start
USB Device相关模块在rootfs下的路径为:
/etc/run_usb.sh
步骤8. 通过USB将平台与Host端相连,使用Zadig安装libusb(WinUSB)为设备驱动。

步骤9. 在单板执行测试程序sample_cvg [#TEST]。
步骤10. 在PC执行cvg/pctool/gen_patterns.sh生成测试Patterns。执行”cvg/pctool/cvg_test.py”开始测试。
步骤11. 详细使用文件请参考CVITEK USB Gadget 使用指南.docx。
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。