mirror of
https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
synced 2025-12-03 21:31:15 +08:00
update
This commit is contained in:
272
IMX6ULL/doc_pic/12_USB/13_Gadget应用实例之serial.md
Normal file
272
IMX6ULL/doc_pic/12_USB/13_Gadget应用实例之serial.md
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
# Gadget应用实例之serial #
|
||||||
|
|
||||||
|
参考资料:
|
||||||
|
|
||||||
|
* https://blog.csdn.net/embededswordman/article/details/6689593
|
||||||
|
* Linux文档:Documentation\usb\gadget_serial.txt
|
||||||
|
*
|
||||||
|
|
||||||
|
## 1. 编写程序
|
||||||
|
|
||||||
|
### 1.1 编程思路
|
||||||
|
|
||||||
|
涉及的程序如下图所示:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
基于libusb编写程序:
|
||||||
|
|
||||||
|
* 找到设备
|
||||||
|
* 选择配置:loopback、sourcesink
|
||||||
|
* 得到端点:找到interface进而得到endpoint
|
||||||
|
* 读写数据:操作endpoint
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 1.2 zero设备的描述符
|
||||||
|
|
||||||
|
在Ubuntu里执行如下命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ lsusb -v -d 0525:a4a0
|
||||||
|
```
|
||||||
|
|
||||||
|
可以列出zero设备的描述符:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
Bus 001 Device 002: 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 255 Vendor Specific Class
|
||||||
|
bDeviceSubClass 0
|
||||||
|
bDeviceProtocol 0
|
||||||
|
bMaxPacketSize0 64
|
||||||
|
idVendor 0x0525 Netchip Technology, Inc.
|
||||||
|
idProduct 0xa4a0 Linux-USB "Gadget Zero"
|
||||||
|
bcdDevice 4.09
|
||||||
|
iManufacturer 1
|
||||||
|
iProduct 2
|
||||||
|
iSerial 3
|
||||||
|
bNumConfigurations 2
|
||||||
|
Configuration Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 2
|
||||||
|
wTotalLength 69
|
||||||
|
bNumInterfaces 1
|
||||||
|
bConfigurationValue 3
|
||||||
|
iConfiguration 4
|
||||||
|
bmAttributes 0xc0
|
||||||
|
Self 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 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 32
|
||||||
|
bNumInterfaces 1
|
||||||
|
bConfigurationValue 2
|
||||||
|
iConfiguration 5
|
||||||
|
bmAttributes 0xc0
|
||||||
|
Self 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
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
它有2个配置:
|
||||||
|
|
||||||
|
* 第1个配置(bConfigurationValue = 2)对应loopback功能:里面有1个接口,接口有1个setting,下面有2个endpoint
|
||||||
|
* 第2个配置(bConfigurationValue = 3)对应SourceSink功能:里面有1个接口,接口有2个setting
|
||||||
|
* 第1个setting下面有2个endpoint:都是bulk端点
|
||||||
|
* 第2个setting下面有4个endpoint:2个是bulk端点,另外2个是Isochronous端点
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 1.3 编程
|
||||||
|
|
||||||
|
参考libusb示例:libusb\examples\xusb.c
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 2. 上机实验
|
||||||
|
|
||||||
|
实验步骤:
|
||||||
|
|
||||||
|
* 先安装g_zero驱动程序:在开发板上执行`modprobe g_zero`
|
||||||
|
|
||||||
|
* 然后连接OTG线到PC
|
||||||
|
|
||||||
|
* 在Ubuntu中识别出设备
|
||||||
|
|
||||||
|
* 执行测试程序
|
||||||
|
|
||||||
|
* 先编译:在Ubuntu里执行如下命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
apt-cache search libusb # 查找libusb开发包
|
||||||
|
sudo apt install libusb-1.0-0-dev # 安装libusb开发包
|
||||||
|
gcc -o zero_app zero_app.c -lusb-1.0 # 编译
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
* 测试:在Ubuntu里执行如下命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ sudo ./zero_app -l # 列出设备的配置值
|
||||||
|
config 0: bConfigurationValue = 3
|
||||||
|
config 1: bConfigurationValue = 2
|
||||||
|
|
||||||
|
|
||||||
|
# 测试loopback功能
|
||||||
|
$ sudo ./zero_app -s 2 # 选择loopback的配置
|
||||||
|
$ sudo ./zero_app -wstr www.100ask.net # 写入字符串
|
||||||
|
current config: 2
|
||||||
|
in_ep = 0x81, out_ep = 0x1
|
||||||
|
$ sudo ./zero_app -rstr # 读出字符串
|
||||||
|
current config: 2
|
||||||
|
in_ep = 0x81, out_ep = 0x1
|
||||||
|
Read string: www.100ask.net
|
||||||
|
|
||||||
|
$ sudo ./zero_app -w 1 2 3 4 5 6 7 8 # 写入8个字节
|
||||||
|
current config: 2
|
||||||
|
in_ep = 0x81, out_ep = 0x1
|
||||||
|
sudo ./zero_app -r # 读到8个字节
|
||||||
|
current config: 2
|
||||||
|
in_ep = 0x81, out_ep = 0x1
|
||||||
|
transferred != in_ep_maxlen
|
||||||
|
Read datas:
|
||||||
|
01 02 03 04 05 06 07 08
|
||||||
|
|
||||||
|
|
||||||
|
#测试Source/Sink功能
|
||||||
|
$ sudo ./zero_app -s 3 # 选择source/sink的配置
|
||||||
|
book@100ask:~/nfs_rootfs/05_libusb_zero$ sudo ./zero_app -r # 读数据
|
||||||
|
current config: 3
|
||||||
|
in_ep = 0x81, out_ep = 0x1
|
||||||
|
Read datas:
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
|
||||||
|
sudo ./zero_app -w 0 0 0 # 写数据, 只能写入0,
|
||||||
|
# 写入其他值将会导致开发板上的驱动认为是错误然后halt out端点
|
||||||
|
# 然后只能重新执行 ”sudo ./zero_app -s 3“ 才能恢复
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user