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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 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
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 的设备,还 需要进行其他条件判断,比如设备名称,以保证是打开的是期望的 USB 设备)。
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;
} , {
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 } };
5.1 安装 PC 上位机驱动程序
将修改后的 CDC 代码编译下载到 Kinetis MCU 运行,连接 PC 与 MCU Device 之间的 USB Cable,PC 电脑提示发现新硬件。
通过 LibUSB-Win32 自带的 inf-wizard.exe 生成向导可以生成 USB 驱动程序。inf-wizard.exe 程序扫描系统活动的 USB 设备,选择需要生成驱动程序的设备。
= { 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 };
2. 修改端点描述符
端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点, 一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了 数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。 除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为 0, 它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大 包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它 来配置设备。
如何实现自定义 USB Bulk 批量传输设备
厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端 的设备驱动程序,还要开发设备应用程序。
厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(control transaction 控制传 输、bulk transaction 批量传输、interrupt transaction 中断传输、isochronous transfer 实时传 输),当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种 传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有 其固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间, 但中断时间最快是 1ms,而批量传输可以随时发生(受带宽限制),理论上传输速率可以 比中断传输快。
5.2 上位机 USB 编程
libusb 设计了一系列 API 为应用程序所调用,通过这些 API 应用程序可以操作 USB 硬件。 将 libusb-win32 自带的 libusb0.dll,libusb.lib,usb.h 三个文件添加到上位机程序中。通过使用 七个函数,就可以与 USB 设备进行简单通信了,通信的主要流程可分为以下四步:
{ Virtual_Com_App();
} }/* Endwhile */ }
5. 调用 LibUSB-Win32 进行 USB 通信
LibUSB-Win32 是一个用于 Windows 操作系统(Win98SE、WinME、Win2k 和 WinXP)上的 通用 USB 设备驱动程序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况 下,可以访问 Windows 系统上的任意一个 USB 设备。该驱动程序具有以下特点:
if (dev) {
usb_close(dev); } }
运行在 PC 的上位机程序,发送 64 字节 运行在 Kinetis MCU 上的 USB Bulk 接收 64 字节
inf-wizard.exe 程序生成驱动程序 inf 文件,这个文件将作为产品发布时使用的驱动程序。
USB 驱动程序安装完毕后,可用在系统的“设备管理器”中看到已经正常工作的 USB 设备。
运行自带的 testlibusb-win.exe 程序就能读出 USB 设备信息。下图是 USB 设备类的描述符信 息。
usb_init(); /* initialize the library */ usb_find_busses(); /* find all busses */ usb_find_devices(); /* find all connected devices */
if (!(dev = open_dev())) {
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 个 };
Freescale USB Stack 4.1.1 协议栈(http://www.freescale.com/usb)已经提供了标准的设备类驱 动。为了实现自定义的 bulk 批量传输设备,我们可以参考现有的 CDC 通信设备类,在 CDC 的源代码基础上进行修改,快速实现自定义 USB Bulk 批量传输设备。
4. 修改 USB 处理过程
由于自定义的 USB 设备类没有 CDC 的 Set Control Line State 处理过程, 修改 virtual_com.c 文件中 start_transactions 的定义,默认使能传输,或者删除与 start_transactions 变量相关 的判断代码。
while (TRUE) {
/* call the periodic task function */ USB_CDC_Periodic_TFra Baidu biblioteksk();
/*check whether enumeration is complete or not */ if((start_app==TRUE) && (start_transactions==TRUE))
3. 修改字符串描述符
字符串描述符是一种可选的 USB 标准描述符,描述了如制商、设备名称或序列号等信 息。如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为 0。字符串使用的是 Unicode 编码。 uint8_t USB_STR_2[USB_STR_2_SIZE+USB_STR_DESC_SIZE]
tmp[0]= 0x3; ret = usb_bulk_write(dev, 0x3, tmp, 64, 1000); if (ret < 0) {
TRACE("error writing:\n%s\n", usb_strerror()); } else {
TRACE("success: bulk write %d bytes\n", ret); }
能够与任意一个已安装的 USB 设备进行通信 可被用作自己开发的 USB 设备的驱动程序 支持批量和中断传输 支持 USB 规范中定义的所有标准设备请求 支持 USB 设备制造商的自定义请求
LibUsb-Win32 是由 http://libusb-win32.sourceforge.net 发布的,遵守 GNU Lesser General Public License(LGPL)和 GNU General Public License(GPL)许可协议。这些协议明确规定: 允许 LibUsb-Win32 用于商业软件,而不只是开源软件。
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 tmp[BUF_SIZE]; int ret;
printf("error opening device: \n%s\n", usb_strerror()); return ; } else { printf ("success: device %04X:%04X opened\n", MY_VID, MY_PID); } usb_set_configuration(dev,1); usb_claim_interface(dev,0);
相关文档
最新文档