如何实现自定义 USB Bulk批量传输设备
厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端 的设备驱动程序,还要开发设备应用程序。
厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(control transaction控制传 输、 bulk transaction批量传输、 interrupt transaction中断传输、 isochronous transfer实时传 输,当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种 传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有 其固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间, 但中断时间最快是 1ms ,而批量传输可以随时发生(受带宽限制,理论上传输速率可以 比中断传输快。
Freescale USB Stack 4.1.1协议栈 (http://www.freescale.com/usb已经提供了标准的设备类驱 动。为了实现自定义的 bulk 批量传输设备,我们可以参考现有的 CDC 通信设备类,在 CDC 的源代码基础上进行修改,快速实现自定义 USB Bulk批量传输设备。
1. 修改设备的 PID 和 VID
对于不同产品需要不同的 PID 和 VID ,可用通过修改设备描述符中的 PID 和 VID 字段。 修改文件 usb_descriptor.c的设备描述符:
const uint8 Device_Descriptor[18]= {
0x12, //bLength域,描述符的长度:18字节
0x01, //bDescriptorType域,描述符类型:0x01表示本描述符为设备描述符 0x00,0x02, //bcdUSB域, USB 规范版本号(采用 BCD 码:2.0
0xFF, //bDeviceClass域,设备类代码 ,0xFF 为自定义设备类
0x00, //bDeviceSubClass域,设备子类代码
0x00, //bDeviceProtocol域,设备协议代码(0x00表示不使用任何设备类协议 0x20, //bMaxPacketSize0域,端点 0支持最大数据包的长度:32字节
0xA2,0x15, //idVendor域,供应商 ID (VID 0x0F,0xA5, //idProduct域,产品 ID (PID
0x00,0x00, //bcdDevice域,设备版本号(采用 BCD 码 0x01, //iManufacturer域,供应商的字符串描述符索引:1 0x02, //iProduct域,产品的字符串描述符索引:2
0x03, //iSerialNumber域,设备序号的字符串描述符索引:3 0x01 //bNumConfigurations域,该 USB 设备支持的配置数目:1个 };
2. 修改端点描述符
端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点, 一般一个设备只有一个控制端点为双向端口外,其它均为单向。端点描述符描述了 数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址等。
除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为 0, 它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大 包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它 来配置设备。
/* structure containing details of all the endpoints used by this device */ USB_EP_STRUCT ep[CDC_DESC_ENDPOINT_COUNT] =
{ {
CIC_NOTIF_ENDPOINT, USB_INTERRUPT_PIPE, USB_SEND,
CIC_NOTIF_ENDP_PACKET_SIZE } , {
DIC_BULK_IN_ENDPOINT, USB_BULK_PIPE, USB_SEND,
DIC_BULK_IN_ENDP_PACKET_SIZE } , {
DIC_BULK_OUT_ENDPOINT, USB_BULK_PIPE, USB_RECV,
DIC_BULK_OUT_ENDP_PACKET_SIZE } };
3. 修改字符串描述符
字符串描述符是一种可选的 USB 标准描述符,描述了如制商、设备名称或序列号等信 息。如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为 0。字符串使用的是 Unicode 编码。
uint8_t USB_STR_2[USB_STR_2_SIZE+USB_STR_DESC_SIZE] = { sizeof(USB_STR_2,
USB_STRING_DESCRIPTOR, 'B',0, 'U',0, 'L',0, 'K',0, ' ',0, 'T',0, 'R',0, 'A',0, 'N',0, 'S',0,
相关推荐: