如何修改USB CDC成为自定义USB Bulk批量传输设备
- 格式:pdf
- 大小:531.43 KB
- 文档页数:9
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(Universal Serial Bus)是一种常见的数据传输接口,广泛应用于电脑、手机、相机等设备上。
USB批量传输是指通过USB接口同时传输多个数据包的技术,它能够提高传输速度,提升数据传输效率。
下面将详细介绍USB批量传输的原理。
USB批量传输是基于USB的Bulk传输类型而实现的。
Bulk 传输是一种高吞吐量的传输方式,用于传输大量的数据,其特点是传输速度较慢,但可保证数据的可靠性和完整性。
批量传输是在Bulk传输的基础上实现一次传输多个数据包的技术。
在USB批量传输中,需要有一个主机(通常是计算机)和一个或多个设备。
主机负责控制和管理数据传输,设备则按照主机的指令进行数据的发送和接收。
USB批量传输的原理如下:1. 握手阶段:主机通过发送控制命令来和设备建立连接,进行握手。
这个过程类似于USB的初始化过程,主机和设备交换一系列的控制信息,确认传输的方式和参数。
2. 数据传输阶段:一旦握手成功,主机就可以发送数据给设备或者从设备接收数据。
在数据传输阶段,主机将数据分成多个数据包,然后通过USB接口将这些数据包发送给设备。
设备接收到数据包后,进行解析并执行相应的操作。
3. 应答阶段:设备在接收到数据包后,通过设置一个特定的应答位来告知主机数据包是否成功接收。
主机接收到设备的应答后,可以继续发送下一个数据包。
4. 重传机制:如果设备在接收数据包时出现错误,或者数据包在传输过程中丢失,主机会发起重传的请求,重新发送丢失或错误的数据包,确保数据的完整性。
5. 传输完毕:当主机发送完所有的数据包后,会发送一个结束符号给设备,告知传输结束。
设备接收到结束符号后,可以进行相应的处理,然后通知主机传输完毕。
通过上述步骤,USB批量传输实现了高效的数据传输。
在实际应用中,主机和设备之间还可以进行其他的通信,如命令传输、状态传输等,以实现更多的功能。
需要注意的是,USB批量传输的速度受限于设备的性能和USB接口的版本。
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上的信息。
/********************************设备描述符************************************/const uint8_t V irtua l_Com_Port_Devi ceDes cript or[]={0x12, /*描述符的长度 18个字节*/ USB_DEVIC E_DES CRIPT OR_TY PE, /*描述符类型 */0x00,0x02, /*本设备所使用的USB协议版本*/ 0xF F, /* 设备类代码:CDC */ /* 0x02->0x ff自定义设备*/0x00, /*子类代码*/ 0x00, /* 设备所使用的协议 */0x40, /*端点0 最大包长*/ 0x83, 0x04, /* 厂商I D = 0x0483 */ 0x40, 0x57, /* 产品ID = 0x7540 */0x00,0x02, /*设备版本号 = 2.00 */ 1, /*描述厂商的字符串的索引 */2, /* 描述产品的字符串的索引*/ 3, /*产品序列号索引*/ 0x01/* 可能的配置数*/};/********************************配置描述符************************************/const uint8_t V irtua l_Com_Port_Conf igDes cript or[]={ /*配置描述符*/ 0x09, /* 配置描述符的长度 9字节*/ /* b Lengt h 大小为1字节,表示该描述符的长度。
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例程修改步骤以下是将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(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设备转换成以太网设备。
OTG 主机库在BULK 传输上对NAK 的处理 问题:某客户使用STM32F4的OTG 库做USB 主机控制Wifi 网卡。
使用BULK 传输类型时,从数据读取数据时,如果设备返回需要把设备返回的NAK 状态告知上层应用,该如何修改OTG 库。
调研:先来看看OTG 库当前对BULK 类型传输,IN 和OUT 方向上的NAK 的处理方式:一旦重新使能该通道,主机硬件又自动发送IN 令牌来企图从设备获取数据,直到设备准备好数据后,不再回复NAK 握手,而是回复主机要获取的数据,然后主机硬件回复ACK 来结束本次transfer 。
BULK IN 通道对NAK 的处理和CTRL IN 通道对NAK 的处理,在ISR 中是一样的;但是在驱动库里,对CTRL IN 有超时限制,而对BULK IN 没有。
就是说对于常用来做枚举传输的CTRL 传输,当启动从设备获取信息,但是久久未得的情况下,会走到Timeout 的处理分支。
从代码里我们可以看到但是BULK IN 通道对NAK 的接收没有超时控制,因为BULK 传输本身的性质就是不保证带宽的,即如果主机上有很多其他优先级更高的周期类型的传输(同步ISO 传输和中断INT 传输),则在BULK 传输有可能无限延迟。
从代码里可以看到CTRL OUT 收到NAK 后会把该状态上传APP ,如图然后在库代码处理控制传输时,如果检测到这个状态,就会重新发送OUT 令牌和数据包,如图因此,当CTRL IN 收到NAK 后,如果想把状态上传给App ,则可以模仿CTRL OUT 对NAK 的处理。
首先, ISR 中的处理可以模仿CTRL OUT ,在BULK 传输的处理中,对每次发送IN 令牌的地方(USBH_BulkReceiveData )查询传输状态,如果URB_NOTREADY 就由App 来决定如何处理。
处理:基于U 盘读写的例程,在每次USBH_BulkReceiveData 之后检查状态,如果是URB_NOTREADY 就重新发送IN 令牌。
如何修改STM32的USB例程为自己所用技术分类:微处理器与DSP | 2008-08-06作者:computer00EDN博客精华文章作者:computer00痛下决心一定要把USB的程序搞懂,也许表述有很多错误的地方,欢迎指正。
USB需要一个主机host和设备device。
USB设备和主机的通信需要先建立virtual pipeline,然后设备传回描述符给主机。
joystick 属于HID设备,工作在中断方式。
但并非通常单片机所谓的中断,而实际上是查询的方式。
USB采用NRZI编码,而且需要位填塞,但是这些工作通过硬件SIE serial inteRFace engine完成,编程不用关心。
USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。
什么封包格式等好像程序没有涉及。
而描述符就需要程序来提供了。
usb_desc.c 提供了设备、端点、接口、字符串、群组、制造商描述符usb_prop.c 提供了Device_Property, Device_Table &USER_STANDARD_REQUEST 结构描述,这3个东东定义于usb_core.c。
hw_config.c 提供了实际硬件需要的操作函数,Joystick_Send()通过函数UserToPMABufferCopy 和SetEPTxValid 将坐标值发给了USB端口。
STM32f10x_it.c 里面有void USB_LP_CAN_RX0_IRQHandler(void){USB_Istr(); //定义于usb_istr.c}单击此处下载整个范例程序包:在万利学习板自带的演示例程中,有几个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 */。
M C U芯片验证中的U S B模块批量传输验证宁振海1,2,赵东艳1,唐晓柯1,李德建1,杨立新1,白志华1(1.北京智芯微电子科技有限公司国家电网公司重点实验室电力芯片设计分析实验室,北京100192;2.北京智芯微电子科技有限公司北京市电力高可靠性集成电路设计工程技术研究中心)摘要:U S B具有简单易用㊁场景广泛㊁灵活便携㊁成本低廉㊁鲁棒性好等优点,越来越多的嵌入式M C U芯片中包含了U S B模块,以便于M C U与P C或外围其他设备的通信㊂本文主要介绍了M C U芯片验证中U S B模块验证的一些经验和方法,U S B涵盖了4种传输方式,本文仅对U S B批量传输的验证阐述一种方法㊂关键词:U S B;芯片验证;批量传输中图分类号:T P368.1文献标识码:AB u l k T r a n s m i s s i o n V e r i f i c a t i o n o f U S B M o d u l e i n MC U C h i p V e r i f i c a t i o nN i n g Z h e n h a i1,2,Z h a o D o n g y a n1,T a n g X i a o k e1,L i D e j i a n1,Y a n g L i x i n1,B a i Z h i h u a1(1.S t a t e G r i d K e y L a b o r a t o r y o f P o w e r I n d u s t r i a l C h i p D e s i g n a n d A n a l y s i s T e c h n o l o g y,B e i j i n g S m a r t-C h i pM i c r o e l e c t r o n i c s T e c h n o l o g y C o.,L t d.,B e i j i n g100192,C h i n a;2.B e i j i n g E n g i n e e r i n g R e s e a r c h C e n t e r o fH i g h-r e l i a b i l i t y I C w i t h P o w e r I n d u s t r i a l G r a d e,B e i j i n g S m a r t-C h i p M i c r o e l e c t r o n i c s T e c h n o l o g y C o.,L t d.)A b s t r a c t:U SB h a s t h e a d v a n t a g e s o f e a s y-t o-u s e,w i d e-r a n g e,f l e x i b l e a n d p o r t a b l e,l o w c o s t a n d h i g h r o b u s t n e s s.M o r e a n d m o r e e m b e d-d e d MC U s c o n t a i n U S B m o d u l e s t o f a c i l i t a t e t h e c o mm u n i c a t i o n b e t w e e n M C U a n d P C o r o t h e r p e r i p h e r a l d e v i c e.I n t h e p a p e r,s o m e e x-p e r i e n c e s a n d m e t h o d s o f U S B m o d u l e v e r i f i c a t i o n i n M C U v e r i f i c a t i o n a r e i n t r o d u c e d.U S B c o v e r s f o u r t r a n s m i s s i o n m o d e s.I n t h e p a-p e r,t h e m e t h o d f o r v e r i f i c a t i o n o f U S B b u l k t r a n s m i s s i o n i s i n t r o d u c e d o n l y.K e y w o r d s:U S B;c h i p v e r i f i c a t i o n;b u l k t r a n s m i s s i o n引言在芯片验证中,一般针对芯片内每一个模块都会做相应的功能验证和性能验证㊂其中功能验证是最基本的验证内容,只有在功能验证的基础上才可开展性能验证㊂本文研究的一款M C U中包含了U S B模块,在嵌入式M C U 中,U S B协议相对于其他一些基本的传输协议较为复杂, U S B模块验证工作自然也是重点和难点㊂本文即对U S B的基本协议内容和部分验证方法做了阐述㊂1基本概念U S B规范中定义了U S B主机和U S B设备㊂主机作为通信的发起方,在整个通信中占有主导地位㊂下面就U S B通信的数据流㊁主机与设备之间的识别来概括介绍一下这些基本概念㊂同时为了方便介绍后面的测试方法,这里还对F A T32进行简单介绍㊂1.1U S B通信的数据流组成U S B 通用串行总线,顾名思义其传输的数据是由一位一位的串行二进制构成的㊂若干位二进制构成了U S B 域,若干个域组合构成U S B包,两个或三个包组合构成事务,一个或多个事务组成传输,在应用层面还把实现不同功能的U S B设备类型归为不同的U S B类㊂下面分别介绍U S B的域㊁包㊁事务㊁传输和类㊂图1是U S B通信单元的关系分层图㊂图1U S B通信单元分层图①域是U S B的最小单位,由若干位组成,可分为7种类型:同步域㊁标识域㊁地址域㊁端点域㊁帧号域㊁数据域㊁校验域㊂②包由若干域构成,分为4种类型,分别是令牌包㊁数据包㊁握手包和特殊包,不同类的包又分成几种具体的包(见图1)㊂③U S B 事务是指向端点传递的服务,通常是由令牌包㊁可选的数据包和可选的握手包组成㊂④U S B 传输是在客户软件程序及其功能设备之间移动信息的一个或多个U S B 事务,分为控制传输㊁中断传输㊁同步(等时)传输㊁批量传输4种传输类型㊂这里说一下批量传输,批量传输可通过错误检测和重试的方法保证数据在主机和设备之间无错误的传输㊂批量传输包括了三个阶段:令牌㊁数据和握手㊂图2所示是批量传输事务流程的示意图(P I N G 和N Y E T 包只能在高速操作的设备中使用)㊂图2批量传输事务流程的示意图图4 F A T 32文件系统结构⑤类不属于通信单元,是在应用的层面把U S B 加以区分,U S B 类的数据通信由一种或几种传输完成,比如常用的U 盘设备是大容量存储类(M a s s S t o r a ge C l a s s ,M S C ),键盘/鼠标设备是人机接口类(H u m a n I n t e rf a c eD e v i c e s ,H I D )㊂1.2 U S B 的枚举过程U S B 总线由V B U S ㊁D -㊁D +㊁G N D 四根线构成,U S B 的数据传送依靠D +㊁D -这对差分信号线㊂在U S B 设备接入U S B 主机时,主机通过D +或D -上的电平变化来检测设备的接入;识别到有U S B 设备后,U S B 主机采用U S B 标准请求获取U S B 设备的相关信息并作相应的设置,配置完成U S B 的枚举过程㊂图3是U S B 枚举过程流程图㊂①U S B 主机复位,U S B 总线获得一个确定的总线状态;②U S B 主机通过默认0地址获取U S B 设备的设备描述符(前8字节,从而知道端点0的图3 U S B 枚举过程最大包长);③U S B 主机再次复位U S B总线;④U S B 主机给U S B 设备分配一个地址;⑤U S B 主机通过分配的地址获取U S B 设备的设备描述符(全部);⑥U S B 主机获取U S B 设备的配置描述符(前8字节);⑦U S B 主机获取U S B 设备的配置描述符集合(配置描述符㊁接口描述符㊁类特殊描述符㊁端点描述符);⑧U S B 主机获取U S B 设备的字符串描述符和语言描述符;⑨U S B 主机设置U S B 设备的配置(因为配置可能不止一个,由主机控制使用哪个配置)㊂1.3 F A T 32文件系统简介F A T 32文件系统是一种比较常见的文件系统,其内部结构组成如图4所示,包括保留区㊁F A T 区和数据区㊂保留区中包含了D B R (系统引导扇区)和F S I N F O ,D B R 在文件系统的0扇区处,其包含了文件系统的各种配置信息(文件系统大小㊁F A T 区起始地址㊁F A T 区大小㊁数据起始地址等)㊂F S I N F O 记录文件系统剩余簇的数量及下一个可用簇的簇号信息㊂F A T 区的大小和起始地址可通过D B R 中的相关信息确定㊂F A T 区包括了两个完全相同的F A T 表,F A T 表中按4字节一个表项划分㊂通过F A T 表项可以描述簇的状态及表明文件或目录的下一簇的簇号㊂数据区是真正用于数据存储的区域㊂数据区下包含了目录和文件,文件系统的第一个目录被称为根目录㊂目录下包含了一条条的目录项,记录着此目录下文件的以下信息:文件大小㊁文件创建时间㊁文件修改时间㊁文件的起始地址等㊂文件系统在被P C 识别时首先获取D B R 信息,解析D B R 计算出F A T 区和数据区的地址和大小,并定位根目录起始地址㊂通过目录中的目录项获取文件的起始位置,若文件大于一个簇,P C 会通过F A T 表找到存储文件的下一个簇的地址㊂至此,P C 即可访问整个文件系统的文件㊂2 U S B 模块批量传输的测试测试M C U 的U S B 模块是依照上述介绍的内容将M C U 实现成为了一个虚拟的U 盘,虚拟U 盘的文件系统采用F A T 32㊂通过测试虚拟U 盘来测试U S B 模块的功能㊂2.1 U S B 部分的实现U 盘是一个大容量存储的U S B 设备,使用的是批量传输,其指令采用了S C S I 指令集㊂在按照上述内容实现了U S B 的枚举和读写的同时,还需要实现S C S I 指令集的处理,其处理过程如图5所示㊂下面是相应的指令解释㊂①T e s t U n i t R e a d y :用于监测U 盘是否处于准备好的状态,对于可移除磁盘,P C 会每秒发送一次此指令㊂②I n q u i r y :获取U 盘设备的一些基本信息,如是否为可移除磁盘㊁I S O 版本号㊁A N S I 版本号等内容㊂③R e a d F o r m a t C a p a c i t y :获取U 盘格式化容量信息㊂④R e a d C a p a c i t y:获取U 盘容量信息㊂⑤R e a d 10:读取U 盘内容的指令,可根据指定地址读取相应存储空间的信息㊂⑥W r i t e 10:写U 盘指令,可以向指定的地址空间写入相应的数据㊂2.2 虚拟U 盘F A T 32文件系统部分的实现本次目标是验证U S B 的批量传输,并不需要涉及到存储的操作,所以这里的U 盘文件系统被枚举挂载的是虚拟U 盘㊂U 盘挂载到P C 之后,P C 对U 盘的数据读取操作是从M C U 固定R AM 地址读取固定数据,P C 对U盘的数据写入操作直接被M C U 丢弃㊂虚拟U 盘文件系统之所以能在P C 上显示出已格式化的磁盘设备,是因为其在P C 读取对应的F A T 32文件系统保留区㊁F A T 区㊁数据区地址内容时返回了相应的文件系统数据㊂图6是PC图5 U 盘S C S I 指令处理流程图识别U 盘F A T 32文件系统的流程图㊂图6 P C 识别U 盘F A T 32文件系统流程图虚拟U 盘的文件系统挂载是为了测试U S B 模块的批量传输,不必要具体参与D B R ㊁F A T ㊁数据区内容的编辑㊂本验证通过格式化一个普通U 盘,使用W i n H e x 软件获取相应文件系统区域的内容和对应地址㊂图7是通过W i n H e x 软件获取文件系统关键区域的方法,按照此方法依次获取D B R ㊁F A T 区和数据区的地址和内容,将获取的数据应用在图6所示的流程图对应的程序段中㊂图7 U 盘D B R 获取方法示意图2.3 测 试首先,可以通过上述方式实现U 盘功能,能够枚举并且挂载磁盘,已经可以说明U S B 通路的通信是能正常运行的㊂其次,在U 盘正常枚举之后可以通过U 盘测试软件测试其速度性能㊂图8是M C U U S B 作为U 盘时的读写性能测试结果(写为20.1M B /s ,读为23.7M B /s)㊂最后,可通过P C 软件长时间不间断地对U 盘进行读写,测试U S B 通信功能的稳定性㊂结 语U S B 具有应用场景广泛㊁成本低廉㊁易用便携等优点,且其所对应的设备类型多种多样,但其传输类型只有图8 虚拟U 盘速度测试结果4种㊂本文仅针对批量传输测试介绍了一种方法,而对于全面的U S B 测试还应针对其他三种传输类型作相应的测试及协议一致性验证㊂参考文献[1]U S B I m p l e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s S pe c if i c a -t i o n R e v 2.0,2000.[2]U S B I m pl e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s M a s s S t o r -a g e C l a s s B u l k -O n l y T r a n s po r t .R e v 1.0,1999.[3]U S B I m pl e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s M a s s S t o r -a g e C l a s s U F I C o mm a n d S p e c i f i c a t i o n .R e v 1.0,1998.[4]刘荣.圈圈教你玩U S B [M ].2版.北京:北京航空航天大学出版社,2013.[5]周立功.U S B 2.0与O T G 规范及开发指南[M ].北京:北京航空航天大学出版社,2004.[6]马林.数据重现 文件系统原理精解与数据恢复的最佳实践[M ].北京:清华大学出版社,2009.(责任编辑:薛士然 收稿日期:2018-06-01) 网络防御问题,导致网络安全对策缺乏针对性㊂本文将防御因素量化融入攻击节点的属性中,借助HMM 动态分析手段,计算不同状态转移的安全概率,确定风险出现概率高的节点㊂HMM 分析为双重动态分析,借助V i t e r b i 法确定最大概率的状态转换序列,依据最可能攻击节点路径,推断攻击者的目标意图,为安全管理决策提供量化支撑,提高安全管理的可靠性㊂本文在V i t e r b i 算法中的动态因素影响权重问题㊁变量路径的衍生分析,以及路径优化算法方面存在不足,有待进一步分析研究㊂参考文献[1]陈小军,时金桥,徐菲,等.面向内部威胁的最优安全策略算法研究[J ].计算机研究与发展,2014,2(7):15651577.[2]戚湧,刘敏,李千目.基于扩展马尔科夫链的攻击图模型[J ].计算机工程与设计,2014(12):41314135.[3]刘仁山,孟祥宏.攻击图和HMM 结合的网络安全风险评估方法研究[J ].信阳师范学院学报:自然科学版,2015(1):146150.[4]李庆朋,王布宏,王晓东,等.基于攻击图节点概率的网络安全度量方法[J ].计算机应用研究,2013,30(3):906908.[5]陈小军,方滨兴,谭庆丰,等.基于概率攻击图的内部攻击意图推断算法研究[J ].计算机学报,2014,37(1):6272.[6]陈洁群.基于V i t e r b i 改进算法的汉语数码语音识别系统[J ],微型机与应用,2017,2(14):1113.[7]李丽敏,王仲生,姜洪开.基于多状态M O G HMM 和V i t e r b i的航空发动机突发故障预测振动[J ].测试与诊断,2014,3(2):310314.严纪珊(工程师),主要研究方向为网络安全和信息安全㊂(责任编辑:薛士然 收稿日期:2018-06-08)。