如何修改USB CDC成为自定义USB Bulk批量传输设备

上传人:豆浆 文档编号:4193385 上传时间:2017-08-16 格式:PDF 页数:9 大小:531.43KB
返回 下载 相关 举报
如何修改USB CDC成为自定义USB Bulk批量传输设备_第1页
第1页 / 共9页
如何修改USB CDC成为自定义USB Bulk批量传输设备_第2页
第2页 / 共9页
如何修改USB CDC成为自定义USB Bulk批量传输设备_第3页
第3页 / 共9页
如何修改USB CDC成为自定义USB Bulk批量传输设备_第4页
第4页 / 共9页
如何修改USB CDC成为自定义USB Bulk批量传输设备_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《如何修改USB CDC成为自定义USB Bulk批量传输设备》由会员分享,可在线阅读,更多相关《如何修改USB CDC成为自定义USB Bulk批量传输设备(9页珍藏版)》请在金锄头文库上搜索。

1、如何实现自定义 USB Bulk 批量传输设备 厂商自定义设备的开发除了要完成设备 硬件以及固件程序开发外,还需要开发操作系统端的设备驱动程序, 还要开发设备应用程序。 厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式( control transaction 控制传输、 bulk transaction 批量传输、 interrupt transaction 中断传输、 isochronous transfer 实时传输),当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有其

2、固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间,但中断时间最快是 1ms,而批量传输可以随时发生(受带宽限制),理论上传输速率可以比中断传输快。 Freescale USB Stack 4.1.1 协议栈 (http:/ bulk 批量传输设备,我们可以参考现有的 CDC 通信设备类,在CDC 的 源代码基础上进行修改,快速实现 自定义 USB Bulk 批量传输设备 。 1. 修 改设备的 PID 和 VID 对于不同产品需要不同的 PID 和 VID,可用通过 修改设备描述符中的 PID 和 VID 字段。修改文件 usb_descriptor.c 的设备描述符

3、 : const uint8 Device_Descriptor18= 0x12, /bLength 域,描述符的长度: 18 字节 0x01, /bDescriptorType 域,描述符类型: 0x01 表示本描述符为设备描述符) 0x00,0x02, /bcdUSB 域, USB 规范版本 号(采用 BCD 码): 2.0 0xFF, /bDeviceClass 域,设备类代码 ,0xFF 为自定义设备类 0x00, /bDeviceSubClass 域,设备子类代码 0x00, /bDeviceProtocol 域,设备协议代码( 0x00 表示不使用任何设备类协议) 0x20, /b

4、MaxPacketSize0 域,端点 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 设备支

5、持的配置数目: 1 个 ; 2. 修改 端 点描述符 端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。 除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为 0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。 /* structure containing details of all the e

6、ndpoints used by this device */ USB_EP_STRUCT epCDC_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_PAC

7、KET_SIZE ; 3. 修改 字符串描述符 字符串描述符是一种可选的 USB 标准描述符,描述了如制商、设备名称或序列号等信息。如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。字符串使用的是 Unicode 编码。 uint8_t USB_STR_2USB_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.

8、修改 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_re

9、cv_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 操作系统( Wi

10、n98SE、 WinME、 Win2k 和 WinXP)上的通用 USB 设备驱动程序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问 Windows 系统上的任意一个 USB 设备。该驱动程序具有以下特点: 能够与任意一个已安装的 USB 设备进行通信 可被用作自己开发的 USB 设备的驱动程序 支持批量和中断传输 支持 USB 规范中定义的所有标准设备请求 支持 USB 设备制造商的自定义请求 LibUsb-Win32 是由 http:/libusb- 发布的,遵守 GNU Lesser General Public License( LGPL)和 GNU Gener

11、al 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

12、 文件,这个文件将作为产品发布时使用的驱动程序。 USB 驱动程序安装完毕后,可用在系统的“设备管理器”中看到已经正常工作的 USB 设备。 运行 自带的 testlibusb-win.exe 程序就能读出 USB 设备信息。 下图是 USB 设备 类 的描述符 信息。 5.2 上 位机 USB 编程 libusb 设计了一系列 API 为应用程序所调用,通过这些 API 应用程序可以操作 USB 硬件 。将 libusb-win32 自带的 libusb0.dll,libusb.lib,usb.h 三个文件添加到上位机程序中。 通过使用七个函数,就可以与 USB 设备进行简单通信了,通信的主

13、要流程可分为以下四步: 1) 调用 usb_init 函数,进行初始化。 2) 打开要进行通信的 USB 设备的句柄。首先依次调用 usb_find_busses、usb_find_devices 和 usb_get_busses 这三个函数,获得已找到的 USB 总线序列;然后通过链表遍历所有的 USB 设备,根据已知的要打开 USB 设备的 ID( VID/PID),找到相应的 USB 设备;最后调用 usb_open 函数打开该 USB 设备(在这里假设总线上没有相同 VID 和 PID 的 USB 设备。如果总线上存在着相同 VID 和 PID 的设备,还需要进行其他条件判断,比如设备

14、名称,以保证是打开的是期望的 USB 设备)。 3) 与 USB 设备进行通信。使用 usb_bulk_read/usb_bulk_write函数,向 USB 设备读取数据或写入数据。 4) 关闭 USB 设备。完成所有操作后,调用 usb_close 函数关闭已经打开的 USB 设备。 void libusb_test() usb_dev_handle *dev = NULL; /* the device handle */ char tmpBUF_SIZE; int ret; usb_init(); /* initialize the library */ usb_find_busses(); /* find all busses */ usb_find_devices(); /* find all connected devices */ if (!(dev = open_dev() printf(error opening device: n%sn, usb_strerror(); return ; else printf (success: device %04X:%04X openedn, MY_VID, MY_PID); usb_set_configuration(dev,1); u

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号