USB OTG 控制器接口

模块功能介绍

通用串行总线USB( Universal Serial Bus) 是一种新兴的并逐渐取代其他接口标准的数据通信方式,由 Intel、Compaq、Digital、IBM、Microsoft、NEC 及 Northern Telecom 等计算机公司和通信公司于 1995 年联合制定,并逐渐形成了行业标准。

USB 总线作为一种高速串行总线,其极高的传输速度可以满足高速数据传输的应用环境要求,且该总线还兼有供电简单(可总线供电)、安装配置便捷(支持即插即用和热插拔)、 扩展端口简易(通过集线器最多可扩展 127 个外设)、传输方式多样化(4 种传输模式),以及兼容良好(产品升级后向下兼容)等优点。

USB OTG控制器实现了USB主机和多种可同时访问的便携式外围设备之间进行串行数据交换。

驱动源码位置

驱动源码所在位置:

drivers/usb/dwc2

├── core.c
├── core.h
├── core_intr.c
├── debugfs.c
├── debug.h
├── gadget.c
├── hcd.c
├── hcd_ddma.c
├── hcd.h
├── hcd_intr.c
├── hcd_queue.c
├── hw.h
├── Kconfig
├── Makefile
├── pci.c
├── platform.c

设备树配置

设备树所在位置:

kernel内核(version <= 5.10)dts文件路径:

module_driver/dts-stage/x2000/x2000.dtsi

kernel内核(version > 5.10)dts文件路径:

module_driver/dts/x2000/x2000.dtsi kernel内核dts文件路径:

USB控制器描述:

otg: otg@0x13500000 {

 compatible = "ingenic,dwc2-hsotg";

 reg = <0x13500000 0x40000>;

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_OTG>;

 ingenic,usbphy=<&otg_phy>;

 status = "disabled";

 };

PHY控制器描述:

otg_phy: otg_phy {

 #address-cells = <1>;

 #size-cells = <1>;

compatible = "ingenic,innophy","syscon";

 reg = <0x10000000 0x100 0x10078000 0x110>;

 };

设备树默认配置

设备树默认编译会产生otg 和otg_phy设备,在halley5_v30.dts中配置如下:

&otg {

 g-use-dma;

 dr_mode = "otg"; // host,peripheral,otg

 status = "okay";

};

&otg_phy {

ingenic,id-dete-gpio = <&gpc 27 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

ingenic,vbus-dete-gpio = <&gpd 17 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

Ingenic,drvvbus-gpio = <&gpe 22 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

status = "okay";

};

设备树自定义配置

用户可根据实际需求关闭该节点,或进行以下配置:

属性名称说明
ingenic,id-dete-gpio 配置usb用于探测id管脚变化的GPIO
ingenic,vbus-dete-gpio 配置usb用于插拔检测的GPIO
Ingenic,drvvbus-gpio 配置usb用于控制vbus对外供电的GPIO

内核编译配置

需要根据USB不同功能选择不同的配置, USB composite功能可以支持多个device功能同时使用。

USB 作为host:

支持功能说明
mass storage 作为主机,可识别大容量存储设备
usb camera 作为主机,可识别USB摄像头设备
hid 作为主机,可以识别人机交互设备,如鼠标..

USB 作为device:

支持功能说明
adb (Android Debug Bridge) 用于USB debug调试功能
hid usb作为人机交互设备,如鼠标、键盘
uvc (usb video class) usb作为视频类设备
uac1.0 (usb audio class1.0) usb作为音频类设备
printer usb 作为打印机设备
rndis usb 作为网卡设备
serial usb 作为串口设备

内核默认编译配置

USB host 默认支持mass storage、usb camera、hid。

USB device composite默认支持mass storage、adb、uvc、uac1.0、printer、rndis可以同时使用。

内核自定义编译配置

USB控制器模式配置

可通过内核配置或设备树选择配置USB 控制器为host only、device only或otg模式,配置方法如下:

通过内核配置USB控制器为host only模式:

Symbol: USB_DWC2_HOST [=n]

Type : boolean

Prompt: Host only mode

Location:

 -> Device Drivers

 -> USB support (USB_SUPPORT [=y])

 -> DesignWare USB2 DRD Core Support (USB_DWC2 [=y])

 -> DWC2 Mode Selection (<choice> [=y])

Defined at drivers/usb/dwc2/Kconfig:24

