您的位置:首页 > 运维架构 > Linux

LINUX USB驱动开发(2)-USB驱动体系分析

2017-02-12 20:41 162 查看

一.日常USB现象:

1.将USB设备接入电脑上,右下角弹出“发现android phone”

2.跳出对话框。提示你安装驱动程序

问题1:既然没有安装驱动,为何能知道设备是“Android phone”

答1:windows里已经有了USB的“总线驱动程序”,接入USB设备后,是“总线驱动程序”知道你是“android phone”,提示按安装“设备驱动程序”

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

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

答2:PC和USB设备都遵循一些规范。

比如:USB设备接入电脑后,PC会发出“你是什么”?

USB设备就必须回答“我是XXX”,并且回答的格式一样,如语言必须是中文(拟人化)

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

USB设备必须返回“描述符”给PC

问3.PC机上接有非常多的USB设备,怎么分别他们?

USB接口只有4条线:5V,GND,D+,D-

答3.接在USB总线上的每一个USB设备都有自己的编号(地址)

每一个USB设备接入PC时,USB总线驱动程序都会给它分配一个编号

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

问4.USB设备刚接入PC时,还没有编号,那么PC怎么把“分配的编号”告诉它?

答4.新接入的USB设备的默认编号为0,在未分配新编号前,PC使用0编号和它通信。

问5.为什么一接入USB设备,PC机就能发现它?

答5.

PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平

USB设备的USB口内部,D-和D+接有1.5K的下啦电阻:它一接入PC,就会把PC的USB口的D-或D+拉高,从硬件角度通知PC有新设备接入。

二、其他概念:

1.USB是主从结构的

所有的USB传输,都是从USB主机这方发起:USB设备没有“主动”通知USB主机的能力

例子:USB鼠标滑动一下立刻产生数据,但是它没有能力通知PC机来读数据,只能被动地等待PC机来读。

2.USB的传输类型

a.控制传输:可靠、时间有保证,比如:USB设备的识别过程

b.批量传输:可靠、时间没有保证,比如:U盘

c.中断传输:可靠、实时,比如USB鼠标

d.实时传输:不可靠,实时,比如:USB摄像头

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

我们说“读U盘”、“写U盘”、可以细化为:把数据写到U盘的端点1,从U盘的端点2里读出数据

除端点0外,每一个端点只支持一个方向的数据传输

端点0用于控制传输,既能输出也能输入

4.每一个端点都有传输类型,传输方向

5.术语里、程序里说的输入(IN)、输出(OUT)“都是”基于USB主机的立场说的

比如鼠标的数据是从鼠标传到PC机,对应的端点称为“输入端点”

6.USB总线设备驱动程序的作用:

1.识别USB设备

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

3.提供USB读写函数/不了解数据含义

USB驱动程序框架

app:
--------------------------------------------------------------------------------
USB设备驱动程序//知道数据含义
--------------------------------------------------------------------------------
USB总线设备驱动程序 //1识别.2.找到匹配的设备驱动,3.提供USB读写函数
--------------------------------------------------------------------------------
USB主机控制器
UHCI OHCI EHCI
--------------------------------------------------------------------------------


硬件 USB设备

UHCI:intel,低速/全速USB设备

OHCI:micrsoft 低速/全速

EHCI :全速

三.USB总线设备驱动程序的作用:

1.识别USB设备

1.1分配地址,

1.2并告诉USB设备地址(set address)

1.3发出命令获取描述符usb_device_descriptor

描述符的信息可以在\include\linux\usb\Ch9.h看到

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

3.提供USB读写函数/不了解数据含义

将USB插入开发板

usb 1-3.3: new high speed USB device number 6 using s5p-ehci

[17009.531552] usb 1-3.3: New USB device found, idVendor=04e8, idProduct=6860, bcdDevice=0400

[17009.538377] usb 1-3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[17009.545701] usb 1-3.3: New USB device Class: Class=0, SubClass=0, Protocol=0

[17009.552682] usb 1-3.3: Product: SAMSUNG_Android

[17009.557190] usb 1-3.3: Manufacturer: SAMSUNG

[17009.561443] usb 1-3.3: SerialNumber: 357c9909

拔掉: usb 1-3.3: USB disconnect, device number 6

在内核目录下搜:

grep “USB device using”* -nR

kernel/driver/usb/core/hub.c:2897:”%s %s speed %sUSB device number %d using %s\n”

kernel/driver/usb/core/hub.c:3011: “%s SuperSpeed USB device number %d using%s\n”,

kernel/driver/usb/core/hub.c

USB总线调用关系

当USB设备插入主机后,由于硬件电路使主机感知到设备接入,主机产生一个中断

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 驱动开发 usb