和菜鸟一起学linux总线驱动之初识USB

    现在什么东西都用上了USB了,听着名字觉得怪怪的,拆开来看看,U,SB,貌似是骂人的话了,开个玩笑。不过这个家伙确实给我们带来很多的方便啊,什么USB鼠标啊,U盘啊,USB wifi啊,USB摄像头啊,什么电子设备都貌似可以用USB来替换掉,足见这个东西的好处和通用了。不过一直都不是很清楚这个东西,上次公司让做USB的device设备,由于硬件的总线有问题,从而没有继续下去,只是简单地看了下协议和驱动,真是有种万花丛中过,片叶不沾身呢。最近又关注了下USB,把自己看的总结下吧。

    USB就是Universal Serial Bus的简称,通用串行总线,它是一种外部总线标准。从USB1.0的1.5Mb/s到USB2.0的60Mb/s(添加了增强主控制器接口EHCI)到USB3.0的10倍于USB2.0的传输速度。

    说到USB,它的优点主要是可以支持热插拔,携带很方便,每次学校选修课讲PPT的时候,大家都是屁颠屁颠地拿着一个U盘或者SD卡或者移动硬盘到讲台,一插然后就把PPT拷出来了,然后讲完了一拔就又屁颠屁颠的回到位置上了,足可见它的方便了。还有无论你用自己的电脑也好,用其他的电脑也罢,都是通用的,足可见它的接口的标准统一了。此外,你不但可以接U盘,还可以接USB鼠标,USB摄像头等等,足可见它的可用性之强大,不过最多可以接127个设备。

    以前一直以为USB吗,就是只有U盘的那个样子了,其他的都不是很明白。看看下图吧,好多种类型的,如果要买的话,千万别买错了。

和菜鸟一起学linux总线驱动之初识USB_第1张图片

    从左到右依次是1、micro USB(公口),2、mini USB(公口),3、B型 USB(公口),4、A型 USB(母口),5、A型 USB(公口)。

    一般手机都是用的micro型的,因为手机要求越薄越好嘛,mini型的以前用的mp3啊,mp4之类的很多的,而B型的,我用过的是单片机的下载线,A型就太多了,几乎每台电脑都有的,

    其实,这都换汤不换药的,只是外形不一样了,她的结构还是就4条线(不过micro和mini都多了一根ID身份识别线),两根电源线,两根信号线。那么USB的信号是怎么传输的呢?先看看下面的两幅图吧

 

和菜鸟一起学linux总线驱动之初识USB_第2张图片

                                      高速设备电缆和电阻的连接

和菜鸟一起学linux总线驱动之初识USB_第3张图片

低速设备电缆和电阻的连接

    由上图可以看到,USB主机或Hub的下行端口的差模信号线D+和D-上均连接有一个下拉电阻,即图中所示的R1,其阻值为15kΩ。R1一端连接到D+或D-,另一端接地。这样,当该端口没有连接任何USB设备时,D+和D-信号线上的电平都恒为0。另一方面,看到设备端的D+和D-信号线的其中一根线上连接有上拉电阻,即R2,其阻值为 1.5kΩ。这里,需要特别注意的是,对于全速设备,这个上拉电阻R2是连接在D+信号线上的;而对于低速设备,R2则是连接在D-信号线上的。这也是USB主机识别设备速度的一个重要指标。这个上拉电阻一端连接在信号线上,另一端连接电源。

    为了防止出现长时间的0或者1(这样不利于时钟信号的提取),在发送数据前要经过位填充处理。然后再将数据串行化,发送到数据线上,由两根数据线的差分值来表示0或者1。而在接收端,则刚好是相反的过程。接收端采样数据线,将数据并行化,并同时去掉未填充,然后解析数据。通常,我们使用现成的USB芯片,像位填充,串行化这些芯片内部的硬件已经帮我们做好了,因此通常我们并不用关心这些细节。在设备接收数据时,芯片的串行接口引擎(SIE)会接收属于自己地址的数据,并根据相应的端口号,放到相应的缓冲区内,并返回ACK给主机进行确认,然后产生中断请求,通知我们的程序,已经收到数据包了。在我们还未处理完缓冲区的数据之前,如果再收到对该端点的输出请求,USB芯片将会使用NAK返回,告诉主机端点现在忙,主机检测到NAK后,过段时间会重试输出数据,直到超时为止;发送数据时,用户将数据写入USB芯片的缓冲区,并通知USB芯片缓冲区内数据可用,然后USB芯片检测到主机请求对应的端点输入时,它就会将数据返回,数据发送完毕并收到主机的ACK确认之后,产生中断请求通知应用程序数据已经发送完毕。如果USB芯片已经收到了输入请求,但是用户程序还未填充好缓冲区,它也会用NAK返回,告诉主机数据还未准备好。主机收到NAK后,过段时间会重试,直到超时为止。

    在包传送时,USB使用一种NRII(None Return Zero Invert,即无回零反向码)编码方案。对于USB的电气特性就差不多了,毕竟不是搞USB硬件的总线的,偶们是实现linux下的USB驱动的,稍微小小了解下有这么一回事就好。

你可能感兴趣的:(和菜鸟一起学linux总线驱动之初识USB)