Depends on: <choice> && (USB [=y]=y || USB_DWC2 [=y]=m && USB [=y]

通过内核配置USB控制器为device only模式:

Symbol: USB_DWC2_PERIPHERAL [=n]

Type : boolean

Prompt: Gadget only mode

Location:

 -> Device Drivers

 -> USB support (USB_SUPPORT [=y])

 -> DesignWare USB2 DRD Core Support (USB_DWC2 [=y])

 -> DWC2 Mode Selection (<choice> [=y])

Defined at drivers/usb/dwc2/Kconfig:34

Depends on: <choice> && (USB_GADGET [=y]=y || USB_GADGET [=y]=USB_DWC2 [=y])

通过内核配置USB控制器为otg模式:

Symbol: USB_DWC2_DUAL_ROLE [=y]

Type : boolean

Prompt: Dual Role mode

Location:

 -> Device Drivers

 -> USB support (USB_SUPPORT [=y])

 -> DesignWare USB2 DRD Core Support (USB_DWC2 [=y])

 -> DWC2 Mode Selection (<choice> [=y])

Defined at drivers/usb/dwc2/Kconfig:43

Depends on: <choice> && (USB [=y]=y && USB_GADGET [=y]=y || USB_DWC2 [=y]=m && USB [=y] && USB_GADGET [=y]

或者可在halley5_v30.dts中配置USB控制器模式:

&otg {

 g-use-dma;

 dr_mode = "otg"; //host,peripheral,otg

 status = "okay";

};

USB host内核配置

USB host Mass Storage

(1) VFAT (Windows-95) fs support

Symbol: VFAT_FS [=y]

Type : tristate

Prompt: VFAT (Windows-95) fs support

Location:

-> File systems

-> DOS/FAT/NT Filesystems

Defined at fs/fat/Kconfig:60

Depends on: BLOCK [=y]

Selects: FAT_FS [=y]

(2) Codepage 437 (United States, Canada)

Symbol: NLS_CODEPAGE_437 [=y]

Type : tristate

Prompt: Codepage 437 (United States, Canada)

Location:

-> File systems

-> Native language support (NLS [=y])

Defined at fs/nls/Kconfig:39

Depends on: NLS [=y]

(3) NLS ISO 8859-1 (Latin 1; Western European Languages)

Symbol: NLS_ISO8859_1 [=y]

Type : tristate

Prompt: NLS ISO 8859-1 (Latin 1; Western European Languages)

Location:

-> File systems

-> Native language support (NLS [=y])

Defined at fs/nls/Kconfig:318

Depends on: NLS [=y]

(4) SCSI disk support

Symbol: BLK_DEV_SD [=y]

Type : tristate

Prompt: SCSI disk support

Location:

-> Device Drivers

-> SCSI device support

Defined at drivers/scsi/Kconfig:73

Depends on: SCSI [=y]

(5) USB Mass Storage support

Symbol: USB_STORAGE [=y]

Type : tristate

Prompt: USB Mass Storage support

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> Support for Host-side USB (USB [=y])

Defined at drivers/usb/storage/Kconfig:8

Depends on: USB_SUPPORT [=y] && USB [=y] && SCSI [=y]
USB host camera
Symbol: USB_VIDEO_CLASS [=y]

Type : tristate

Prompt: USB Video Class (UVC)

Location:

-> Device Drivers

-> Multimedia support (MEDIA_SUPPORT [=y])

-> Media USB Adapters (MEDIA_USB_SUPPORT [=y])

Defined at drivers/media/usb/uvc/Kconfig:1

Depends on: USB [=y] && MEDIA_SUPPORT [=y] && MEDIA_USB_SUPPORT [=y] && MEDIA_CAMERA_SUPPORT [=y] && VIDEO_V4L2 [=y]

Selects: VIDEOBUF2_VMALLOC [=n]
USB host hid mouse

(1) USB HIDBP Mouse (simple Boot) support

Symbol: USB_MOUSE [=y]

Type : tristate

Prompt: USB HIDBP Mouse (simple Boot) support

Location:

-> Device Drivers

-> HID support

-> USB HID support

-> USB HID Boot Protocol module_drivers/drivers

Defined at drivers/hid/usbhid/Kconfig:66

Depends on: USB_HID [=n]!=y && EXPERT [=y] && USB [=y] && INPUT [=y]

(2) Mouse interface

Symbol: INPUT_MOUSEDEV [=y]

Type : tristate

Prompt: Mouse interface

Location:

-> Device Drivers

-> Input device support

-> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])

Defined at drivers/input/Kconfig:95

Depends on: !UML && INPUT [=y]
USB host rndis

(1) USB Network Adapters

Symbol: USB_USBNET [=y]

Type : tristate

Prompt: Multi-purpose USB Networking Framework

Location:

-> Device Drivers

-> Network device support (NETDEVICES [=y])

-> USB Network Adapters (USB_NET_DRIVERS [=y])

Defined at drivers/net/usb/Kconfig:121

Depends on: NETDEVICES [=y] && USB_NET_DRIVERS [=y]

Selects: MII [=y]

Selected by: USB_NET_RNDIS_WLAN [=n] && NETDEVICES [=y] && WLAN [=y] && USB [=y] && CFG80211 [=y]

