如何修改USBCDC成为自定义USBBulk批量传输设备(精) 联系客服

发布时间 : 星期一 文章如何修改USBCDC成为自定义USBBulk批量传输设备(精)更新完毕开始阅读04fcd21e2f3f5727a5e9856a561252d381eb204c

如何实现自定义 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,