第1章 U盘的逻辑结构
1.1 U盘的逻辑结构
U盘可以看成是以扇区(1扇区=512Bytes)为单位线性排列的实体,即0号扇区,1号扇区,2号扇区,……这样按顺序地排列下去。U盘是flash,对flash的操作总是以块为单位的,因此单片机对U盘的操作是以扇区为单位,整个扇区地读取,或整个扇区地写入。
第2章 USB通信协议
2.1 USB设备开工的机理
USB是即插即用的,涵盖海量存储器(如U盘、移动硬盘)、人机交互设备(如鼠标键盘游戏杆)、扫描仪、打印机等等各种各样功能的设备,那么USB主机是如何判断目前接入的设备到底是怎么样的呢?答案是USB描述符,以及USB的枚举。
2.2 USB描述符
这个概念很简单,就是对各种纷繁芜杂的USB外设按功能划分大类(class),大类下又再细分
小类(subclass),每个类别给予一串特定的符号(Descriptor)供主机辨识。
每个USB设备只能有一个DEVICE描述符,它指明了该设备属于哪一大类,是海量存储器类,还是人机交互设备类,还是打印机或者扫描仪类,等等。
每个DEVICE下可以有1个或多个配置描述符(configuration),以说明该设备含有哪些功能。如一个USB接口的CDROM可以同时具有读写光盘的功能和播放CD的功能。有几个功能,就有几个配置描述符。
每种配置对应若干个接口描述符(Interface),以描述该配置使用哪些接口与主机进行通信。
每个Interface又都是端点(End Point)的集合,端点就是设备与USB主机交换数据的最原子单位了。每个Interface用到的端点可以是一个或多个。下图摘自USB MASS STORAGE CBI Transport Specification 第6页,清楚说明各种描述符的组织情况。
2.3 USB设备的枚举过程(开工过程)
有了完善的分类后,USB设备上电即可通过枚举过程告诉USB主机自己的详细信息,这很类似一个一问一答的过程,如下:
主机(下称H):你是甚么设备?
设备(下称D):我是12 01 0100…… (这就是DEVICE描述符了)
H:你有几种功能?
D:我有 09 02 09 …… (配置描述符)
H:每种功能有几个接口?
D:09 04 00…… (接口描述符)
H:每个接口用到哪些端点?
D:07 05 81 …… (端点描述符)
H:好了,我知道你是谁了,开始传数据吧!
D:OK. READY GO!
具体而言,USB枚举过程有以下步骤:
(1) 集线器检测新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)
(2) 主机知道了新设备连接后
每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
(3) 集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
(4) 集线器在设备和主机之间建立一个信号通路
主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信。
(5) 集线器检测设备速度
集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。
以下,需要USB的firmware进行干预
(6) 获取最大数据包长度
PC向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。
(7) 主机分配一个给设备
主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存。从此开始所有通信都使用这个新地址。
(8) 主机向新地址重新发送Get_Device_Descriptor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
(9) 主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。
(10) 主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。
(11) 如果主机是PC电脑,此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。大文件发送
(12) 根据Device_Descriptor和Device_Configuration应答,PC判断是否能够提供USB的Dri
ver,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。
(13) 加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入“配置”状态,并可以和客户软件进行数据传输。此时,常规的USB完成了其必须进行的配置和连接工作。查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。
发布评论