(2) Multi-purpose USB Networking Framework

Symbol: USB_NET_RNDIS_HOST [=y]
Type  : tristate
Defined at drivers/net/usb/Kconfig:398
Prompt: Host for RNDIS and ActiveSync devices
Depends on: NETDEVICES [=y] && USB_NET_DRIVERS [=y] && USB_USBNET [=y]
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> USB Network Adapters (USB_NET_DRIVERS [=y])
-> Multi-purpose USB Networking Framework (USB_USBNET [=y])
Selects: USB_NET_CDCETHER [=y]
Selected by [n]:
- USB_NET_RNDIS_WLAN [=n] && NETDEVICES [=y] && WLAN [=n] && USB [=y] && CFG80211 [=y]
USB host cdrom

(1)ISO 9660 CDROM file system support

Symbol: ISO9660_FS [=y]

Type : tristate

Prompt: ISO 9660 CDROM file system support

Location:

-> File systems

(1)-> CD-ROM/DVD Filesystems

Defined at fs/isofs/Kconfig:1

Depends on: BLOCK [=y]

(2) Microsoft Joliet CDROM extensions

Symbol: JOLIET [=y]

Type : boolean

Prompt: Microsoft Joliet CDROM extensions

Location:

-> File systems

-> CD-ROM/DVD Filesystems

-> ISO 9660 CDROM file system support (ISO9660_FS [=y])

Defined at fs/isofs/Kconfig:17

Depends on: BLOCK [=y] && ISO9660_FS [=y]

Selects: NLS [=y]

(3) SCSI CDROM support

Symbol: BLK_DEV_SR [=y]

Type : tristate

Prompt: SCSI CDROM support

Location:

-> Device Drivers

(1)-> SCSI device support

Defined at drivers/scsi/Kconfig:129

Depends on: SCSI [=y]

(4) SCSI generic support

Symbol: CHR_DEV_SG [=y]

Type : tristate

Prompt: SCSI generic support

Location:

-> Device Drivers

(1)-> SCSI device support

Defined at drivers/scsi/Kconfig:152

Depends on: SCSI [=y]

USB gadget内核配置

USB device mass storage
Symbol: USB_CONFIGFS_MASS_STORAGE [=y]

Type : boolean

Prompt: Mass storage

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:338

Depends on: <choice> && USB_CONFIGFS [=y] && BLOCK [=y]

Selects: USB_F_MASS_STORAGE [=y]
USB device adb
Symbol: USB_CONFIGFS_F_FS [=y]

Type : boolean

Prompt: Function filesystem (FunctionFS)

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:362

Depends on: <choice> && USB_CONFIGFS [=y]

Selects: USB_F_FS [=y]
USB device hid
Symbol: USB_CONFIGFS_F_HID [=y]

Type : boolean

Prompt: HID function

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:419

Depends on: <choice> && USB_CONFIGFS [=y]

Selects: USB_F_HID [=n]
USB device ncm
Symbol: USB_CONFIGFS_NCM [=y]

Type  : bool

Defined at drivers/usb/gadget/Kconfig:279

Prompt: Network Control Model (CDC NCM)

Depends on: USB_SUPPORT [=y] && USB_GADGET [=y] && USB_CONFIGFS [=y] && NET [=y]

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget functions configurable through configfs (USB_CONFIGFS [=y])

Selects: USB_U_ETHER [=y] && USB_F_NCM [=n] && CRC32 [=y]
USB device remote NDIS
Symbol: USB_CONFIGFS_RNDIS [=y]

Type : boolean

Prompt: RNDIS

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:297

Depends on: <choice> && USB_CONFIGFS [=y] && NET [=y]

Selects: USB_U_ETHER [=n] && USB_F_RNDIS [=n]
USB device serial

(1) Generic serial bulk in/out

Symbol: USB_CONFIGFS_SERIAL [=y]

Type : boolean

Prompt: Generic serial bulk in/out

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:241

Depends on: <choice> && USB_CONFIGFS [=y] && TTY [=y]

Selects: USB_U_SERIAL [=n] && USB_F_SERIAL [=n]

(2) Abstract Control Model (CDC ACM)

Symbol: USB_CONFIGFS_ACM [=y]

Type : boolean

Prompt: Abstract Control Model (CDC ACM)

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:250

Depends on: <choice> && USB_CONFIGFS [=y] && TTY [=y]

Selects: USB_U_SERIAL [=n] && USB_F_ACM [=n]

(3) Object Exchange Model (CDC OBEX)

Symbol: USB_CONFIGFS_OBEX [=y]

Type : boolean

Prompt: Object Exchange Model (CDC OBEX)

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:260

Depends on: <choice> && USB_CONFIGFS [=y] && TTY [=y]

