打印
[应用相关]

STM32 USB驱动

[复制链接]
楼主: chenqiang10
手机看帖
扫描二维码
随时随地手机跟帖
21
chenqiang10|  楼主 | 2018-8-29 16:21 | 只看该作者 回帖奖励 |倒序浏览
多配置USB设备枚举过程和多字符串描述符的枚举是相同的,大致过程如下:

供电;
总线复位;
获取设备描述符;
总线复位;
设置地址;
获取设备描述符;
获取配置描述符1;
获取配置描述符2;

获取字符串描述符1;
获取字符串描述符2;

设置配置;

使用特权

评论回复
22
chenqiang10|  楼主 | 2018-8-29 16:21 | 只看该作者
连接(Attached)

  设备可以连接到USB或者从USB上拔出。USB设备从总线上拨出后的状态在规范没定义,只说明一旦USB连到总线要求的操作以及属性。

使用特权

评论回复
23
chenqiang10|  楼主 | 2018-8-29 16:22 | 只看该作者
上电(Powered)

  设备可以支持自供电和总线供电配置。 某些设备配置支持任意电源。 仅当设备是自供电时,其他设备配置才可用。 设备通过配置描述符报告其电源功能。 当前电源被报告为设备状态的一部分。 设备可以在任何时间改变其电源,例如从自供电到总线供电。 如果配置能够支持两种功耗模式,则为该配置报告的功率最大值是设备在任一模式下从VBUS中获取的最大值。 无论模式如何,设备都必须遵守此最大值。 如果配置仅支持一种电源模式且设备的电源发生变化,则设备将丢失其当前配置和地址并返回到Powered状态。 如果设备是自供电的并且其当前配置需要超过100 mA,那么如果设备切换为总线供电,则必须返回到地址状态。 如果本地电源丢失,则允许使用VBUS为集线器控制器供电的自供电集线器保持在已配置状态。 有关详细信息,请参阅第11.13节。
  USB设备的电源可来自外部电源,也可从USB接口的集线器而来。电源来自外部电源的USB设备被称作自给电源式的(self-powered)。尽管自给电源式的USB设备可能在连接上USB接口以前可能已经带电,但它们直到连线上USB接口后才能被看作是加电状态(Powered state)。而这时候VBUS已经对设备产生作用了。
  一个设备可能有既支持自给电源的,同时也支持总线电源式的配置。有一些支持其中的一种,而另一些设备配置可能只有在自给电源下才能被使用。设备对电源支持的能力是通过配置描述表(configuration descriptor)来反映的。当前的电源供给形式被作为设备状态的一部分被反映出来。设备可在任何时候改变它们的供电来源,比如说:从自给式向总线式改变,如果一个配置同时支持两种模式,那此状态的最大电源需求就是指设备在两种模式下从VBUS上获取电能的最大值。设备必须以此最大电源作为参照,而究竟处于何状态是不考虑的。如果有一配置仅支持一种电源模式,那么电源模式的改变会使得设备失去当前配置与地址,返回加电状态。如果一个设备是自给电源式,并且当前配置需要大于100mA电流,那么如果此设备转到了总线电源式,它必须返回地址状态(Address state)。自给电源式集线器使用VBUS来为集线控制器(Hub controller)提供电源,因而可以仍然保持配置状态(Configured state),尽管自给电源停止提供电源。

使用特权

评论回复
24
chenqiang10|  楼主 | 2018-8-29 20:16 | 只看该作者
默认状态(Default)

  设备上电后,它不响应任何总线处理,直到总线接收到复位信号为止.接收到复位信号后,用默认的地址可以对设备寻址.
  当用复位过程完成后,USB设备在正确的速度下操作(即低速/全速/高速).低速和全速的数据选择由设备的终端电阻决定.能进行高速操作的设备决定它是否在复位的过程的一部分执行高速操作.
  能进行高速操作的设备在全速的电气环境中操作时,必须能以全速成功复位.设备成功复位后,设备必须成功响应设备和配置描述符请求,并且返回适当的信息.当在全速下工作时,设备可能或者不能支持预定义的功能.

使用特权

评论回复
25
chenqiang10|  楼主 | 2018-8-29 20:17 | 只看该作者
地址(Address)

  所有的USB设备在加电复位以后都使用缺省地址。每一设备在连接或复位后由主机分配一个唯一的地址。当USB设备处于挂起状态时,它保持这个地址不变。
  USB设备只对缺省通道(Pipe)请求发生响应,而不管设备是否已经被分配地址或在使用缺省地址。

使用特权

评论回复
26
chenqiang10|  楼主 | 2018-8-29 20:34 | 只看该作者
配置状态( Configured )

  在USB设备正常工作以前,设备必须被正确配置。从设备的角度来看,配置包括一个将非零值写入设备配置寄存器的操作。配置一个设备或改变一个可变的设备设置会使得与这个相关接口的终端结点的所有的状态与配置值被设成缺省值。这包括将正在使用(date toggle)的结点(end point)的 (Date toggle)被设置成DATA0。

使用特权

评论回复
27
chenqiang10|  楼主 | 2018-8-29 20:50 | 只看该作者
挂起状态(Suspended)

  为节省电源,USB设备在探测不到总线传输时自动进入中止状态。当中止时,USB设备保持本身的内部状态,包括它的地址及配置。
  所有的设备在一段特定的时间内探测不到总线活动时必须进入中止态。不管设备是被分配了非缺省的地址或者是被配置了,已经连接的设备必须在任何加电的时刻随时准备中止。总线活动的中止可能是因为主机本身进入了中止状态。另外,USB设备必须在所连接的集线器端口失效时进入中止态。这就是所指的选择性中止(Selective suspend)。
  USB设备在总线活动来到时结束中止态。USB设备也可以远程唤醒的电流信号来请求主机退出中止态或选择性中止态。具体设备具有的远程唤醒的能力是可选的,也就是说,如果一个设备有远程唤醒的能力,此设备必须能让主机控制此能力的有效与否。当设备复位时,远程唤醒能力必须被禁止。

