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

合集下载

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

如何修改USBCDC成为自定义USBBulk批量传输设备(精)
'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变量相关的判断代码。
0x03, //iSerialNumber域,设备序号的字符串描述符索引:3
0x01 //bNumConfigurations域,该USB设备支持的配置数目:1个
};
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

USB设备的Bulk模式驱动程序设计

USB设备的Bulk模式驱动程序设计

USB设备的Bulk模式驱动程序设计引言通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设硬件制造商广泛采纳。

USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输。

USB设备支持打印机、扫描仪、数码相机等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输。

USB设备驱动的整体结构USB设备驱动的整体结构包括如下五个主要部分:USB应用程序接口、USB设备驱动函数、USB中断服务程序、USB回调接口程序、USB标准事件处理程序。

图1 USB设备驱动程序的整体结构USB应用程序接口USB应用程序接口主要功能是对USB驱动器进行软硬件初始化、打开端口、关闭端口、读端口、写端口和端口控制操作。

当设备驱动器装入系统设备表时,I/O系统就调用该应用程序接口。

USB应用程序接口的一个例程所包含的函数:·USB_init( ) -- USB端口驱动函数的安装和初始化、硬件配置。

·USB_open( ) -- 打开USB端口。

·USB_close( ) -- 关闭USB端口。

·USB_read( ) -- 对USB端口进行读操作。

·USB_write( ) -- 对USB端口进行写操作。

·USB_ioctl( ) -- 对USB设备进行I/O控制操作。

USB设备驱动函数1、USB_init()-- 初始化USB端口USB_init函数初始化特定USB端口驱动器,进行软硬件配置。

初始化步骤如下:(1)将USB设备驱动器安装到I/O系统设备表中。

(2)获取USB控制器使用的中断号。

(3)获取各端口所需的系统资源,包括内存、信号量和消息队列。

(4)初始化USB驱动器数据结构与USB端口状态寄存器。

(5)启动USB标准事件处理程序。

usb批量传输原理

usb批量传输原理

usb批量传输原理USB(Universal Serial Bus)是一种常见的数据传输接口,广泛应用于电脑、手机、相机等设备上。

USB批量传输是指通过USB接口同时传输多个数据包的技术,它能够提高传输速度,提升数据传输效率。

下面将详细介绍USB批量传输的原理。

USB批量传输是基于USB的Bulk传输类型而实现的。

Bulk 传输是一种高吞吐量的传输方式,用于传输大量的数据,其特点是传输速度较慢,但可保证数据的可靠性和完整性。

批量传输是在Bulk传输的基础上实现一次传输多个数据包的技术。

在USB批量传输中,需要有一个主机(通常是计算机)和一个或多个设备。

主机负责控制和管理数据传输,设备则按照主机的指令进行数据的发送和接收。

USB批量传输的原理如下:1. 握手阶段:主机通过发送控制命令来和设备建立连接,进行握手。

这个过程类似于USB的初始化过程,主机和设备交换一系列的控制信息,确认传输的方式和参数。

2. 数据传输阶段:一旦握手成功,主机就可以发送数据给设备或者从设备接收数据。

在数据传输阶段,主机将数据分成多个数据包,然后通过USB接口将这些数据包发送给设备。

设备接收到数据包后,进行解析并执行相应的操作。

3. 应答阶段:设备在接收到数据包后,通过设置一个特定的应答位来告知主机数据包是否成功接收。

主机接收到设备的应答后,可以继续发送下一个数据包。

4. 重传机制:如果设备在接收数据包时出现错误,或者数据包在传输过程中丢失,主机会发起重传的请求,重新发送丢失或错误的数据包,确保数据的完整性。

5. 传输完毕:当主机发送完所有的数据包后,会发送一个结束符号给设备,告知传输结束。

设备接收到结束符号后,可以进行相应的处理,然后通知主机传输完毕。

通过上述步骤,USB批量传输实现了高效的数据传输。

在实际应用中,主机和设备之间还可以进行其他的通信,如命令传输、状态传输等,以实现更多的功能。

需要注意的是,USB批量传输的速度受限于设备的性能和USB接口的版本。

USB设备Bulk配置描述符