Selects: USB_U_SERIAL [=n] && USB_F_OBEX [=n]
USB device printer
Symbol: USB_CONFIGFS_F_PRINTER [=y]

Type : boolean

Prompt: Printer function

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:469

Depends on: <choice> && USB_CONFIGFS [=y]

Selects: USB_F_PRINTER [=y]
USB device uac1.0
Symbol: USB_CONFIGFS_F_UAC1 [=y]

Type : boolean

Prompt: Audio Class 1.0

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

-> USB functions configurable through configfs (USB_CONFIGFS [=y])

Defined at drivers/usb/gadget/Kconfig:402

Depends on: <choice> && USB_CONFIGFS [=y] && SND [=y]

Selects: USB_LIBCOMPOSITE [=y] && SND_PCM [=y] && USB_F_UAC1 [=y]

USB legacy内核配置

USB device serial
Symbol: USB_G_SERIAL [=y]

Type : tristate

Prompt: Serial Gadget (with CDC ACM and CDC OBEX support)

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

Defined at drivers/usb/gadget/legacy/Kconfig:260

Depends on: <choice> && TTY [=y]

Selects: USB_U_SERIAL [=y] && USB_F_ACM [=y] && USB_F_SERIAL [=y] && USB_F_OBEX [=y] && USB_LIBCOMPOSITE [=y]
USB device uvc
Symbol: USB_G_WEBCAM [=y]

Type : tristate

Prompt: USB Webcam Gadget

Location:

-> Device Drivers

-> USB support (USB_SUPPORT [=y])

-> USB Gadget Support (USB_GADGET [=y])

-> USB Gadget Drivers (<choice> [=y])

Defined at drivers/usb/gadget/legacy/Kconfig:471

Depends on: <choice> && VIDEO_DEV [=y]

Selects: USB_LIBCOMPOSITE [=y] && VIDEOBUF2_VMALLOC [=y] && USB_F_UVC [=y] && USB_DWC2_HIGHWIDTH_FIFO [=y]

USB gadget描述符配置

hid、serial不支持复合设备,需要手动修改配置。

usb composite和相关功能描述符配置路径如下:

development/usb-gadget/usb-gadget-scripts/

内核版本差异

无

设备节点生成

无

应用程序使用说明

USB host

USB host Mass Storage

1. 插入U盘弹出打印信息

[ 46.070034] usb 1-1: new high-speed USB device number 2 using dwc2

[ 46.296250] usb 1-1: New USB device found, idVendor=0951, idProduct=1666

[ 46.303202] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[ 46.310592] usb 1-1: Product: DataTraveler 3.0

[ 46.315185] usb 1-1: Manufacturer: Kingston

[ 46.319508] usb 1-1: SerialNumber: 60A44C413C4EB211A98A00A0

[ 46.325821] usb-storage 1-1:1.0: USB Mass Storage device detected

[ 46.342363] scsi host0: usb-storage 1-1:1.0

[ 47.726378] scsi 0:0:0:0: Direct-Access Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6

[ 47.736215] sd 0:0:0:0: [sda] 30277632 512-byte logical blocks: (15.5 GB/14.4 GiB)

[ 47.752538] sd 0:0:0:0: [sda] Write Protect is off

[ 47.759990] sd 0:0:0:0: [sda] No Caching mode page found

[ 47.765648] sd 0:0:0:0: [sda] Assuming drive cache: write through

[ 47.780215] sda: sda1

[ 47.789136] sd 0:0:0:0: [sda] Attached SCSI removable disk

2. 挂载U盘到文件系统

# mount -t vfat /dev/sda1 mnt/

3. 进入/mnt下,进行数据交互

USB host camera

1. 插入摄像头识别成功

[ 56.560037] usb 1-1: new high-speed USB device number 2 using dwc2

[ 56.910300] usb 1-1: New USB device found, idVendor=058f, idProduct=5608

[ 56.917231] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=0

[ 56.924635] usb 1-1: Product: USB 2.0 Camera

[ 56.929114] usb 1-1: Manufacturer: Alcor Micro, Corp.

[ 56.939481] uvcvideo: Found UVC 1.00 device USB 2.0 Camera (058f:5608)

[ 56.949251] input: USB 2.0 Camera as /devices/platform/ahb2/13500000.otg/usb1/1-1/1-1:1.0/input/input0

2. 拍照测试

usage: uvcview [-d ] [-c ]

--help -H print this message

--print_formats -F print video device info

--device -d , video device, default is /dev/video0

--width -w grab width

--height -h grab height

--count -c set the count to grab

--rate -r frame sample rate(fps)

--yuv -y use yuyv input format

--timeout -t select timeout

--match -m do picture match test

--perf -p do performance test

注:/dev/vidio5是usb camera生成的标准video节点.

# ./grab -w 640 -h 480 -d /dev/video5 -y -c 3

3. 生成图像

