dedecms5.7环保科技公司网站模板,竞价关键词优化软件,建网站域名注册,ios编程语言是什么USB设备的插入检测机制 首先#xff0c;在USB集线器的每个下游端口的D和D-上#xff0c;分别接了一个15K欧姆的下拉电阻到地。这样#xff0c;在集线器的端口悬空时#xff0c;就被这两个下拉电阻拉到了低电平。而在USB设备端#xff0c;在D或者D-上接了1.5K欧姆上拉电阻.…USB设备的插入检测机制 首先在USB集线器的每个下游端口的D和D-上分别接了一个15K欧姆的下拉电阻到地。这样在集线器的端口悬空时就被这两个下拉电阻拉到了低电平。而在USB设备端在D或者D-上接了1.5K欧姆上拉电阻.对于全速和高速设备上拉电阻是接在D上而低速设备则是上拉电阻接在D-上。这样当设备插入到集线器时由1.5K的上拉电阻和15K的下拉电阻分压结果就将差分数据线中的一条拉高了。集线器检测到这个状态后它就报告给USB主控制器或者通过它上一层的集线器报告给USB主控制器这样就检测到设备的插入了。USB高速设备先是被识别为全速设备然后通过HOST和DEVICE两者之间的确认再切换到高速模式的。在高速模式下是电流传输模式这时将D上的上拉电阻断开。 一个简单的实验只用一个上拉电阻接在USB的5V和D或者D-上WINDOWS也会提示发现新硬件但是无法找到驱动程序。这时去设备管理器里面看有显示未知USB设备并且其VID和PID为0。根据这个我们可以简单的判断设备是否枚举成功。如下图所示分别是枚举不成功和枚举成功的图。 USB设备的枚举过程: USB主机在检测到USB设备插入后就要对设备进行枚举了。为什么要枚举呢枚举就是从设备读取一些信息知道设备是什么样的设备如何进行通信这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备很重要的一点就是USB的枚举过程只要枚举成功了那么就已经成功大半了。 在说枚举之前先大概说一下USB的一种传输模式——控制传输。这种传输在USB中是非常重要的它要保证数据的正确性在设备的枚举过程中都是使用控制传输。控制传输分为三个过程①建立过程。②可选的数据过程。③状态过程。建立Setup过程都是由USB主机发起它开始于一个Setup令牌包后面紧跟一个DATA0包。如果是控制输入传输那么数据过程就是输入数据如果是控制输出传输那么数据过程是输出数据。如果在设置过程中指定了数据长度为0则没有数据过程。数据过程之后是状态过程。状态过程刚好与数据过程的数据传输方向相反如果是控制输入传输则状态过程是一个输出数据包如果是控制输出传输则状态过程是一个输入数据包。状态阶段用来确认所有的数据都已经正确传输。 枚举的详细过程。 首先USB主机检测到USB设备插入后就会先对设备复位。设备复位后USB主机就会对地址为0的设备发送获取设备描述符的标准请求。所有的USB设备在总线复位后其地址都为0这样主机就可以跟那些刚刚插入的设备通过地址0通信。主机在建立阶段发出获取设备描述符的输入请求设备收到该请求后在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符后并且确认没有什么错误后注意有些USB设备的端点0大小不足18字节但至少具有8字节而标准的设备描述有18字节在这种情况下USB设备只能暂时按最大包将部分设备描述符返回而主机在成功获取到前面一部分描述符后就不会再请求剩下的设备描述符部分而是进入设置地址阶段就会返回一个0长度的状态数据包给设备。 然后主机再对设备复位一下接下来就会进入到设置地址阶段。这时USB主机发出一个设置地址的请求建立过程设置地址无数据过程地址包含在建立包中具体的地址USB主机会负责管理它会分配一个唯一的地址给新的设备。USB设备在收到地址后返回0长度的状态包主机收到0长度的状态包之后会返回一个ACK给设备。设备在收到这个ACK之后就可以启用新的地址了。这样设备就分配到了一个唯一的设备地址以后主机就通过它来进行访问该设备。然后主机再次获取设备描述符这次跟第一次可能有点不一样这次需要获取完全部的18个字节的设备描述符。当然如果你的端点0缓冲大于18字节的话那就跟第一次的情形一样了。 接下来主机就会获取配置描述符。配置描述符总共为9字节。主机在获取到配置描述符后根据里面的配置集合总长度再获取配置集合。配置集合包括配置描述符接口描述符端点描符等等。如果有字符串描述符的话还要获取字符串描述符。另外HID设备还有HID描述符等。使用BUSHOUND以及通过串口返回信息很容易看到具体的过程。总之是主机请求什么你的程序就响应什么. USB是个通用的总线端口都是统一的。但是USB设备却各种各样例如USB鼠标USB键盘U盘等等那么USB主机是如何识别出不同的设备的呢这就要依赖于描述符了。USB的描述符主要有设备描述符配置描述符接口描述符端点描述符字符串描述符HID描述符报告描述符等等. 一个USB设备有一个设备描述符设备描述符里面决定了该设备有多少种配置每种配置描述符对应着配置描述符而在配置描述符中又定义了该配置里面有多少个接口每个接口有对应的接口描述符在接口描述符里面又定义了该接口有多少个端点每个端点对应一个端点描述符端点描述符定义了端点的大小类型等等。由此我们可以看出USB的描述符之间的关系是一层一层的最上一层是设备描述符下面是配置描述符再下面是接口描述符再下面是端点描述符。在获取描述符时先获取设备描述符然后再获取配置描述符根据配置描述符中的配置集合长度一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号厂商字符串产品字符串等。每种描述符都有自己独立的编号如下 #defineDEVICE_DESCRIPTOR 0x01 //设备描述符#defineCONFIGURATION_DESCRIPTOR 0x02 //配置描述符#defineSTRING_DESCRIPTOR 0x03 //字符串描述符#defineINTERFACE_DESCRIPTOR 0x04 //接口描述符#defineENDPOINT_DESCRIPTOR 0x05 //端点描述符 下面分别详细介绍一下各描述符。1.设备描述符//定义标准的设备描述符结构typedefstruct_DEVICE_DCESCRIPTOR_STRUCT{BYTEblength; //设备描述符的字节数大小BYTEbDescriptorType; //设备描述符类型编号WORDbcdUSB; //USB版本号BYTEbDeviceClass; //USB分配的设备类代码BYTEbDeviceSubClass; //USB分配的子类代码BYTEbDeviceProtocol; //USB分配的设备协议代码BYTEbMaxPacketSize0; //端点0的最大包大小WORDidVendor; //厂商编号WORDidProduct; //产品编号WORDbcdDevice; //设备出厂编号BYTEiManufacturer; //设备厂商字符串的索引BYTEiProduct; //描述产品字符串的索引BYTEiSerialNumber; //描述设备序列号字符串的索引BYTEbNumConfigurations; //可能的配置数量}DEVICE_DESCRIPTOR_STRUCT,*pDEVICE_DESCRIPTOR_STRUCT;//实际的设备描述符示例codeDEVICE_DESCRIPTOR_STRUCTdevice_descriptor //设备描述符{sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小这里是18字节DEVICE_DESCRIPTOR, //设备描述符类型编号设备描述符是010x1001, //USB版本号这里是USB01.10即USB1.1。由于51是大端模式所以高低字节交换0x00, //USB分配的设备类代码0表示类型在接口描述符中定义0x00, //USB分配的子类代码上面一项为0时本项也要设置为00x00, //USB分配的设备协议代码上面一项为0时本项也要设置为00x10, //端点0的最大包大小这里为16字节0x7104, //厂商编号这个是需要跟USB组织申请的ID号表示厂商代号。0xf0ff, //该产品的编号跟厂商编号一起配合使用让主机注册该设备并加载相应的驱动程序0x0100, //设备出厂编号 0x01, //设备厂商字符串的索引在获取字符串描述符时使用该索引号来识别不同的字符串 0x02, //描述产品字符串的索引同上0x03, //描述设备序列号字符串的索引同上0x01 //可能的配置数为1即该设备只有一个配置}; 2.配置描述符//定义标准的配置描述符结构typedefstruct_CONFIGURATION_DESCRIPTOR_STRUCT{BYTEbLength; //配置描述符的字节数大小BYTEbDescriptorType; //配置描述符类型编号WORDwTotalLength; //此配置返回的所有数据大小BYTEbNumInterfaces; //此配置所支持的接口数量BYTEbConfigurationValue; //Set_Configuration命令所需要的参数值BYTEiConfiguration; //描述该配置的字符串的索引值BYTEbmAttributes; //供电模式的选择BYTEMaxPower; //设备从总线提取的最大电流}CONFIGURATION_DESCRIPTOR_STRUCT,*pCONFIGURATION_DESCRIPTOR_STRUCT; 3.接口描述符//定义标准的接口描述符结构typedefstruct_INTERFACE_DESCRIPTOR_STRUCT{BYTEbLength; //接口描述符的字节数大小BYTEbDescriptorType; //接口描述符的类型编号BYTEbInterfaceNumber; //该接口的编号BYTEbAlternateSetting; //备用的接口描述符编号BYTEbNumEndpoints; //该接口使用的端点数不包括端点0BYTEbInterfaceClass; //接口类型BYTEbInterfaceSubClass; //接口子类型BYTEbInterfaceProtocol; //接口遵循的协议BYTEiInterface; //描述该接口的字符串索引值}INTERFACE_DESCRIPTOR_STRUCT,*pINTERFACE_DESCRIPTOR_STRUCT; 4.端点描述符 //定义标准的端点描述符结构typedefstruct_ENDPOINT_DESCRIPTOR_STRUCT{BYTEbLegth; //端点描述符字节数大小BYTEbDescriptorType; //端点描述符类型编号BYTEbEndpointAddress; //端点地址及输入输出属性BYTEbmAttributes; //端点的传输类型属性WORDwMaxPacketSize; //端点收、发的最大包大小BYTEbInterval; //主机查询端点的时间间隔}ENDPOINT_DESCRIPTOR_STRUCT,*pENDPOINT_DESCRIPTOR_STRUCT;下面是一个配置描述符集合的定义typedefstruct_CON_INT_ENDP_DESCRIPTOR_STRUCT{CONFIGURATION_DESCRIPTOR_STRUCTconfiguration_descriptor;INTERFACE_DESCRIPTOR_STRUCT interface_descritor;ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];}CON_INT_ENDP_DESCRIPTOR_STRUCT;配置描述符集合的示例 codeCON_INT_ENDP_DESCRIPTOR_STRUCTcon_int_endp_descriptor //配置描述符集合{//configuration_descriptor //配置描述符{sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小这里为9CONFIGURATION_DESCRIPTOR, //配置描述符类型编号配置描述符为2(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)sizeof(INTERFACE_DESCRIPTOR_STRUCT)sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)sizeof(INTERFACE_DESCRIPTOR_STRUCT)sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256, //配置描述符集合的总大小0x01, //只包含一个接口0x01, //该配置的编号0x00, //iConfiguration字段0x80, //采用总线供电不支持远程唤醒0xC8 //从总线获取最大电流400mA},//interface_descritor //接口描述符{ sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小这里为9INTERFACE_DESCRIPTOR, //接口描述符类型编号接口描述符为30x00, //接口编号为40x00, //该接口描述符的编号为0ENDPOINT_NUMBER, //非0端点数量为2只使用端点主端点输入和输出0x08, //定义为USB大容量存储设备0x06, //使用的子类为简化块命令0x50, //使用的协议这里使用单批量传输协议0x00 //接口描述符字符串索引为0表示没有字符串},//endpoint_descriptor[]{{ //主端点输入描述sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小这里为7ENDPOINT_DESCRIPTOR, //端点描述符类型编号端点描述符为5MAIN_POINT_IN, //端点号主输入端点ENDPOINT_TYPE_BULK, //使用的传输类型批量传输0x4000, //该端点支持的最大包尺寸64字节0x00 //中断扫描时间对批量传输无效},{ //主端点输出描述sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小这里为7ENDPOINT_DESCRIPTOR, //端点描述符类型编号端点描述符为5MAIN_POINT_OUT, //端点号主输出端点ENDPOINT_TYPE_BULK, //使用的传输类型批量传输0x4000, //该端点支持的最大包尺寸64字节0x00 //中断扫描时间对批量传输无效} 其中关于端点的类型定义如下//定义的端点类型#defineENDPOINT_TYPE_CONTROL 0x00 //控制传输#defineENDPOINT_TYPE_ISOCHRONOUS 0x01 //同步传输#defineENDPOINT_TYPE_BULK 0x02 //批量传输#defineENDPOINT_TYPE_INTERRUPT 0x03 //中断传输端点号的定义如下#defineMAIN_POINT_OUT 0x02 //2号输出端点#defineMAIN_POINT_IN 0x82 //2号输入端点