USB设备Bulk配置描述符
0x00, /* 描述该配置的字符串索引值 */
/* iConfiguration 大小为1字节。描述该配置的字符串索引值。0表示没有字符串 */
/********************************功能描述符************************************/
// 0x01, /* 配置描述符子类型 */
// /* bDescriptorSubtype 大小为1字节。表示描述符类型,调用管理功能描述符 */
// 0x00, /* 描述设备的能力 */
// /* bmCapabilities 大小为1字节
// 0x24, /* 配置描述符类型 */
// /* bDescriptorType 大小为1字节。表示描述符类型,CS_INTERFACE编码固定为0X24 */
// 0x02, /* 配置描述符子类型 */
// /* bDescriptorSubtype 大小为1字节。表示描述符类型,Abstract Control Management desc */
D7保留必须置为1
D6表示供电方式 1自供电 0总线供电
D5表示是否支持远程唤醒 1支持
D4-D0保留 必须置为0
*/
0x64, /* 设备所需要的电流 单位:200mA */
/* bMaxPower 大小为1字节,表示设备需要从总线获取的最大电流量 */
/*********************抽象控制管理功能描述符**********************************/
// /*ACM Functional Descriptor*/
// 0x04, /* 描述符的长度 4字节 */

USB host 工作流程

USB host 工作流程

USB枚举步骤USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态(Attached)和挂起状态(Suspend))。

Attached和Powered状态不难理解:当一个设备被正确插入到主机的USB接口时,就处于Attached(连接)的状态。

设备连接好了,USB主机识别了设备,同时没有对设备进行请求,USB 设备就处于Suspended(挂起)状态.下面步骤是Windows系统下典型的枚举过程,但是固件不能依此就认为所有的枚举操作都是按照这样一个流程行进。

设备必须在任何时候都能正确处理所有的主机请求.1. 用户把USB设备插入USB端口或给系统启动时设备上电这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。

Hub给端口供电,连接着的设备处于上电状态。

2. Hub监测它各个端口数据线上(D+/D-)的电压在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。

当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。

hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在后面的章节中描述)。

检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。

3. Host了解连接的设备每个hub利用它自己的中断端点向主机报告它的各个端口的状态(对于这个过程,设备是看不到的,也不必关心),报告的内容只是hub端口的设备连接/断开的事件。

如果有连接/断开事件发生,那么host会发送一个Get_Port_Status请求(request)以了解更多hub上的信息。

USB设备Bulk配置描述符

USB设备Bulk配置描述符

