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。

  1. 查看分区信息

    • 运行命令”ls /dev”查看系统设备文件,若没有分区信息sdXY,表示还没有分区. 请用fdisk进行分区后进入步骤2。

    • 若有分区信息sdXY,则已经检测到U盘分区,进入步骤2。

  2. 查看格式化信息

    • 若没有格式化,请使用mkdosfs进行格式化后进入步骤3。

    • 若已格式化,进入步骤3。

  3. 挂载目录

    • 运行”mount /dev/sdaXY /mnt”挂载目录。

  4. 对硬盘进行读写操作

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.ko
insmod libcomposite.ko
insmod u_serial.ko
insmod usb_f_acm.ko
insmod 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 acm
run_usb.sh start
USB 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.ko
insmod libcomposite.ko
insmod u_ether.ko
insmod usb_f_ecm.ko
insmod usb_f_eem.ko
insmod 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 rndis
run_usb.sh start

USB Device相关模块在rootfs下的路径为:

/etc/run_usb.sh

步骤4. 通过USB将平台与Host端相连,即可在Host端将平台识别成USB Remote NDIS设备,在Windows安装”Remote NDIS Compatible Device”驱动。

_images/USBOpe002.png _images/USBOpe003.png

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

步骤6. 在Window设定IP地址。

_images/USBOpe004.png

Host和Device可透过RNDIS设备进行数据传输。

3.4.5. USB Device CVITEK USB GADGET操作范例

平台作Device时可当作使用自定义的CVITEK USB Gadget(CVG),操作如下:

步骤7. 插入模块
insmod configfs.ko
insmod libcomposite.ko
insmod 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 cvg
run_usb.sh start

USB Device相关模块在rootfs下的路径为:

/etc/run_usb.sh

步骤8. 通过USB将平台与Host端相连,使用Zadig安装libusb(WinUSB)为设备驱动。

_images/USBOpe005.png

步骤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。