问题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 函数