/****‎*****‎*****‎*****‎*****‎*****‎***设备‎描述符**‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎cons‎t uin‎t8_t ‎V irtu‎a l_Co‎m_Por‎t_Dev‎i ceDe‎s crip‎t or[]‎=‎{‎0x12‎, /‎*描述符‎的长度 1‎8个字节‎*/‎ USB‎_DEVI‎C E_DE‎S CRIP‎T OR_T‎Y PE, ‎ /‎*描述符‎类型 */‎‎0x00,‎‎0x02,‎ /*‎本设备所‎使用的US‎B协议版本‎*/‎ 0x‎F F, ‎/* 设‎备类代码:‎CDC ‎*/ ‎/* 0x‎02->0‎x ff自定‎义设备*/‎‎0x00,‎ /*‎子类代码‎*/‎ 0x‎00, ‎/* 设‎备所使用的‎协议 */‎‎0x40,‎ /*‎端点0 ‎最大包长‎*/‎ 0x8‎3,‎ 0x0‎4, ‎/* 厂商‎I D = ‎0x048‎3 */‎ 0‎x40,‎ 0‎x57, ‎ /* ‎产品ID ‎= 0x7‎540 *‎/‎0x00‎,‎0x02‎, /‎*设备版‎本号 = ‎2.00 ‎*/‎ 1, ‎‎‎ /*‎描述厂商‎的字符串的‎索引 */‎‎2, ‎‎‎/* 描‎述产品的字‎符串的索引‎*/‎ 3,‎‎‎ /‎*产品序‎列号索引‎*/‎ 0x0‎1‎/* 可能‎的配置数‎*/‎};‎/****‎*****‎*****‎*****‎*****‎*****‎***配置‎描述符**‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎cons‎t uin‎t8_t ‎V irtu‎a l_Co‎m_Por‎t_Con‎f igDe‎s crip‎t or[]‎=‎{‎ /*‎配置描述符‎*/‎ 0x0‎9, ‎/* 配置‎描述符的长‎度 9字节‎*/‎‎ /* ‎b Leng‎t h 大小‎为1字节,‎表示该描述‎符的长度。

基于USB+CDC的虚拟以太网接口研究与设计

1
华中科技大学硕士学位论文
要单独的以太网控制器与外围接口,增加以太网接口必然使系统成本的增加与产品 尺寸扩大。如何使用 USB 接口来虚拟以太网接口不仅具有研究意义,也有广泛的现 实需求。
一种基于 USB 通讯设备类协议 CDC(Communication Devices Class Specification) 的 技 术 就 可 以 将 USB 虚 拟 成 不 同 的 通 讯 设 备 接 口 , 其 中 的 以 太 网 控 制 模 型 ECM(Ethernet Networking Control Model)与以太网仿真模型 EEM(Ethernet Emulation Model)可以将其虚拟为一个标准的以太网接口[3][4]。自从 USB CDC 规格发布以来, 国外的软硬件公司都使用 USB CDC 在 USB 上实现一些通讯接口的功能,如串口, ISDN,ATM,以太网等。Microsoft 在 WINXP 版本上内置了基于 CDC 的 RNDIS 驱 动,使得在 WINXP 下可以无缝的连接基于 RNDIS 的 USB 以太网接口设备。Linux 在 2.6 以后的版本就缺省支持基于 CDC 的以太网接口(usbnet)与串口。在 Linux 内核中,usbnet 模块用于创建 USB 虚拟以太网设接口。创建成功后,这一虚拟网络 接口便可以如同标准网络接口一样被指定一个 IP 地址。USB 电缆连接上后,usbnet 模块便能使 USB 虚拟的以太网接口 ping 测其它 IP 地址,甚至“谈论”DHCP,HTTP, NFS, telnet, 和 ftp[5]。简言之,任何在实际的以太网接口上运行的应用将不折不 扣地在 USB 虚拟以太网接口上得到实现,因为它们不能分辨出其正在使用的是真实 的以太网硬件接口还是 USB 虚拟的以太网接口。

USB-CDC虚拟串口(VCP)收发数据

USB-CDC虚拟串口(VCP)收发数据用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。

此功能方便用来作为程序的调试输出到电脑查看。

所用函数描述:(1)USB接口CDC发送数据CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)Buf: 传输的数据指针Len: 传输数据的长度(2)USB接口CDC接收数据CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)Buf: 接收的数据指针,不需处理Len: 接收数据的长度,需要处理示例:(1)打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。

/* USER CODE BEGIN PRIVATE_DEFINES *//* Define size for the receive and transmit buffer over CDC *//* It's up to user to redefine and/or remove those define */#define APP_RX_DATA_SIZE 64 //修改接收数据长度#define APP_TX_DATA_SIZE 64 //修改发送数据长度/* USER CODE END PRIVATE_DEFINES *//* USER CODE BEGIN PRIVATE_VARIABLES *//* Create buffer for reception and transmission *//* It's up to user to redefine and/or remove those define *//* Received Data over USB are stored in this buffer */uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];/* Send Data over USB CDC are stored in this buffer */uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];uint8_t DataLen; //定义接收数据长度变量/* USER CODE END PRIVATE_VARIABLES */(2)修改CDC_Receive_FS ()函数,添加接收数据长度的赋值:static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改!!!return (USBD_OK);/* USER CODE END 6 */}(3)修改main.c文件,先声明外部变量/* USER CODE BEGIN PV */extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量extern uint8_t DataLen; //声明接收数据长度外部变量/* USER CODE END PV */(4)编辑主循环函数,当按下按键时,发送HelloWorld到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64./* USER CODE BEGIN WHILE */uint8_t MyTxData[12] = "HelloWorld\n"; //定义字符串while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键{while(CDC_Transmit_FS(MyTxData, 12)); //发送字符串到电脑HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯HAL_Delay(20);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键 }if(DataLen > 0) //判断是否接收到数据{while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去DataLen = 0; //清除数据长度标记}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。

STM32的USB例程修改步骤

STM32的USB例程修改步骤STM32的USB例程修改步骤以下是将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。

一、usb_desc.c文件根据你程序使用的通信方式修改。

usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC 接口描述符(主要用于实现USB转串口)等。

具体方法可以下载个“电脑圈圈”使用D12编写的例子。

二、Usb_conf.h 文件:1、修改需要处理那些中断CNTR_CTRM处理数据正确传输后控制,比如说响应主机CNTR_DOVRM/* DMA OVeR/underrun Mask */CNTR_ERRM/* ERRor Mask */CNTR_WKUPM 0/* WaKe UP Mask */CNTR_SUSPM/* SUSPend Mask */CNTR_RESETM主要处理USB复位后进行一些初始化任务CNTR_SOFM/* Start Of Frame Mask */CNTR_ESOFM/* Expected Start Of Frame Mask */如:usb_conf.h中的#define IMR_MSK (CNTR_CTRM |CNTR_SOFM | CNTR_RESETM )是决定USB_CNTR寄存器中的那个USB相关中断启动还是屏蔽。

2、根据需要增加端点缓存地址,要根据缓存区的地址修改,防止数据重叠如下为根据每个缓冲区的大小为64字节修改:#define ENDP1_TXADDR (0xC0)#define ENDP1_RXADDR (0xD0)#define ENDP2_TXADDR (0x100)#define ENDP2_RXADDR (0x140)#define ENDP3_TXADDR (0x180)#define ENDP3_RXADDR(0x1C0)3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。

usb cdc ecm原理

usb cdc ecm原理USB CDC ECM(Communication Device Class Ethernet Control Model)是一种基于USB接口的通信协议,用于将USB设备转换成以太网设备。

