嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)_第1頁(yè)
嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)_第2頁(yè)
嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)_第3頁(yè)
嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)_第4頁(yè)
嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【W(wǎng)ord版本下載可任意編輯】嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)隨著計(jì)算機(jī)外圍硬件的擴(kuò)展,各種外圍設(shè)備使用不同的總線接口,導(dǎo)致計(jì)算機(jī)外部各種總線繁多,管理困難,USB總線可以解決這些問(wèn)題,因此而誕生。USB總線提供統(tǒng)一的外設(shè)的接口方式,并且支持熱插拔,方便了廠商開發(fā)設(shè)備和用戶使用設(shè)備。USB(通用串行總線)是由Microsft,Compad,Inter和NEC等推出的外圍總線接口,目前已發(fā)展到2.0標(biāo)準(zhǔn)支持480Mb/s的速率,多可以支持127個(gè)外設(shè)。

嵌入式Linux是一款源代碼完全的新興操作系統(tǒng),用戶可以用戶可以通過(guò)網(wǎng)絡(luò)等其他途徑獲得,并可以任意修改其源代碼,這是其他的操作系統(tǒng)做不到的。正是由于這一點(diǎn),Linux得到了廣泛的應(yīng)用。

1Linux中USB設(shè)備驅(qū)動(dòng)程序框架及數(shù)據(jù)構(gòu)造

1.1USB的體系構(gòu)造

USB接口標(biāo)準(zhǔn)支持外部設(shè)備和主機(jī)之間開展數(shù)據(jù)傳送。在USB構(gòu)造中主機(jī)頂設(shè)各種類型外設(shè)使用的總線寬度。當(dāng)外設(shè)和主機(jī)在運(yùn)行時(shí),USB總線允許使用,設(shè)置,添加和拆掉外設(shè)。

在USB體系構(gòu)造中一個(gè)USB系統(tǒng)可以分成USB設(shè)備、USB主機(jī)和USB互聯(lián)3個(gè)部分。USB互聯(lián)是USB設(shè)備和USB主機(jī)之間開展連接通信的操作,主要包括:

1)總線拓?fù)錁?gòu)造:UsB主機(jī)和USB設(shè)備之間的連接方式;

2)數(shù)據(jù)流模式:描述USB通信系統(tǒng)數(shù)據(jù)如何從產(chǎn)生方傳遞到使用方;

3)USB調(diào)度:USB總線是一個(gè)共享連接,對(duì)可以使用的連按開展調(diào)度以支持同步數(shù)據(jù)傳輸,并防止優(yōu)先級(jí)判斷的開銷。

USB的物理連接是有層次的星型構(gòu)造,如圖1所示。

圖1USB體系拓?fù)錁?gòu)造圖

從圖中可以看出USB集線器在一個(gè)節(jié)點(diǎn)上連接多個(gè)設(shè)備,每條線段都是點(diǎn)點(diǎn)連接,每個(gè)USB集線器在星形的中心。從主機(jī)到設(shè)備或者USB集線器,或USB集線器到設(shè)備都是點(diǎn)點(diǎn)連接。

1.2USB驅(qū)動(dòng)程序的構(gòu)造

USN總線在技術(shù)層面上是非常簡(jiǎn)單的,它是一個(gè)單主方式實(shí)現(xiàn)的,主機(jī)輪詢各種不同的外圍設(shè)備,USB另外一個(gè)重要的特性是它只擔(dān)當(dāng)設(shè)備和主控制器之間通訊通道的角色,對(duì)所發(fā)送的數(shù)據(jù)沒(méi)有任何特殊的內(nèi)容和構(gòu)造上的要求。

Linux支持兩種類型的USB驅(qū)動(dòng),宿主系統(tǒng)上的驅(qū)動(dòng)程序和設(shè)備上的驅(qū)動(dòng)程序。宿主USB驅(qū)動(dòng)程序控制插入其中的USB設(shè)備,而USB設(shè)備的驅(qū)動(dòng)程序控制設(shè)備如何作為一個(gè)USB設(shè)備和主機(jī)通訊。這里主要討論設(shè)備驅(qū)動(dòng)。

