USB学习笔记(一)------USB底层基础知识

来源:互联网 发布:那个旅行软件好 编辑:程序博客网 时间:2024/06/06 01:15

      USB主控制器负责处理主机和设备之间的电气和协议层的联系。常见的USB主控制器规格有3种分别为:

      1、OHCI:主要是非PC系统上的USB芯片。(例如ARM)

      2、UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。

      3、EHCI:是由Interl和其它厂商开发,兼容OCHI和UHCI,遵循USB2.0规范。


       USB的数据传输跟其它的一样,USB数据是由二进制数字串构成的。

       首先由二进制串构成域,域再构成包,包再构成事务(SETUP、IN、OUT),事务最后构成传输(中断传输、等时传输、批量传输、控制传输)。

       一、域是USB数据构成的最小单位,由若干位二进制组成,域可以分为7个类型

       1、同步域(SYNC)、八位固定值0000 0001,用于本地时钟与输入同步。

       2、标识域(PID)、由四位标识符和四位标识符反码构成,表明包的类型和格式,由四位可知这里USB的标识符有16种。

       3、地址域(ADDR)、七位地址代表设备在主机上的地址,地址0000 000被命名为零地址,是任何一个设备第一次连接到主机时被主机配置、枚举前的默认地址,由此可知为什么USB主机只能接127个设备的原因。

       4、端点域(ENDP)、四位,由此可知一个USB设备的端点数量最大为16个。

       5、帧号域(FRAM)、11位,每一帧都有一个特定的帧号,最大容量为0x800,对于同步传输有重要的意义。

       6、数据域(DATA)、长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度。

       7、校验域(CRC)、对令牌包和数据包中的非PID域进行校验的一种方法,CRC校验在通讯中应用很广泛。

      

       二、包是由域所构成,包分为令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同。

      1、令牌包:可以分为输入包、输出包、设置包和帧起始包:

       输入输出包:SYNC+PID+ADDR+ENDP+CRC5

       帧起始包:    SYNC+PID+11位FRAM+CRC5

       2、数据包:分为DATA0和DATA1包。

       数据包:SYNC+PID+0~1023字节+CRC16

       3、握手包:SYNC+PID

       (以上格式都为USB1.1协议)

      

        三、事务:分别有IN事务、OUT事务和SETUP事务这三大事务构成,每一种事务都是由令牌包、数据包、握手包三个阶段构成。


        四、传输:由OUT、IN、SETUP事务构成的传输类型分为中断传输、等时传输、批量传输和控制传输。


      每个USB控制器都会自带一个USB Hub,该Hub被称为根Hub(Root)。这个根Hub可以连接子Hub(Sub),每个Hub上挂载USB设备。通过外接USB Hub,可以插更多的USB设备。当USB设备插入到Hub上或从上面拔出时,都会发出电信号通知系统。我们可以查看USB的电路可以知道USB Hub端口的两根信号线的每一根都有15kΩ的下拉 阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将USB控制器和设备接通后,设备的上拉电阻使信号线的电平升高,因此被Hub检测到。(注意:全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。


       在USB设备组织中,包含设备、配置、接口和端点4个层次。一个设备通常有一个或多个配置,配置通常有一个或多个接口,接口有0个或多个端点。每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口,而接口是端点汇集。


下面来看一下几个重要的结构体:


1、设备描述符 struct _DEVICE_DEs criptOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDes criptorType; //描述符类型编号,为0x01 WORD bcdUSB; //USB版本号 BYTE bDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型 //0x00不是在设备描述符中定义的,如HID BYTE bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的 BYTE bDeviceProtocl; //USB分配的设备协议代码,同上 BYTE bMaxPacketSize0; //端点0的最大包的大小 WORD idVendor; //厂商编号 WORD idProduct; //产品编号 WORD bcdDevice; //设备出厂编号 BYTE iManufacturer; //描述厂商字符串的索引 BYTE iProduct; //描述产品字符串的索引 BYTE iSerialNumber; //描述设备序列号字符串的索引 BYTE bNumConfiguration; //可能的配置数量 } 

2、配置描述符 struct _CONFIGURATION_DEs criptOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDes criptorType; //描述符类型编号,为0x01 WORD wTotalLength; //配置所返回的所有数量的大小 BYTE bNumInterface; //此配置所支持的接口数量 BYTE bConfigurationVale; //Set_Configuration命令需要的参数值 BYTE iConfiguration; //描述该配置的字符串的索引值 BYTE bmAttribute; //供电模式的选择 BYTE MaxPower; //设备从总线提取的最大电流 } 

3、接口描述符 struct _INTERFACE_DEs criptOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDes criptorType; //描述符类型编号,为0x01 BYTE bInterfaceNunber; //接口的编号 BYTE bAlternateSetting;//备用的接口描述符编号 BYTE bNumEndpoints; //该接口使用端点数,不包括端点0 BYTE bInterfaceClass; //接口类型 BYTE bInterfaceSubClass;//接口子类型 BYTE bInterfaceProtocol;//接口所遵循的协议 BYTE iInterface; //描述该接口的字符串索引值 } 

4、端点描述符 struct _ENDPOIN_DEs criptOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDes criptorType; //描述符类型编号,为0x01 BYTE bEndpointAddress; //端点地址及输入输出属性 BYTE bmAttribute; //端点的传输类型属性 WORD wMaxPacketSize; //端点收、发的最大包的大小 BYTE bInterval; //主机查询端点的时间间隔 } 

5、字符描述符 struct _STRING_DEs criptOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDes criptorType; //描述符类型编号,为0x01 BYTE SomeDes criptor[36]; //UNICODE编码的字符串 }

详情请仔细阅读该文档:http://download.csdn.net/detail/laoylhuli/4588942
原创粉丝点击