本文将介绍USB CDC ECM的基本原理和工作流程。

USB CDC ECM是一种通信设备类别,它允许USB设备通过USB接口模拟成一个网络适配器,使得计算机可以通过USB接口连接到以太网。

这种通信方式广泛应用于嵌入式系统和物联网设备中,可以方便地实现设备与计算机的数据传输和网络连接。

USB CDC ECM的工作原理如下:当USB设备插入计算机的USB接口时,计算机会自动识别设备并加载相应的驱动程序。

对于支持CDC ECM协议的USB设备,计算机会将其识别为一个网络适配器,并为其分配一个IP地址。

USB CDC ECM协议基于Ethernet控制模型,通过USB传输数据的方式模拟以太网协议。

USB设备与计算机之间的数据传输是通过USB 框架的控制和数据传输端点来实现的。

控制端点用于传输控制命令和状态信息,数据传输端点用于传输数据包。

在USB CDC ECM中,USB设备充当网络适配器的角色,它负责将计算机发送的数据包封装成USB传输协议,并通过USB接口发送给计算机。

USB设备还负责将从计算机接收到的数据包解析,并将数据提供给设备的应用程序处理。

USB CDC ECM协议的优势在于它的简单性和易用性。

与传统的以太网接口相比,USB接口更加普遍和方便,可以在各种设备上使用。

同时,USB CDC ECM协议也可以通过USB总线供电,无需额外的电源线,降低了设备的复杂度和成本。

在实际应用中,USB CDC ECM通常用于嵌入式系统和物联网设备中,例如智能家居设备、工业自动化设备等。

通过将设备连接到计算机,可以方便地进行数据采集、远程监控和设备管理。

USB CDC ECM是一种基于USB接口的通信协议,用于将USB设备转换成以太网设备。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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); }
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);
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;
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))
如何实现自定义 USB Bulk 批量传输设备
厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端 的设备驱动程序,还要开发设备应用程序。
厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(control transaction 控制传 输、bulk transaction 批量传输、interrupt transaction 中断传输、isochronous transfer 实时传 输),当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种 传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有 其固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间, 但中断时间最快是 1ms,而批量传输可以随时发生(受带宽限制),理论上传输速率可以 比中断传输快。
inf-wizard.exe 程序生成驱动程序 inf 文件,这个文件将作为产品发布时使用的驱动程序。
USB 驱动程序安装完毕后,可用在系统的“设备管理器”中看到已经正常工作的 USB 设备。
运行自带的 testlibusb-win.exe 程序就能读出 USB 设备信息。下图是 USB 设备类的描述符信 息。
{ Virtual_Com_App();
} }/* Endwhile */ }
5. 调用 LibUSB-Win32 进行 USB 通信
LibUSB-Win32 是一个用于 Windows 操作系统(Win98SE、WinME、Win2k 和 WinXP)上的 通用 USB 设备驱动程ቤተ መጻሕፍቲ ባይዱ。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况 下,可以访问 Windows 系统上的任意一个 USB 设备。该驱动程序具有以下特点:
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, 它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大 包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它 来配置设备。
5.2 上位机 USB 编程
libusb 设计了一系列 API 为应用程序所调用,通过这些 API 应用程序可以操作 USB 硬件。 将 libusb-win32 自带的 libusb0.dll,libusb.lib,usb.h 三个文件添加到上位机程序中。通过使用 七个函数,就可以与 USB 设备进行简单通信了,通信的主要流程可分为以下四步:
if (dev) {
usb_close(dev); } }
运行在 PC 的上位机程序,发送 64 字节 运行在 Kinetis MCU 上的 USB Bulk 接收 64 字节
} , {
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 } };
usb_init(); /* initialize the library */ usb_find_busses(); /* find all busses */ usb_find_devices(); /* find all connected devices */
if (!(dev = open_dev())) {
Freescale USB Stack 4.1.1 协议栈(/usb)已经提供了标准的设备类驱 动。为了实现自定义的 bulk 批量传输设备,我们可以参考现有的 CDC 通信设备类,在 CDC 的源代码基础上进行修改,快速实现自定义 USB Bulk 批量传输设备。
= { 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 };
5.1 安装 PC 上位机驱动程序
将修改后的 CDC 代码编译下载到 Kinetis MCU 运行,连接 PC 与 MCU Device 之间的 USB Cable,PC 电脑提示发现新硬件。
通过 LibUSB-Win32 自带的 inf-wizard.exe 生成向导可以生成 USB 驱动程序。inf-wizard.exe 程序扫描系统活动的 USB 设备,选择需要生成驱动程序的设备。
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;
/* structure containing details of all the endpoints used by this device */ USB_EP_STRUCT ep[CDC_DESC_ENDPOINT_COUNT] = {
相关文档
最新文档