使用特权

评论回复
28
chenqiang10|  楼主 | 2018-8-29 20:52 | 只看该作者
用户把USB设备插入USB端口或给系统启动时设备上电

  这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。Hub给端口供电,连接着的设备处于上电状态。此时,USB设备处于加电状态,它所连接的端口是无效的。

使用特权

评论回复
29
chenqiang10|  楼主 | 2018-8-29 21:08 | 只看该作者
Hub监测它各个端口数据线上(D+/D-)的电压

  在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在我将来的**中描述)。

使用特权

评论回复
30
chenqiang10|  楼主 | 2018-8-29 21:09 | 只看该作者
Host了解连接的设备

  每个hub利用它自己的中断端点向主机报告它的各个端口的状态(对于这个过程,设备是看不到的,也不必关心),报告的内容只是hub端口的设备连接/断开的事件。如果有连接/断开事件发生,那么host会发送一个 Get_Port_Status请求(request)给hub以了解此次状态改变的确切含义。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求(standard hub-class requests)。

使用特权

评论回复
31
chenqiang10|  楼主 | 2018-8-29 21:09 | 只看该作者
Hub检测所插入的设备是高速还是低速设备

  hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

使用特权

评论回复
32
chenqiang10|  楼主 | 2018-8-29 21:10 | 只看该作者
hub复位设备

  主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位其管理的端口(刚才设备插上的端口)。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不受影响。

使用特权

评论回复
33
chenqiang10|  楼主 | 2018-8-29 21:10 | 只看该作者
Host检测所连接的全速设备是否是支持高速模式

  因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。
  同样的,从设备的角度来看,如果是一个高速设备,在刚连接bub或上电时只能用全速信号模式运行(根据USB 2.0协议,高速设备必须向下兼容USB 1.1的全速模式)。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

使用特权

评论回复
34
chenqiang10|  楼主 | 2018-8-29 21:12 | 只看该作者
Hub建立设备和主机之间的信息通道

  主机不停地向hub发送Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。
  当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),准备接收主机发来的请求。设备和主机之间的通信通过控制传输,默认地址0,端点号0进行。此时,设备能从总线上得到的最大电流是100mA。(所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。)

使用特权

评论回复
35
chenqiang10|  楼主 | 2018-8-29 21:13 | 只看该作者
主机发送Get_Descriptor请求获取默认管道的最大包长度

  默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。
  设备描述符的第8字节代表设备端点0的最大包大小。虽然说设备所返回的设备描述符(Device Descriptor)长度只有18字节,但系统也不在乎,此时,描述符的长度信息对它来说是最重要的,其他的瞄一眼就过了。当完成第一次的控制传输后,也就是完成控制传输的状态阶段,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态。

使用特权

评论回复
36
chenqiang10|  楼主 | 2018-8-29 21:14 | 只看该作者
主机给设备分配一个地址

  主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

使用特权

评论回复
37
chenqiang10|  楼主 | 2018-8-29 21:15 | 只看该作者
主机获取设备的信息

  主机发送 Get_Descriptor请求到新地址读取设备描述符,这次主机发送Get_Descriptor请求可算是诚心,它会认真解析设备描述符的内容。设备描述符内信息包括端点0的最大包长度,设备所支持的配置(Configuration)个数,设备类型,VID(Vendor ID,由USB-IF分配), PID(Product ID,由厂商自己定制)等信息。

使用特权

评论回复
38
chenqiang10|  楼主 | 2018-8-29 22:01 | 只看该作者
主机给设备挂载驱动(复合设备除外)

  主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。 然后tell the world(announce_device)说明设备已经找到了,最后调用设备模型提供的接口device_add将设备添加到 usb 总线的设备列表里,然后 usb总线会遍历驱动列表里的每个驱动,调用自己的 match(usb_device_match) 函数看它们和你的设备或接口是否匹配,匹配的话调用device_bind_driver函数,现在就将控制权交到设备驱动了。
  对于复合设备,通常应该是不同的接口(Interface)配置给不同的驱动,因此,需要等到当设备被配置并把接口使能后才可以把驱动挂载上去。
  实际情况没有上述关系复杂。一般来说,一个设备就一个配置,一个接口,如果设备是多功能符合设备,则有多个接口。端点一般都有好几个,比如Mass Storage设备一般就有两个端点(控制端点0除外)。

使用特权

评论回复
39
chenqiang10|  楼主 | 2018-8-29 22:03 | 只看该作者
设备驱动选择一个配置

  驱动(注意,这里是驱动,之后的事情都是有驱动来接管负责与设备的通信)根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured),当然,设备也应该使能它的各个接口(Interface)。
  对于复合设备,主机会在这个时候根据设备接口信息,给它们挂载驱动。

使用特权

评论回复
40
chenqiang10|  楼主 | 2018-8-29 22:04 | 只看该作者
设备请求

  所有USB设备都会响应设备默认控制管道上来自主机的请求。 这些请求使用控制转移进行。 请求和请求的参数在Setup数据包中发送到设备。 主机负责建立下表中列出的字段值。 每个SETUP包都有八个字节。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则