问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何修改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批量传输设备等内容。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何在win10下安装docker? windows(win10)上的docker使用:安装(国内镜像)、操作 win10安装dockerWin10下Docker安装和使用 关于安装配置docker,找不到Hyper-V(win10 家庭版需要配置,专业版不需要... 怎么把微信上的聊天记录转到新手机 怎么把聊天记录转到另一个手机 快递被别人冒领,快递公司有没有责任 洋葱汤洋葱汤 一颗洋葱汤怎么做 一颗洋葱汤怎么做好吃 EDI 如何使用? HTP是什么啊?有什么用啊? 如何使用flashftp FTP的端口号是多少 ? 电脑有多少种网络协议 ssh如何实现自定义的ssh协议? 电脑打开网络设置 什么求组词 微信被封号,解封时拉头像次数过多怎么办已经过了一天了 网络应用层协议 如何设置点对点传输文件 微信头像是这样,会不会封号? 文件传输的定义 微信群里有相同的头像会引起封号吗 谁有最新的PPT入门到精通教程视频,可以发我百度云 怎样自定义并使用websocket子协议 404 Not Found 怎么自定义应用层协议? 微信用马化腾头像会被封号吗 传输协议的小型文件传输协议 基于CC2540的蓝牙BLE协议,用户自定义的函数是哪块? 没有 用日语怎么说 日语 没有 怎么说 没有 日文怎么说? "没有"翻译成日语怎么写? 没有了日语怎么说 把没有翻译成日语和罗马音,谢谢。 有没有翻译日文的软件 没有办法~翻译成日语 有没有翻译日语的软件啊 床下面什么都没有 翻译成日文 热血高校2裏面没有翻译的日文 有没有翻译日语的软件!记住 是软件! 有没有日文翻译啊?软件,在线的都行! 有没有翻译日语的输入法 日语等级考试中有没有翻译题 404 Not Found 法式松饼的历史是什么啊? 一个法式松饼的面团是如何调制的? 法式松饼的材料