如何实现自定义USBBulk批量传输设备

如何实现⾃定义USBBulk批量传输设备
⼚商⾃定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发端的设备驱动程序,还要开发设备应⽤程序。
⼚商⾃定义  设备的端点可以⾃由地选择采⽤哪种传输⽅式(control transaction 控制传输、bulk transaction 批量传输、interrupt transaction 中断传输、isochronous transfer 实时传输),当然控制端点只能⽤控制传输。标准设备类可能只⽀持除了控制端点外的其中⼀种传输⽅式,⽐如前⾯的 HID 实例,除了控制端点外,只⽀持中断传输,⽽由于中断传输有其固有特点,有时并不能满⾜应⽤要求,如传输速率⽅⾯,由于决定因素在于中断时间,但中断时间最快是 1ms,⽽批量传输可以随时发⽣(受带宽制),理论上传输速率可以⽐传输快。
1. 修改设备的 PID 和 VID
对于不同产品需要不同的 PID 和 VID,可⽤通过修改设备描述符中的 PID 和 VID 字段。
修改⽂件 usb_descriptor.c 的设备描述符:
1const uint8 Device_Descriptor[18]=
2{
3 0x12, //bLength 域,描述符的长度:18 字节
4 0x01, //bDescriptorType 域,描述符类型:0x01 表⽰本描述符为设备描述符)
5 0x00,0x02, //bcdUSB 域,USB 规范版本号(采⽤ BCD 码):2.0
6 0xFF, //bDeviceClass 域,设备类代码,0xFF 为⾃定义设备类</span>
7 0x00, //bDeviceSubClass 域,设备⼦类代码
8 0x00, //bDeviceProtocol 域,设备协议代码(0x00 表⽰不使⽤任何设备类协议)
9 0x20, //bMaxPacketSize0 域,端点 0 ⽀持最⼤数据包的长度:32 字节
10 0xA2,0x15, //idVendor 域,供应商 ID(VID)
11 0x0F,0xA5, //idProduct 域,产品 ID(PID)</span>
12 0x00,0x00, //bcdDevice 域,设备版本号(采⽤ BCD 码)
13 0x01, //iManufacturer 域,供应商的字符串描述符索引:1
14 0x02, //iProduct 域,产品的字符串描述符索引:2
15 0x03, //iSerialNumber 域,设备序号的字符串描述符索引:3
16 0x01 //bNumConfigurations 域,该 USB 设备⽀持的配置数⽬:1 个
17};
2. 修改端点描述符
端点是设备与主机之间进⾏数据传输的逻辑接⼝,除配置使⽤的端点 0(控制端点,⼀般⼀个设备只有⼀个控制端点)为双向端⼝外,其它均为单向。端点描述符描述了数据的传输类型、传输⽅向、数据包⼤⼩和端点号(也可称为端点地址)等。
除了描述符中描述的端点外,每个设备必须要有⼀个默认的控制型端点,地址为 0,它的数据传输为双向,⽽且没有专门的描述符,只是在设备描述符中定义了它的最⼤包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。
1/* structure containing details of all the endpoints used by this device */ USB_EP_STRUCT ep[CDC_DESC_ENDPOINT_COUNT] =
2{
3 {
4  CIC_NOTIF_ENDPOINT,
5  USB_INTERRUPT_PIPE, USB_SEND,
6  CIC_NOTIF_ENDP_PACKET_SIZE
7 }
8 ,
9 {
10  DIC_BULK_IN_ENDPOINT, USB_BULK_PIPE, USB_SEND,
11  DIC_BULK_IN_ENDP_PACKET_SIZE
12 }
13 ,
14 {
15  DIC_BULK_OUT_ENDPOINT, USB_BULK_PIPE, USB_RECV,
16  DIC_BULK_OUT_ENDP_PACKET_SIZE
17 }
18};
3. 修改字符串描述符      字符串描述符是⼀种可选的 USB 标准描述符,描述了如制商、设备名称或序列号等信息。如果⼀个设备⽆字符串描述符,则其它描述符中与字符串有关的索引值都必须为
0。字符串使⽤的是 Unicode 编码。
1uint8_t USB_STR_2[USB_STR_2_SIZE+USB_STR_DESC_SIZE]
catia逆向设计
2 = { sizeof(USB_STR_2),
3  USB_STRING_DESCRIPTOR,
4  'B',0,
5  'U',0,板弹簧
6  'L',0,
7  'K',0,
8  ' ',0,
9  'T',0,
10  'A',0,刘振利
元极舞11  'N',0,
12  'S',0,
13  'A',0,
14  'C',0,
15  'T',0,
16  'I',0,
17  'O',0,
18  'N',0
19 };
4. 修改 USB 处理过程
由于⾃定义的 USB 设备类没有 CDC 的 Set Control Line State 处理过程,修改 virtual_com.c ⽂件中 start_transactions 的定义,默认使能传输,或者删除与 start_transactions 变量相关的判断代码。
1static bool start_transactions = TRUE;正德皇帝下江南
2
3void TestApp_Init(void)
4{
5 ………
豪杰视频通
6 /* Initialize the USB interface */
7 g_app_handle = USB_Class_CDC_Init(&cdc_config); g_recv_size = 0;
8 g_send_size= 0;
9
10 while (TRUE)
11 {
12  /* call the periodic task function */
13  USB_CDC_Periodic_Task();
14
15  /*check whether enumeration is complete or not */
16  if((start_app==TRUE) && (start_transactions==TRUE))
17  {
18  Virtual_Com_App();
19  }
20 }/* Endwhile */
21}
5. 调⽤ LibUSB-Win32 进⾏ USB 通信      LibUSB-Win32 是⼀个⽤于 Windows 操作系统(Win98SE、WinME、Win2k
和 WinXP)上的通⽤ USB 设备驱动程序。该驱动程序允许使⽤者在不写任何⼀⾏核⼼驱动程序代码的情况下,可以访问 Windows 系统上的任意⼀个 USB 设备。该驱动程序具有以下特点: · 能够与任意⼀个已安装的 USB 设备进⾏通信 · 可被⽤作⾃⼰开发的 USB 设备的驱动程序 · ⽀持批量和中断传输 · ⽀持 USB 规范中定义的所有标准设备请求 · ⽀持 USB 设备制造商的⾃定义请求

本文发布于:2024-09-22 15:47:17,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/164674.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设备   描述符   端点   传输   驱动程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议