接着昨天的,更正一下,usb不是通过D+,D-的高低来encode数据的,是通过电平的变化来的,0代表变化(从高到低或者从低到高),1代表没有变化,而且每次连续的6个1后会加入一个0,就是传说中的bit stuffing + NRZI(none-return to zero inverted) encoding.
Addressed State
话说device重启过后进入default state了。
然后Host发送一个Get Descriptor 请求。这个descriptor感觉是让usb可以变得这么灵活,这么通用的关键所在。这个慢慢看,慢慢谈。
这次请求的目的是想知道默认情况下,endpoint 0可以接收的最大的packet数目。endpoint其实就是usb device上的用来传输接收数据的东西,一个usb device可以有多个,但最少最少得有一个,就是endpoint 0, 这个是在enumeration默认的。其实最开始就发这个询问支持的最大packet数目,我觉得有些不科学啊。见面了先得问名字吧。
好,完成了这个请求之后,windows 情况下host又会让device重启一次。linux 系统不清楚。
等重启过后,host给device 一个独特的地址,前面说过,7位的。“你就法号悟空吧”
device欣然接收,这个地址是一直到device 拔下来,端口被reset了,或者系统重启了。
这时候,device就进入Addressed state了。
Configured State
这次host再次发送Get Descriptor(Device)请求,请求地址是刚刚device新的地址哦。从device那得到比第一次丰富些的信息。这个device支持多少configuration, and so on.
然后host得寸进尺,向device请求各个configuration descriptor. 终于,host有了足够多的信息去挑选一个合适的driver for that device. 然后driver向device发送一个set configuration的请求。device处理了这个请求。然后进入configured state鸟。
圆满圆满。
enumeration完成。windows机器上这个时候大概会有个pop up 说有新的device连接了。
No comments:
Post a Comment