Device 侧 gadget zero
28 May 2024
Read time: 6 minute(s)
提供测试需要的 Device 设备有很多种方式,例如可用使用专门的测试 Device 里面烧录专有的测试 Firmware。节约成本的方式还是使用 Linux gadget
功能来动态模拟 USB Device 设备。针对 USB 测试,Linux 专门提供了 gadget zero
设备。
Device 创建
gadget zero
的核心是创建一个 Composite Device
,其包含了两个
Configuration
,其中一个 Configuration 0
包含
SourceSink Function/Interface
,另一个 Configuration
1
包含 Loopback Function/Interface
。某一时刻只能选择使用一个
Configuration
,通常情况下使用 Configuration 0
即
SourceSink
的功能。
gadget zero
Device 由两种方式创建:
-
1、通过
zero_driver
创建,只要把对应驱动文件drivers\usb\gadget\legacy\zero.c
编译进内核即可。 -
2、通过
functionfs
动态创建,这种方式更灵活,实例命令如下:mount -t configfs none /sys/kernel/config cd /sys/kernel/config/usb_gadget mkdir g2 cd g2 echo "0x04e8" > idVendor echo "0x2d01" > idProduct mkdir configs/c.1 mkdir configs/c.2 mkdir functions/Loopback.0 mkdir functions/SourceSink.0 mkdir strings/0x409 mkdir configs/c.1/strings/0x409 mkdir configs/c.2/strings/0x409 echo "0x0525" > idVendor echo "0xa4a0" > idProduct echo "0123456789" > strings/0x409/serialnumber echo "Samsung Inc." > strings/0x409/manufacturer echo "Bar Gadget" > strings/0x409/product echo "Conf 1" > configs/c.1/strings/0x409/configuration echo "Conf 2" > configs/c.2/strings/0x409/configuration echo 120 > configs/c.1/MaxPower // SourceSink:驱动 set configuration 会选取 第一个 configuration ln -s functions/Loopback.0 configs/c.2 ln -s functions/SourceSink.0 configs/c.1 echo 4100000.udc-controller > UDC
整个过程就是创建了一个
Vendor ID = 0x0525
、 Product ID =
0xa4a0
的 Composite Device
,在 Host
侧可以查看这个设备:$ lsusb -s 1:3
Bus 001 Device 003: ID 0525:a4a0 Netchip Technology, Inc. Linux-USB "Gadget Zero"
$ lsusb -v -s 1:3
Bus 001 Device 003: ID 0525:a4a0 Netchip Technology, Inc. Linux-USB "Gadget Zero"
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0525 Netchip Technology, Inc.
idProduct 0xa4a0 Linux-USB "Gadget Zero"
bcdDevice 5.10
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0045
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 120mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 4
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 4
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
bNumInterfaces 1
bConfigurationValue 2
iConfiguration 5
bmAttributes 0x80
(Bus Powered)
MaxPower 2mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 6
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0