如何修改USB CDC成为自定义USB Bulk批量传输设备
发布网友
发布时间:2022-04-21 16:08
我来回答
共1个回答
热心网友
时间:2022-06-09 11:01
厂商自定义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, //idProct域,产品ID(PID)
0x00,0x00, //bcdDevice域,设备版本号(采用BCD码)
0x01, //iManufacturer域,供应商的字符串描述符索引:1
0x02, //iProct域,产品的字符串描述符索引: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,
'A',0,
'C',0,
'T',0,
'I',0,
'O',0,
'N',0
};
4. 修改USB处理过程
由于自定义的USB设备类没有CDC的 Set Control Line State处理过程, 修改virtual_com.c文件中start_transactions的定义,默认使能传输,或者删除与start_transactions变量相关的判断代码。
static bool start_transactions = TRUE;
void TestApp_Init(void)
{
………
/* Initialize the USB interface */
g_app_handle = USB_Class_CDC_Init(&cdc_config);
g_recv_size = 0;
g_send_size= 0;
while (TRUE)
{
/* call the periodic task function */
USB_CDC_Periodic_Task();
/*check whether enumeration is complete or not */
if((start_app==TRUE) && (start_transactions==TRUE))
{
Virtual_Com_App();
}
}/* Endwhile */
}
5. 调用LibUSB-Win32进行USB通信
LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP)上的通用USB设备驱动程序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备。该驱动程序具有以下特点:
? 能够与任意一个已安装的USB设备进行通信
? 可被用作自己开发的USB设备的驱动程序
? 支持批量和中断传输
? 支持USB规范中定义的所有标准设备请求
? 支持USB设备制造商的自定义请求
LibUsb-Win32是由http://libusb-win32.sourceforge.net发布的,遵守GNU Lesser General
Public License(LGPL)和GNU General Public License(GPL)许可协议。这些协议明确规定:允许LibUsb-Win32用于商业软件,而不只是开源软件。
5.1安装PC上位机驱动程序
将修改后的CDC代码编译下载到Kinetis MCU运行,连接PC与MCU Device之间的USB Cable,PC电脑提示发现新硬件。
通过LibUSB-Win32自带的inf-wizard.exe生成向导可以生成USB驱动程序。inf-wizard.exe程序扫描系统活动的USB设备,选择需要生成驱动程序的设备。
inf-wizard.exe程序生成驱动程序inf文件,这个文件将作为产品发布时使用的驱动程序。
三亿文库3y.uu456.com包含各类专业文献、应用写作文书、专业论文、高等教育、行业资料、生活休闲娱乐、75如何修改USB CDC成为自定义USB Bulk批量传输设备等内容。