ark1668ed芯片USB使用说明: 一、uboot阶段支持U盘升级 1、uboot配置中添加USB选项(默认已添加): 1、ARM architecture ---> [] usb support //暂未使用,待后续拓展 2、Command line interface ---> Device access commands ---> [*] usb 3、Device Drivers ---> [*] USB support ---> --- USB support [*] DesignWare USB2 Core support (64) Data buffer size in kB [*] USB Mass Storage support (1000) Timeout in milliseconds for USB HUB connection 2、uboot设备树中添加USB配置参数(默认已添加): 由于USB初始化时间过长,所以默认只添加了一路USB0。 路径:u-boot/arch/arm/dts/ark1668ed_${BOARD_TYPE}.dts //BOARD_TYPE为devb(nand版本)或者devb_emmc(emmc版本)。 配置如下: usb0_phy: usb0-phy { status = "okay"; }; usb0: usb@40000000 { compatible = "snps,dwc2"; #address-cells = <1>; #size-cells = <0>; reg = <0x40000000 0x40000>; interrupts = ; phys = <&usb0_phy>; phy-names = "usb0-phy"; dr_mode = "host"; status = "okay"; }; 二、内核中配置USB 1、linux内核配置中添加USB选项(默认已添加): Device Drivers [*] USB support ---> <*> Support for Host-side USB [*] Enable USB persist by default (2) Default autosuspend delay (1) Default authorization mode for USB devices <*> USB Mass Storage support <*> USB Attached SCSI DesignWare USB2 DRD Core Support //【为加快开机启动时间,此处配置为ko模式】 DWC2 Mode Selection (Dual Role mode) ---> <*> USB Gadget Support ---> --- USB Gadget Support (2) Maximum VBUS Power usage (2-500 mA) (2) Number of storage pipeline buffers <*> USB Gadget functions configurable through configfs [*] Network Control Model (CDC NCM) [*] USB Gadget Target iap2 gadget [*] USB Gadget Target adb gadget 2、linux内核配置设备树文件(默认已添加): 根据需要修改linux/arch/arm/boot/dts/arkmicro/ark1668ed.dtsi文件中的usb和usb phy的配置。 配置如下: usb0_phy: usb0-phy { compatible = "usb-nop-xceiv"; #phy-cells = <0>; status = "OK"; }; usb1_phy: usb1-phy { compatible = "usb-nop-xceiv"; #phy-cells = <0>; status = "OK"; }; usb0: usb@40000000 { ...... //status = "disabled"; //默认USB0开启,屏蔽USB0则配置status = "disabled" }; usb1: usb@40c00000 { ...... //status = "disabled"; //默认USB1开启,屏蔽USB1则配置status = "disabled" }; 三、编译并升级系统 升级操作参考 "doc/升级说明.txt"。 四、进入系统后加载驱动并挂载U盘 第一步:加载USB驱动 insmod /1ib/modules/6.12.16/kernel/drivers/usb/dwc2/dwc2.ko 第二步:置otg 待完善(暂时忽略) 此时插拔U盘,在/dev/目录下会有节点生成:/dev/sd* 插入U盘log参考如下: / # dmesg -c usb 1-1: new high-speed USB device number 2 using dwc2 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 Multiple Card Reader 1.00 PQ: 0 ANSI: 0 sd 0:0:0:0: Attached scsi generic sg0 type 0 sd 0:0:0:0: [sda] 30539776 512-byte logical blocks: (15.6 GB/14.6 GiB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00 sd 0:0:0:0: [sda] No Caching mode page found sd 0:0:0:0: [sda] Assuming drive cache: write through sda: sd 0:0:0:0: [sda] Attached SCSI removable disk FAT-fs (sda): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. 拔掉U盘log参考如下: / # dmesg -c usb 1-1: USB disconnect, device number 2 第三步:手动挂载测试(按照上述参考节点:/dev/sda) 命令:mount /dev/sda /mnt 挂载成功后可以看到U盘下的文件。 五、启动ncm模式 切换为device模式,详细参考build_ncm_iap.sh脚本,如下所示: /# vi build_ncm_iap.sh #!/bin/sh if [ $# -eq 0 ]; then usb_idx=0 else usb_idx=1 fi # config ncm function KER_CONF="`grep '/sys/kernel/config' /proc/mounts`" if [ -z "$KER_CONF" ]; then mount -t configfs none /sys/kernel/config fi if [ ! -d /sys/kernel/config/usb_gadget/g1 ]; then mkdir /sys/kernel/config/usb_gadget/g1 fi if [ ! -d /sys/kernel/config/usb_gadget/g1/strings/0x409 ]; then mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409 fi if [ ! -d /sys/kernel/config/usb_gadget/g1/functions/ncm.g1 ]; then mkdir /sys/kernel/config/usb_gadget/g1/functions/ncm.g1 fi #if [ ! -d /sys/kernel/config/usb_gadget/g1/functions/iap.g1 ]; then # mkdir /sys/kernel/config/usb_gadget/g1/functions/iap.g1 #fi if [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1 ]; then mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1 fi if [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409 ]; then mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409 fi echo "0x0525" > /sys/kernel/config/usb_gadget/g1/idVendor echo "0xa4a1" > /sys/kernel/config/usb_gadget/g1/idProduct echo "012345678adcdef" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber echo "Arkmicro.Inc" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer echo "Ark1668e USB Device" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower if [ ! -L /sys/kernel/config/usb_gadget/g1/configs/c.1/ncm.g1 ]; then ln -s /sys/kernel/config/usb_gadget/g1/functions/ncm.g1/ /sys/kernel/config/usb_gadget/g1/configs/c.1/ncm.g1 fi #if [ ! -L /sys/kernel/config/usb_gadget/g1/configs/c.1/iap.g1 ]; then # ln -s /sys/kernel/config/usb_gadget/g1/functions/iap.g1/ /sys/kernel/config/usb_gadget/g1/configs/c.1/iap.g1 #fi #ls /sys/class/udc # enable udc #echo 70300000.usb > /sys/kernel/config/usb_gadget/g1/UDC if [ $usb_idx -eq 0 ]; then echo 40000000.usb > /sys/kernel/config/usb_gadget/g1/UDC sleep 0.1 echo device > /sys/class/usb_role/40000000.usb-role-switch/role else echo 40c00000.usb > /sys/kernel/config/usb_gadget/g1/UDC sleep 0.1 echo device > /sys/class/usb_role/40c00000.usb-role-switch/role fi