问题1: 既然还没有驱动程序为何能知道是插入了usb设备

答: windows 里面已经有了usb的总线驱动程序,介入usb设备后是“总线驱动程序”知道你是“android phone”

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

问题2:usb 设备种类非常多,为什么一接入电脑就能识别出来?

答:PC和USB设备都得遵守一些规范

比如 usb设备接入电脑后,pc机会发出“你是什么” usb设备就必须回答我是XXX 并且回答的语言必须是中文

usb总线驱动程序会发出某些命令想获取设备信息(描述符)

usb设备必须返回“描述符”给pc

 

问: pc机上皆有非常多的usb设备 怎么分辨他们

usb接口只有4条线, 5v GND D- D+

答案:接在usb总线上的每一个usb设备都有自己的编号(地址)

pc机想访问某个usb设备是,发出的命令都含有对应的编号(地址)

 

问:usb设备刚介入usb设备,pc机就能发现他?

答: pc的usb口内部,D-和D+接有15看的下拉电阻,未接usb设备时为低电平

usb设备的usb口内部D- 或者D+接有1.5看的上拉电阻:当接入pc 就会把PC usb口的D-或者D+拉高,从硬件的角度通知PC有新设备接入。

其他概念:

1。 usb是主从结构的

所有的usb传输都是从usb主机这里发起的。usb从机设备没有主动通知主机的能力

例子: usb鼠标滑动一下立刻产生数据但是没有能力通知pc机来读取数据只能被动的等待pc机来读取。

2. usb的传输类型:

a。控制传输: 可靠的 时间有保证比如usb设备的识别过程。

b   批量传输:可靠不实时时间没有保证 U盘

c  中断传输(假的中断,内部还是不断查询): 实时,且可靠 比如 鼠标: 

d 实时传输: 数据不可靠, 但是实时通信,usb摄像头

3. usb传输的对象:(端点 endpoint)

我们说“读写 U盘 写U盘”可以细化为: 把数据写到U盘的端点1 , 从U盘的端点2里面读出数据。除了端点0之外每一个端点支持一个方向的数据传输。

端点0 用于控制传输(识别usb)。既能输出也能输入。

4 每一个端点都有一个传输传输类型,还是传输的方向。

5. 程序里 术语里面说的输入输出 “都是基于”usb的主机说的。

  比如对于鼠标 鼠标的数据是从鼠标传到pc 方向对应的端点称为输入端点

6. usb总线驱动程序的作用:

1. 识别usb设备

1.1 分配地址 并且告诉usb设备(设置地址)

1.2 发出命令 获取描述符

2 查找并且安装对应的设备驱动程序

 

3 提供usb读写函数

 

usb驱动程序框架

app:

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

usb设备驱动程序

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

usb总线驱动程序

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

usb主机控制器

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

usb主机控制器:

1. UHCI: intel 低速(1.5Mbps)/全速(12Mbps)  usb2.0

2 OHCI: Microsoft  低速/全速

3. EHCI: 高速(480Mbps)

 

linux 内核下面 usb的function关系

hub_irq

   kick_khubd

       hub_thread  

           hub_events

             hub_port_connect_change

                             choose_address(udev); //给新设备分配地址

                       hub_port_init 

                                                       hub_set_address

                                                             usb_get_device_descriptor(udev,8)

                                                              retval = usb_get_device_descritor //获取设备描述符

   usb_new_device(udev)

   err = usb_get_confinguration(udev);

  usb_parse_configuration

device_add //把device 放入bus的dev 链表 从bus的driver 链表去除driver,一一比较 如果匹配 调用的driver的probe 函数

 

posted on 2020-11-15 16:29  闲云潭影  阅读(353)  评论(0编辑  收藏  举报