USB驅(qū)動(dòng)程序框架搭建
app:
-------------------------------------------
內(nèi)核 --------------------------------------
-------------------------------------------
硬件 -----------
UHCI: intel, 低速(1.5Mbps)/全速(12Mbps)
OHCI: microsoft 低速/全速
EHCI: 高速(480Mbps)
也就是說最底層是usb設(shè)備,往上是USB總線控制器、USB總線驅(qū)動(dòng)程序、USB驅(qū)動(dòng)程序,最后是應(yīng)用程序。其中USB總線控制器包括三種:UHCI OHCI EHCI
2. USB總線驅(qū)動(dòng)程序的作用
1. 識別USB設(shè)備
描述符的信息可以在includelinuxusbCh9.h看到
2. 查找并安裝對應(yīng)的設(shè)備驅(qū)動(dòng)程序
3. 提供USB讀寫函數(shù)
3、我們開始正式構(gòu)建linux usb框架了,小心了!??!
首先我們需要從開發(fā)板獲得一些信息:
把USB設(shè)備接到開發(fā)板上,看輸出信息:
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
接著我們就可以根據(jù)這些信息進(jìn)行分析了:
首先我們在內(nèi)核的dirvers目錄下搜索:“USB device using ”
grep "USB device using" * -nR
結(jié)果搜到了下面這條信息:usb/core/hub.c:2186: "%s %s speed %sUSB device using %s and address %d",
那么我們就從usb/core/hub.c這個(gè)文件開始分析:
hub_port_init 在函數(shù)hub_port_connect_change中被調(diào)用
hub_port_connect_change在函數(shù)hub_events中被調(diào)用
hub_events在函數(shù)hub_thread中被調(diào)用
hub_thread函數(shù)里有這么一句:
wait_event_interruptible(khubd_wait,!list_empty(&hub_event_list) || kthread_should_stop());
說明進(jìn)程會在khubd_wait這個(gè)等待隊(duì)列里休眠,那么誰把它喚醒呢?我們搜索一下
在kick_khubd函數(shù)里有這么一句:wake_up(&khubd_wait);把進(jìn)程喚醒了
kick_khubd被函數(shù)hub_irq調(diào)用,根據(jù)注釋信息我們知道當(dāng)連接發(fā)生變化或則出現(xiàn)措施就會發(fā)生中斷,從而進(jìn)入這個(gè)函數(shù)。
那么我們大致可以總結(jié)出了框架:
hub_irq //發(fā)生接口狀態(tài)變化或出現(xiàn)錯(cuò)誤時(shí)調(diào)用
我們來總結(jié)一下上面的框架:首先接上usb設(shè)備時(shí)會發(fā) 生中斷,然后喚醒進(jìn)程。接著先設(shè)置usb設(shè)備的地址,然后獲取設(shè)備描述符和配置描述符等各種描述符,這是為了尋找驅(qū)動(dòng)程序。接著將usb設(shè)備加入到鏈表里,和驅(qū)動(dòng)比較,如果匹配就調(diào)用probe函數(shù)。
評論