1.首要咱们先从理论上浅谈一下USB驱动的结构
app:
——————————————-
内核 ————————————–
——————————————-
硬件 ———–
UHCI: intel, 低速(1.5Mbps)/全速(12Mbps)
OHCI: microsoft 低速/全速
EHCI: 高速(480Mbps)
也就是说最底层是usb设备,往上是USB总线控制器、USB总线驱动程序、USB驱动程序,最终是应用程序。其间USB总线控制器包含三种:UHCI OHCI EHCI
2. USB总线驱动程序的效果
1. 辨认USB设备
描述符的信息能够在includelinuxusbCh9.h看到
2. 查找并装置对应的设备驱动程序
3. 供给USB读写函数
3、咱们开端正式构建linux usb结构了,当心了!!!
首要咱们需要从开发板取得一些信息:
把USB设备接到开发板上,看输出信息:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] Attached SCSI removable disk
拔掉
usb 1-1: USB disconnect, address 2
再接上:
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
scsi1 : SCSI emulation for USB Mass Storage devices
scsi 1:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 1:0:0:0: [sda] Attached SCSI removable disk
接着咱们就能够依据这些信息进行剖析了:
首要咱们在内核的dirvers目录下查找:“USB device using ”
grep “USB device using” * -nR
成果搜到了下面这条信息:usb/core/hub.c:2186: “%s %s speed %sUSB device using %s and address %d”,
那么咱们就从usb/core/hub.c这个文件开端剖析:
hub_port_init 在函数hub_port_connect_change中被调用
hub_port_connect_change在函数hub_events中被调用
hub_events在函数hub_thread中被调用
hub_thread函数里有这么一句:
wait_event_interruptible(khubd_wait,!list_empty(&hub_event_list) || kthread_should_stop());
阐明进程会在khubd_wait这个等候行列里休眠,那么谁把它唤醒呢?咱们查找一下
在kick_khubd函数里有这么一句:wake_up(&khubd_wait);把进程唤醒了
kick_khubd被函数hub_irq调用,依据注释信息咱们知道当衔接产生改变或则呈现办法就会产生中止,然后进入这个函数。
那么咱们大致能够总结出了结构:
hub_irq //产生接口状况改变或呈现过错时调用
咱们来总结一下上面的结构:首要接上usb设备时会发 生中止,然后唤醒进程。接着先设置usb设备的地址,然后获取设备描述符和装备描述符等各种描述符,这是为了寻觅驱动程序。接着将usb设备加入到链表里,和驱动比较,假如匹配就调用probe函数。