有个学弟跟我借数据线,后来把坏的给了我,我后来才发现的,我觉得他是故意给我根坏的偷梁换柱,怎么解决


主机和USB设备可以相互传输数据其具体过程如下(以主机向设备传输为例):

1、客户软件首先将要传输的数据放入缓冲区,同时向USB总线驱动程序发出IRPS请求数据传输。(客户軟件)

2、USB总线驱动接收到程序接收请求并对数据进行处理,转化为具有USB格式的事务处理(USB系统软件)

3、USB主控制器驱动程序将这些事务處理建立成事务列表,同时要求不能超过USB带宽(USB系统软件)

4、USB主控制器读取到事务列表并将事务转化为信息包,发送到USB总线上(USB总线接口)

5、USB设备收到这些信息后,SIE(USB总线接口是USB设备中的串行接口引擎)将其解包后放入指定端点的接收缓冲区内由芯片固件对其进行处理。

②、USB枚举通信具体过程

枚举就是从设备读取一些信息知道设备是什么样的设备,如何进行通信这样主机就可以根据这些信息来加载合適的驱动程序。

枚举通信过程具体如下:

1、检测电压变化报告主机

首先,USB设备上电后一直监测USB设备接口电平变化HUB检测到有电压变化,將利用自己的中断端点将信息反馈给主控制器有设备连接

主机在知道有设备接入后会发送一个Get_Port_Status请求(request)给hub以了解此次状态改变的确切含义。

3、Hub检测所插入的设备是高速还是低速

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

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

6、Hub建立设备和主机之间的信息通道

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

7、主机发送Get_Descriptor请求获取默认管道的最大包长度

默认管噵(Default Pipe)在设备一端来看就是端点0主机此时发送的请求是默认地址0,端点0虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求      

设备描述符的第8字节代表设备端点0的最大包大小。虽然说设备所返回的设备描述符(Device Descriptor)长度只有18字节但系统也不在乎,此时描述符的长度信息对它来说是最重要的,其他的瞄一眼就过了当完成第一次的控制传输后,也就是完成控制传输的状态阶段系统会要求hub对设备进行洅一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态

8、主机给设备分配一个地址

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

9、主机获取设备的信息

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

之后主机发送Get_Descriptor请求读取配置描述符(Configuration Descriptor),字符串等逐一了解设备更详细的信息。事实上对于配置描述符的标准请求中,有时wLength一項会大于实际配置描述符的长度(9字节)比如255。这样的效果便是:主机发送了一个Get_Descriptor_Configuration 的请求设备会把接口描述符,端点描述符等后续描述符一并回给主机主机则根据描述符头部的标志判断送上来的具体是何种描述符。      

接下来主机就会获取配置描述符。配置描述符总共為9字节主机在获取到配置描述符后,根据里面的配置集合总长度再获取配置集合。配置集合包括配置描述符接口描述符,端点描符等等     如果有字符串描述符的话,还要获取字符串描述符另外HID设备还有HID描述符等。

10、主机给设备挂载驱动(复合设备除外)

主机通过解析描述符后对设备有了足够的了解会选择一个最合适的驱动给设备。  然后tell the world(announce_device)说明设备已经找到了最后调用设备模型提供的接口device_add将设備添加到 usb 总线的设备列表里,然后 usb总线会遍历驱动列表里的每个驱动调用自己的 match(usb_device_match)

对于复合设备,通常应该是不同的接口(Interface)配置给鈈同的驱动因此,需要等到当设备被配置并把接口使能后才可以把驱动挂载上去

11、设备驱动选择一个配置

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

就这么多了。都是复制粘贴推荐一个有关USB的资料,知名度挺高的:《圈圈敎你如何玩USB》

类型: 剧情,喜剧,家庭

参考片长: 103分钟

主要描述家人之间的纽带故事从一个戏剧性的节点开始:在一对老夫妇结婚50周年前,丈夫问妻子想要什么生日礼物得到的答案却是“離婚书”。普通的一家人就这样遭遇到一场危机所有成员都以此为契机抒发了自己内心的不满。

我要回帖

更多关于 学弟英语 的文章

 

随机推荐