p-0.jpg p-1.jpg p-2.jpg

USB host hid mouse

1. 插入鼠标设备到控制器

[ 117.100038] usb 1-1: new low-speed USB device number 2 using dwc2

[ 117.313977] usb 1-1: New USB device found, idVendor=046d, idProduct=c077

[ 117.320929] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0

[ 117.328305] usb 1-1: Product: USB Optical Mouse

[ 117.333098] usb 1-1: Manufacturer: Logitech

[ 117.338568] input: Logitech USB Optical Mouse as /devices/platform/ahb2/13500000.otg/usb1/1-1/1-1:1.0/input/input0

2. 执行捕获事件的程序后移动鼠标触发事件

# cd /testsuite/usb_test/usb_host/getevent_test/

# ./getevent_test 0

/dev/input/mouse0

evdev version: 0.0.0

name:

features: relative reserved unknown unknown unknown unknown unknown unknown unknown

/dev/input/mouse0: open, fd = 3

Sun Mar 1 16:38:18 2020.000000 type 0x0011; code 0x000e; value 0x00000000; Led

[ 125.626285] random: nonblocking pool is initialized

Wed Dec 25 06:26:16 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Thu Dec 26 00:59:52 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Mon Dec 23 18:27:20 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Thu Dec 26 00:55:36 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Wed Dec 25 06:47:36 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Tue Dec 24 12:31:04 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Wed Dec 25 06:47:36 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

Mon Dec 23 18:10:16 2019.000000 type 0x0011; code 0x000e; value 0x00000000; Led

....

....

....

USB host rndis

1. 插入USB网卡设备到控制器

[ 68.720047] usb 1-1: new high-speed USB device number 2 using dwc2

[ 68.935798] usb 1-1: New USB device found, idVendor=0b95, idProduct=1790

[ 68.942770] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[ 68.950422] usb 1-1: Product: AX88179

[ 68.954211] usb 1-1: Manufacturer: ASIX Elec. Corp.

[ 68.959249] usb 1-1: SerialNumber: 0000000000002E

[ 69.294505] ax88179_178a 1-1:1.0 eth1: register 'ax88179_178a' at usb-13500000.otg-1, ASIX AX88179 USB 3.0 Gigabit Ethernet, 00:0e:c6:fa:54:fa

2. 开发板端查看USB网卡信息

# ifconfig -a

....

....

eth1 Link encap:Ethernet HWaddr 00:0E:C6:FA:54:FA

 BROADCAST MULTICAST MTU:1500 Metric:1

 RX packets:0 errors:0 dropped:0 overruns:0 frame:0

 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

 collisions:0 txqueuelen:1000

 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

....

....

3. 开发板端配置USB网卡ip

# ifconfig eth1 192.168.4.100

4. 开发板端测试网卡

# ping 192.168.4.100

PING 192.168.4.100 (192.168.4.100): 56 data bytes

64 bytes from 192.168.4.100: seq=0 ttl=64 time=0.370 ms

64 bytes from 192.168.4.100: seq=1 ttl=64 time=0.148 ms

64 bytes from 192.168.4.100: seq=2 ttl=64 time=0.154 ms

64 bytes from 192.168.4.100: seq=3 ttl=64 time=0.150 ms

....

....

USB host cdrom

1. 插入usb光驱设备到控制器

# [61192.659785] usb 2-1: new high-speed USB device number 3 using dwc2

[61192.864785] usb 2-1: New USB device found, idVendor=0e8d, idProduct=1887

[61192.871745] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[61192.879121] usb 2-1: Product: Portable Super Multi Drive

[61192.884866] usb 2-1: Manufacturer: Hitachi-LG Data Storage Inc

[61192.890926] usb 2-1: SerialNumber: K0SMAHC3451

[61192.901854] usb-storage 2-1:1.0: USB Mass Storage device detected

[61192.922011] scsi host1: usb-storage 2-1:1.0

[61193.927502] scsi 1:0:0:0: CD-ROM think plusUltraslimDVD 1.01 PQ: 0 ANSI: 0

[61193.959517] sr 1:0:0:0: [sr0] scsi3-mmc drive: 24x/24x writer dvd-ram cd/rw xa/form2 cdda tray

[61193.970802] sr 1:0:0:0: Attached scsi generic sg0 type 5

2. 挂载光驱到文件系统

# mkdir /mnt/cdrom

# mount -t iso9660 -o ro /dev/sr0 /mnt/cdrom

3. 进入/mnt/cdrom下,读取数据。

USB device

USB device mass storage

1. 制作盘符

# dd if=/dev/zero of=fat32.img bs=1k count=2048

# mkfs.vfat fat32.img

2. 将盘符加入

# echo fat32.img > /sys/kernel/config/usb_gadget/demo/functions/mass_storage.0/lun.0/file

