USB驱动程序之概念介绍

来源:互联网 发布:seo与sem的异同 编辑:程序博客网 时间:2024/05/16 04:09

在windows下,当你拿一个新的PC设备,把他接到PC上面,它会出现发现新硬件,跳出一个框说要你安装驱动程序

假设我们USB连的手机,他会提示你发现android phone,然后弹出对话框,提示你安装驱动程序。

但是为什么没有驱动程序,它知道是android phone呢???这些信息应该在我们USB驱动程序读出来才对啊,为什么还没读出来就知道它是什么设备。

因为这个windows里面已经有了USB的总线驱动程序,接入USB设备后,是总线驱动程序知道你是android phone。提示你安装的是设备驱动程序。

所以层次就出来了

应用程序下面是设备驱动程序,可能是字符设备,也有可能是块设备。下面就是USB总线驱动,在下面就是硬件了。

USB驱动分为两层,一层是总线驱动程序一般是内核自带的,设备驱动程序就要我们自己写。

USB总线驱动程序,负责识别USB设备,给USB设备找到对应的驱动程序

但是USB设备有那么多种,为什么一接入电脑就能识别出来??

PC和USB设备都得遵守一些规范,比如USB设备接入电脑后,PC机会发出你是什么,USB设备就必须回答我是什么什么,并且回答的格式必须一样,例如必须是中文,你说英文那边可能听不懂。USB驱动程序总线驱动会发出某些命令想获取驱动信息,这些信息就是描述符,USB设备必须返回这些描述符给PC。

PC机接有非常多的设备,怎么分辨他们?

如果你们曾经观察过你们USB设备的话,你们可以看到USB口里面只有四个金属引脚,那么这四个金属引脚是什么东西呢,分别是5V,GND,D+,D-。所有的数据都是通过D+,D-来传输的,所有的设备都是挂在D+,D-上面的。那么多设备我们怎么分辨呢???

那是因为接在USB总线上的设备都有自己的编号,驱动程序里面称为地址,PC机想访问某个USB设备时,发出的命令都含有对方的编号信息,都含有对方的地址

那么我USB刚接进去的时候肯定没有编号,那么这些编号怎么来的??
新接入的USB设备的默认编号是0,在未分配编号之前,PC使用0编号和它通讯。

为什么一接入USB设备,PC机就能发现它。USB总线做了特殊的手脚


可以看出D+,D-都会接一个电阻,下拉电阻。没接外设是,这两个引脚会是低电平,接一个USB设备,里面也是四根引脚D-,D+,5V和地。两两相连,连在一起

就是5V接5V,地接地,但是USB设备里面接的是上拉电阻。没有接的时候这两个都是低电平,接了之后就变成高电平,所以PC有能力发现你接入了外设

如果在D-上接的话就是那种全速设备 12M/s 如果在D+上接就表示高速设备 180M/s 不管你哪边接上拉电阻电压都会有变化


USB是主从结构的,所有的USB传输都是从USB主机这方发起,如PC,板子等。USB设备没有主动通知USB主机的能力。举个例子,我们USB鼠标,动一动就有数据,他也不可能主动通知USB说你快点来读我,它没有那个能力,只能被动的通知USB来读,PC机怎么能及时知道数据呢,就是联系不断来查询。

USB的传输类型:

1.U盘,你右键点击安全删除,有时快有时慢。时间没有保证,但是你考进去的文件是可靠的,这种就是批量传输

2.鼠标 玩游戏的时候,你点了一下鼠标,马上会起作用,你不希望你点了一下,过几秒钟才起作用把。这种就是实时并且是可靠的,这种就是中断传输。注意它只是借助中断的概念而已,并没有主动去告诉主机读我的数据

3.USB摄像头 USB摄像头,你跟朋友聊天的时候可能出现花屏,视频不可靠,但是实时的。这叫实时传输

还一种控制传输:我们一接入一个USB设备就可以立马弹出一个框,这里面就有个识别过程,这是可靠的,时间有保证。


USB传输的对象:端点(endpoint)

我们读写某个设备的时候我们可以这么细化,比如U盘,可以细化为把数据写到U盘的端点1,端点2,某个端点。从端点二里面来读出数据。除了端点0之外,每个端点只支持一个端点的数据传输。什么意思呢,就是这个一号端点要么只能接收数据要么只能发送数据,不可能即接收,又发送数据。端点0除外,一般来说端点0用来控制传输。把地址分配给你,告诉你这是输出,然后我找你要描述符,所以这个是既能输入有能输出。每个端点都有传输类型和传输方向。程序里说的输入输出都是基于USB主机的立场,比如对于鼠标,数据是鼠标传到PC机的,它的方向对应的端点称为输入端点



我们接下来来分析USB总线驱动做了什么事情

一接入就会弹出框框,那叫识别设备

在windows下如果有驱动程序他就会调用那个驱动程序,如果没有驱动程序就安装驱动程序,这叫找到并安装对应的设备驱动程序

提供USB读写函数,不了解数据含义,只是当一个信鸽一样

但是设备驱动知道


既然我们USB总线驱动程序有了USB读写函数,那么我能不能让应用程序跨过设备驱动程序来访问呢,这是可以的,因为有个LIBUSB,他就是封装了这些函数,你可以绕过这个设备驱动程序

USB驱动程序框架


app;

-------------------------------------------------------------------

USB设备驱动程序

内核----------------------------------------------------------

USB总线驱动程序

-----------------------------------------------------------------

usb主机控制器

硬件------------------------------------------------------------

usb设备





0 0
原创粉丝点击