USB的基本通信的形式基本通過(guò)端點(diǎn)的東西。USB端點(diǎn)只能往一個(gè)方向傳輸數(shù)據(jù),從主機(jī)到設(shè)備或從設(shè)備到主機(jī)。USB端點(diǎn)分別具有不同的傳輸數(shù)據(jù)的方式,他們有4種類型,分別是:1)控制端點(diǎn)用來(lái)控制對(duì)USB設(shè)備不同部分的訪問(wèn)。他們用于配置設(shè)備,獲取設(shè)備信息,獲取設(shè)備的狀態(tài),發(fā)送命令到設(shè)備。它是一種非周期性的可靠的傳輸。2)中斷端點(diǎn)就是設(shè)備傳輸數(shù)據(jù)時(shí)以一個(gè)固定的速率來(lái)傳輸少量的數(shù)據(jù)。這些端點(diǎn)是鼠標(biāo)和USB鍵盤所使用的主要傳輸方式。它通常用于發(fā)送數(shù)據(jù)到USB設(shè)備以控制設(shè)備,一般不用來(lái)傳輸大量數(shù)據(jù)。USB協(xié)議保證這些傳輸有足夠的保存帶寬來(lái)傳輸數(shù)據(jù)。3)等時(shí)端點(diǎn)同樣可以傳輸大批量的數(shù)據(jù),但數(shù)據(jù)是否到達(dá)沒(méi)有保障,這些端點(diǎn)用于可以應(yīng)付數(shù)據(jù)丟失的情況,這類設(shè)備更注重于保持一定的恒定的數(shù)據(jù)流,實(shí)時(shí)的數(shù)據(jù)收集都使用這類端點(diǎn)。4)批量端點(diǎn)傳輸大量的數(shù)據(jù)。這些端點(diǎn)通常比中斷端點(diǎn)大的多他們常用于需要確保沒(méi)有數(shù)據(jù)丟失的傳輸設(shè)備。USB協(xié)議不保證這些傳輸始終可以在特定的時(shí)間內(nèi)完成。如果總線上的空間缺陷以發(fā)送整個(gè)批量包。它將被分割為多個(gè)包開展傳輸。

當(dāng)一個(gè)USB設(shè)備連接到主機(jī)時(shí),主時(shí)機(jī)給這個(gè)設(shè)備分配一個(gè)1~127之間的的設(shè)備號(hào)同時(shí)讀取該設(shè)備的描述符,該設(shè)備描述符是描述設(shè)備信息及其屬性的數(shù)據(jù)構(gòu)造,USB以一種層次化的構(gòu)造定義設(shè)備的描述符,設(shè)備描述符給出了USB設(shè)備的一般信息,包括對(duì)設(shè)備及所有設(shè)備配置起全程作用的信息,一個(gè)USB設(shè)備只能有一個(gè)設(shè)備描述符,配置描述符中的信息與設(shè)備特定的配置相關(guān),一個(gè)USB設(shè)備可以有一個(gè)或多個(gè)配置描述符,每一個(gè)配置描述符又由一個(gè)或多個(gè)接口描述符組成,接口描述符的信息是與設(shè)備驅(qū)動(dòng)程序的開發(fā)密切相關(guān),可以一個(gè)接口對(duì)應(yīng)一個(gè)設(shè)備驅(qū)動(dòng)程序也可以多個(gè)接口對(duì)應(yīng)一個(gè)設(shè)備驅(qū)動(dòng)程序,接口描述符由零個(gè)或多個(gè)端點(diǎn)描述符組成,端點(diǎn)描述符定義了在一個(gè)給定的設(shè)備里實(shí)現(xiàn)的實(shí)際存放器,這些描述符定義了每個(gè)存放器的功能和特定的信息如端點(diǎn)要求的傳輸類型、傳輸方向、帶寬要求、查詢間隔等。另外,還有一個(gè)可選的宇符串描述符,它以UNCOND碼的格式給出了一些可讀的信息,這些信息通常是有關(guān)設(shè)備生產(chǎn)廠商、設(shè)備名設(shè)備序列號(hào)等,通過(guò)這些不同層次的描述符,主機(jī)設(shè)備驅(qū)動(dòng)程序就可以知道具體設(shè)備的相關(guān)信息,從而對(duì)設(shè)備開展相應(yīng)控制。

