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驱动之usb_skel分析
- Linux驱动开发:USB驱动之usb_skel分析
- [Linux驱动开发] USB驱动之usb_skel分析
- Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析
- USB 设备驱动开发之几个重要结构体分析
- 慢慢学Linux驱动开发,第四篇,USB工作原理简单分析
- Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析
- USB 设备驱动开发之几个重要结构体分析
- Android USB 驱动分析与开发----编程
- Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析
- USB 设备驱动开发之几个重要结构体分析
- 慢慢学Linux驱动开发,第四篇,USB工作原理简单分析
- USB Gadget设备驱动开发(四) BusHound 抓包分析
- 龙芯软件开发(33)-- USB协议深入分析
- 龙芯软件开发(37)- USB协议深入分析 返回设备描述符
- 龙芯软件开发(36)- USB协议深入分析 返回设备描述符
- 龙芯软件开发(38)- USB协议深入分析 设置USB地址
- 龙芯软件开发(38)- USB协议深入分析 设置USB地址
- 龙芯软件开发(35)- USB协议深入分析 设备描述符配置包
- 龙芯软件开发(39)- USB协议深入分析 配置