3. 完成后会在PC端弹出盘符并支持热插拔

USB device adb

1. 启动后无需任何配置直接开始adb功能

2. adb不支持热插拔,插拔后将设备清除,再次插入时需要重新绑定

# echo 13500000.otg > /sys/kernel/config/usb_gadget/demo/UDC

USB device hid

1. pc端识别设备

$ dmesg

[2180880.531376] usb 2-1.5: new high-speed USB device number 115 using ehci-pci

[2180880.628285] usb 2-1.5: New USB device found, idVendor=18d1, idProduct=d002

[2180880.628292] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[2180880.628304] usb 2-1.5: Product: composite-demo

[2180880.628307] usb 2-1.5: Manufacturer: ingenic

[2180880.628309] usb 2-1.5: SerialNumber: 0123456789ABCDEF

[2180880.635882] input: ingenic composite-demo as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.5/2-1.5:1.0/0003:18D1:D002.006C/input/input126

[2180880.691853] hid-generic 0003:18D1:D002.006C: input,hidraw3: USB HID v1.01 Keyboard [ingenic composite-demo] on usb-0000:00:1d.0-1.5/input0

2. 开发板执行测试程序

 # cd /testsuite/usb_test/usb_gadget/hid_gadget_test

模拟usb键盘

# ./hid_gadget_test /dev/hidg0 keyboard

模拟usb鼠标

# ./hid_gadget_test /dev/hidg1 mouse

USB device uvc

1. pc端识别设备

$ dmesg

 [2187560.274157] usb 2-1.5: new high-speed USB device number 19 using ehci-pci

 [2187560.371029] usb 2-1.5: New USB device found, idVendor=18d1, idProduct=d002

 [2187560.371033] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3

 [2187560.371035] usb 2-1.5: Product: composite-demo

 [2187560.371037] usb 2-1.5: Manufacturer: ingenic

 [2187560.371039] usb 2-1.5: SerialNumber: 0123456789ABCDEF

 [2187560.394857] uvcvideo: Found UVC 1.00 device composite-demo (18d1:d002)

 [2187560.403005] input: composite-demo as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.5/2-1.5:1.0/input/input141

2. 开发板执行测试程序

webcam_gadget使用方法:

 Usage: webcam_gadget [options]

 Available options are

 -b Use bulk mode

 -d Do not use any real V4L2 capture device

 -h Print this help screen and exit

 -i images dir for [uvc-WxH.jpg uvc-WxH.yuv]

 -m Streaming mult for ISOC (b/w 0 and 2)

 -n Number of Video buffers (b/w 2 and 32)

 -o <IO method> Select UVC IO method:

 0 = MMAP

 1 = USER_PTR

 -s <speed> Select USB bus speed (b/w 0 and 2)

 0 = Full Speed (FS)

 1 = High Speed (HS)

 2 = Super Speed (SS)

 -t Streaming burst (b/w 0 and 15)

 -u device UVC Video Output device

 -v device V4L2 Video Capture device

 -e device HELIX Video Capture device

camera动态测试:

format:

# ./webcam_gadget -u /dev/video<uvc video node #> -v /dev/video<camera video node #> -e /dev/video<helix video node #>

example:

# ./webcam_gadget -u /dev/video12 -v /dev/video4 -e /dev/video0

静态图片测试:

format:

注:需要提前将测试图片放到-i 指令的路径下, 命名规则:uvc-(weight)x(height).yuv 和 uvc-(weight)x(height).jpg

example:

# ./webcam_gadget -u /dev/video<uvc video node #> -v /dev/video<camera video node #> -e /dev/video<helix video node #> -d -i /mnt

pc端测试工具:

linux os:

Video tools: xawtv

Video tools: cheese webcam booth

windows os:

Video tools: amcap

手机端:

APP: usb 摄像头

注: 华为手机请使用legacy配置

USB device ncm

1. pc端识别设备

pc端识设备信息:

$ dmesg

识别信息:

[3441418.912760] usb 1-9: new high-speed USB device number 86 using xhci_hcd

[3441419.069204] usb 1-9: New USB device found, idVendor=18d1, idProduct=d002, bcdDevice= 1.00

[3441419.069209] usb 1-9: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[3441419.069213] usb 1-9: Product: composite-demo

[3441419.069216] usb 1-9: Manufacturer: ingenic

[3441419.069219] usb 1-9: SerialNumber: 0123456789ABCDEF

[3441419.093626] cdc_ncm 1-9:1.0: MAC-Address: 3a:8d:bb:87:e8:f4

[3441419.094246] cdc_ncm 1-9:1.0 usb0: register 'cdc_ncm' at usb-0000:00:14.0-9, CDC NCM, 3a:8d:bb:87:e8:f4

[3441419.164108] cdc_ncm 1-9:1.0 enx3a8dbb87e8f4: renamed from usb0