圖2USB驅(qū)動(dòng)程序?qū)哟螆D

1.3USB驅(qū)動(dòng)程序框架

1.3.1基本數(shù)據(jù)構(gòu)造

usb-skel設(shè)備使用自定義構(gòu)造usb_skel記錄設(shè)備驅(qū)動(dòng)用到的所有描述符,該構(gòu)造定義如下:

1.3.2驅(qū)動(dòng)程序初始化和注銷

同其他所有的Linux設(shè)備驅(qū)動(dòng)程序一樣,usb-skel驅(qū)動(dòng)使用module_init()宏初始化函數(shù),使用module_exit()宏注銷函數(shù)。usb-skel驅(qū)動(dòng)的初始化函數(shù)usb_skel_init()函數(shù),定義如下:

sb_skel_init()函數(shù)調(diào)用內(nèi)核提供的usb_register()函數(shù)注冊(cè)了一個(gè)usb_driver類型的構(gòu)造變量,該變量定義如下:

其中usb_skel設(shè)備的USBID映射表定義如下:

在USB驅(qū)動(dòng)中調(diào)用usb_deregister()函數(shù)注銷usb-skel設(shè)備驅(qū)動(dòng),函數(shù)定義如下:

1.3.3初始化設(shè)備

從skel_driver構(gòu)造可以知道usb-skel設(shè)備的初始化函數(shù)是skel_probe()函數(shù),設(shè)備初始化主要是探測(cè)設(shè)備類型,分配USB設(shè)備用到的urb資源,注冊(cè)USB設(shè)備操作函數(shù)等。

skel_class構(gòu)造變量記錄了usb-skel設(shè)備信息,定義如下:

name變量使用%d通配符表示一個(gè)整型變量,當(dāng)一個(gè)usb-skel類型的設(shè)備連接到USB總先后會(huì)2按照子設(shè)備編號(hào)自動(dòng)設(shè)置設(shè)備名稱。Fops設(shè)備操作函數(shù)構(gòu)造變量,定義如下:

1.3.4設(shè)備注銷

skel_disconnect()函數(shù)在注銷設(shè)備時(shí)被調(diào)用,定義如下:

2USB串口驅(qū)動(dòng)

2.1驅(qū)動(dòng)初始化函數(shù)

usb_serial_init()函數(shù)是一個(gè)典型的USB設(shè)備驅(qū)動(dòng)初始化函數(shù),定義如下:

函數(shù)首先調(diào)用alloc_tty_driver()函數(shù)分配一個(gè)串口驅(qū)動(dòng)描述符;然后設(shè)置串口驅(qū)動(dòng)的屬性,包括驅(qū)動(dòng)的主從設(shè)備號(hào)、設(shè)備類型、串口初始化參數(shù)等;串口驅(qū)動(dòng)描述符設(shè)置完畢后,調(diào)用usb_register()函數(shù)注冊(cè)USB串口設(shè)備。

2.2驅(qū)動(dòng)釋放函數(shù)

2.3串口操作函數(shù)

USB串口設(shè)備驅(qū)動(dòng)使用了一個(gè)tty_operations類型的構(gòu)造,該構(gòu)造包含了串口的所有操作,定義如下:

按上述的步驟和方法通過(guò)lnsmod命令成功實(shí)現(xiàn)了USB驅(qū)動(dòng)程序的加載,成功的通過(guò)USB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論