[3441419.247977] cdc_ncm 1-9:1.0 enx3a8dbb87e8f4: 425 mbit/s downlink 425 mbit/s uplink

pc端识别到usb网卡设备:

$ ifconfig -a

 enx3a8dbb87e8f4: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 3a:8d:bb:87:e8:f4  txqueuelen 1000  (以太网)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. 主机端配置usb网卡设备ip:

$ sudo ifconfig enx3a8dbb87e8f4 192.168.4.99 up

3. 开发板端配置网卡设备ip:

$ sudo ifconfig usb0 192.168.4.100 up

4. 主机端ping开发板

$ ping 192.168.4.100

 PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.

 64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.100: icmp_seq=3 ttl=64 time=0.031 ms

5. 开发板ping主机

$ ping 192.168.4.99

 PING 192.168.4.99 (192.168.4.99) 56(84) bytes of data.

 64 bytes from 192.168.4.99: icmp_seq=1 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.99: icmp_seq=2 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.99: icmp_seq=3 ttl=64 time=0.031 ms

USB device remote NDIS

1. pc端识别设备

pc端识设备信息:

$ dmesg

 识别信息:

 [2188325.480982] usb 2-1.5: new high-speed USB device number 21 using ehci-pci

 [2188325.577912] usb 2-1.5: New USB device found, idVendor=18d1, idProduct=d002

 [2188325.577919] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3

 [2188325.577930] usb 2-1.5: Product: composite-demo

 [2188325.577932] usb 2-1.5: Manufacturer: ingenic

 [2188325.577934] usb 2-1.5: SerialNumber: 0123456789ABCDEF

 [2188325.586180] rndis_host 2-1.5:1.0 usb0: register 'rndis_host' at usb-0000:00:1d.0-1.5, RNDIS device, 52:ea:19:19:5f:69

 [2188325.650205] rndis_host 2-1.5:1.0 enp0s29u1u5: renamed from usb0

 [2188325.670351] IPv6: ADDRCONF(NETDEV_UP): enp0s29u1u5: link is not ready

pc端识别到usb网卡设备:

$ ifconfig -a

 enp0s29u1u5 Link encap:Ethernet HWaddr 52:ea:19:19:5f:69

 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

 RX packets:0 errors:0 dropped:0 overruns:0 frame:0

 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

 collisions:0 txqueuelen:1000

 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

2. 主机配置usb网卡设备ip:

$ sudo ifconfig enp0s29u1u5 192.168.4.99 up

3. 开发板端配置网卡设备ip:

$ sudo ifconfig usb0 192.168.4.100 up

4. 主机端ping开发板

$ ping 192.168.4.100

 PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.

 64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.100: icmp_seq=3 ttl=64 time=0.031 ms

5. 开发板ping主机

$ ping 192.168.4.99

 PING 192.168.4.99 (192.168.4.99) 56(84) bytes of data.

 64 bytes from 192.168.4.99: icmp_seq=1 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.99: icmp_seq=2 ttl=64 time=0.034 ms

 64 bytes from 192.168.4.99: icmp_seq=3 ttl=64 time=0.031 ms

USB device serial

1. pc端识别设备

 $ dmesg

 设备信息:

 [2189021.818872] usb 2-1.5: new high-speed USB device number 25 using ehci-pci

 [2189021.915645] usb 2-1.5: New USB device found, idVendor=0525, idProduct=a4a7

 [2189021.915651] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=0

 [2189021.915655] usb 2-1.5: Product: Gadget Serial v2.4

 [2189021.915659] usb 2-1.5: Manufacturer: Linux 4.4.94+ with 13500000.otg

 [2189021.922892] cdc_acm 2-1.5:2.0: ttyACM0: USB ACM device

2. pc端配置usb serial的VID和PID

$ echo 0x18d1 0xd002 > /sys/bus/usb-serial/drivers/generic/new_id

3. 开发板与pc端交互测试

pc端测试:

注:ttyUSB1对应usb serial设备

$ echo 1111111111 > /dev/ttyUSB1

$ cat /dev/ttyUSB1

开发板测试:

# cat /dev/ttyGS0

# echo 222 > /dev/ttyGS0

USB device printer

1. pc端识别设备

$ dmesg

设备信息:
 ......
 usblp 2-1.7:1.4: usblp0: USB Bidirectional printer dev 38 if 4 alt 0 proto 2 vid 0x18D1 pid 0xD002

2. 开发板与pc端交互测试

开发板测试:

# cd /testsuite/usb_test/usb_gadget/prn_example/

# ./prn_example -read_data

# cat data_file | ./prn_example -write_data

pc端测试:

$ echo 111 > /dev/usb/lp0

$ cat /dev/usb/lp0

USB device uac1.0

1. pc端识别设备

$ aplay -l

 声卡信息:

 card 1: compositedemo [composite-demo], device 0: USB Audio [USB Audio]

 Subdevices: 1/1

 Subdevice #0: subdevice #0

2. pc端选择usb 声卡设备,播放声音

USB legacy

USB device serial

1. pc端识别设备

$ dmesg

 设备信息:

 [2189021.818872] usb 2-1.5: new high-speed USB device number 25 using ehci-pci

 [2189021.915645] usb 2-1.5: New USB device found, idVendor=0525, idProduct=a4a7

 [2189021.915651] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=0

 [2189021.915655] usb 2-1.5: Product: Gadget Serial v2.4

 [2189021.915659] usb 2-1.5: Manufacturer: Linux 4.4.94+ with 13500000.otg

 [2189021.922892] cdc_acm 2-1.5:2.0: ttyACM0: USB ACM device

2. 互发信息

pc端:

$ echo 1111111111 > /dev/ttyACM0

$ cat /dev/ttyACM0

开发板端:

# cat ttyGS0

# echo 2222 > ttyGS0

USB device uvc

1. pc端识别设备

$ dmesg

 设备信息:

 [1278801.857403] usb 2-1.7: new high-speed USB device number 25 using ehci-pci

 [1278801.954312] usb 2-1.7: New USB device found, idVendor=1d6b, idProduct=0102

 [1278801.954318] usb 2-1.7: New USB device strings: Mfr=1, Product=2, SerialNumber=0

 [1278801.954322] usb 2-1.7: Product: Webcam gadget

 [1278801.954326] usb 2-1.7: Manufacturer: Linux Foundation

 [1278801.976022] uvcvideo: Found UVC 1.00 device Webcam gadget (1d6b:0102)

 [1278801.983318] input: Webcam gadget as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/input/input119

2. 手机端测试方法 a. 手机通过转接线连接到开发板 b. 手机打开APP: USB摄像头

注: 如果手机识别到设备,请重启开发板

3. 详细测试方法

同上: [device-uvc-gadget]

USB 软件切换

除了可以通过内核配置或设备树配置选择USB控制器模式外,还可以通过命令行的方式主动进行主从模式切换,使用命令行切换时,USB控制器必须配置为otg模式(方法参考USB控制器模式配置章节),命令行使用示例如下:

# echo host > /sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsotg

[ 81.955542] Force ID Level Low!

# echo device > /sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsotg

 [ 148.459009] Force ID level High!

USB 眼图调整

X2000 USB IP遵循USB2.0规范,支持多种测试模式,包括Test_J模式、Test_K模式、Test_SE0_NAK 模式、Test_Packet模式和Test_Force_Enable模式。

1、作为device进行眼图测试,需要利用电脑端测试软件工具 HSETT,使其进入test_Packet测试 模式。

2、作为host进行眼图测试,需要配置寄存器HPRT[16,13]位,使其进入test_Packet测试模式。

注: 进入测试模式方法参考 zh-cn/linux-app-notes/USB信号质量测试.md

x2000 usb Phy的IP厂商预留6bit用于调整眼图:

3bit 调整幅度:通过调整参考电压来调整45Ω的HS终端电阻。有助于补偿封装和电路板级寄生效应。降低补偿电压,降低 ODT 阻抗。

3bit 调整斜率:通过调整参考电压来调整HS电流值。

调整方法:

usb phy寄存器映射到总线基地址:0x10078000 ; 调节眼图的寄存器地址:0x10078060

描述:

[4:2] 调整幅度

3’b000: 268mV (default)

3’b001: 262mV

3’b010: 250mV

3’b011: 237.5mV

3’b100: 275mV

3’b101: 281mV

3’b110: 293mV

3’b111: 300mV

[7:5] 调节斜率

3’b000: 200mV (default)

3’b001: 225mV

3’b010: 250mV

3’b011: 175mV

3’b100: 400mV

3’b101: 425mV

3’b110: 450mV

3’b111: 375mV

注意事项

修改usb gadget配置

修改默认支持的gadget设备,配置文件路径如下:

development/usb-gadget/usb-gadget-scripts/S90usb

当使用某个function时,需要将其它功能用’#’注释上:

注: hid和serial只能单独使用,不支持复合设备

#/etc/init.d/usb/printer $1

#/etc/init.d/usb/uvc    $1

/etc/init.d/usb/adb     $1

#/etc/init.d/usb/acm    $1

#/etc/init.d/usb/mass_storage $1

#/etc/init.d/usb/keyboard       $1

#/etc/init.d/usb/mouse  $1

#/etc/init.d/usb/ncm    $1

#/etc/init.d/usb/rndis  $1

#/etc/init.d/usb/uac1   $1

#/etc/init.d/usb/serial $1

华为手机使用uvc时, otg无法识别问题

使用legacy配置,可以解决。