Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)_第1頁
Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)_第2頁
Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)_第3頁
Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)_第4頁
Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)Linux系統(tǒng)下USB驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)論文導(dǎo)讀::操作系統(tǒng)是一個(gè)源碼公開、結(jié)構(gòu)清晰、功能強(qiáng)大??偩€具有低成本、使用簡單、支持即插即用、易于擴(kuò)展等特點(diǎn)。本文首先介紹linux驅(qū)動(dòng)程序的架構(gòu)。關(guān)鍵詞:Linux,USB,驅(qū)動(dòng)程序0引言Linux操作系統(tǒng)是一個(gè)源碼公開、結(jié)構(gòu)清晰、功能強(qiáng)大,且已成為一個(gè)穩(wěn)定可靠功能完善的系統(tǒng)。其開發(fā)群體的有效組織和高效工作,使得linux系統(tǒng)穩(wěn)定發(fā)展并得到良好維護(hù)。USB總線是Intel、DEC、MicroSoft、IBM等公司聯(lián)合提出的一種新的串行總線標(biāo)準(zhǔn),主要用于PC機(jī)與外圍設(shè)備的互聯(lián)。USB總線具有低成本、使用簡單、

2、支持即插即用、易于擴(kuò)展等特點(diǎn),已被廣泛地用在PC機(jī)及嵌入式系統(tǒng)上。在已經(jīng)研制的家庭網(wǎng)關(guān)中,CPU通過自帶的USB接口控制USB設(shè)備。本文首先介紹linux驅(qū)動(dòng)程序的架構(gòu)發(fā)表論文,然后介紹USB總線,重點(diǎn)說明USB驅(qū)動(dòng)程序的實(shí)現(xiàn)。1.Linux驅(qū)動(dòng)程序基礎(chǔ)設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,為應(yīng)用程序屏蔽了硬件的細(xì)節(jié)。應(yīng)用程序看待硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它主要完成以下功能:對(duì)設(shè)備進(jìn)行初始化,使設(shè)備投入運(yùn)行和退出服務(wù);把數(shù)據(jù)從內(nèi)核傳送到設(shè)備和從設(shè)備接受數(shù)據(jù);以及檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤等。Linux系統(tǒng)的設(shè)

3、備一般分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備三種。字符設(shè)備是指存取時(shí)沒有緩存的設(shè)備。塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機(jī)存取,字符設(shè)備則沒有這個(gè)要求。一個(gè)文件系統(tǒng)要安裝進(jìn)入操作系統(tǒng)必須在塊設(shè)備上。網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix的socket機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(skbuff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。2.USB系統(tǒng)總線介紹每一個(gè)USB設(shè)備會(huì)有一個(gè)或者多個(gè)的邏輯連接點(diǎn),每個(gè)連接點(diǎn)叫端口。每個(gè)端口有4種數(shù)據(jù)傳送方式:控制方式;等時(shí)方式;中斷方式和大量

4、方式。但是所有的端口0都是被用來傳送配置和控制信息。在主機(jī)和設(shè)備的端口之間的連接叫作管道,與端口0連接的一般稱作為缺省管道。對(duì)于同樣性質(zhì)的一組端口的組合叫做接口發(fā)表論文,如果一個(gè)設(shè)備包含不止一個(gè)的接口就可以稱之為復(fù)合設(shè)備。同理,對(duì)于同樣的類型的接口的組合可以稱之為配置。但是每次只能有一個(gè)配置是可用的,而一旦該配置激活,里面的接口和端口就都同時(shí)可以使用。主機(jī)從設(shè)備發(fā)過來的描述符中來判斷用的是哪個(gè)配置,哪個(gè)接口等等,而這些的描述字通常是在端口0中傳送。3.USB子系統(tǒng)USB 是一種分層的總線結(jié)構(gòu),并且是由一個(gè)主機(jī)(host)來控制。主機(jī)用主/副協(xié)議來和外部USB設(shè)備通訊。USB上的通訊主要是兩個(gè)方

5、向進(jìn)行的,一個(gè)是主機(jī)到設(shè)備的下行方向, 一個(gè)是設(shè)備到主機(jī)的上行方向,不支持設(shè)備間的直接通訊。依靠不同的設(shè)備類型,主要有4 種的傳輸方式::控制(control)、中斷(interrupt)、同步(isochronous)、數(shù)據(jù)塊(bulk);如果是從硬件開始來設(shè)計(jì)整個(gè)的系統(tǒng),還要正確選擇傳輸?shù)姆绞健6鳛橐粋€(gè)驅(qū)動(dòng)程序的書寫者就只需要弄清楚他是采用的什么工作方式就行了。通常所有的傳輸方式下的主動(dòng)權(quán)都在 host邊。在Linux系統(tǒng)中編寫主機(jī)部分的USB驅(qū)動(dòng)發(fā)表論文,我們不必了解太多的硬件知識(shí),因?yàn)長inux 內(nèi)核模塊中提供了一塊USB內(nèi)核(USBcore),它給出專門的API來支持USB設(shè)備和主

6、控制器。通過定義一系列數(shù)據(jù)結(jié)構(gòu),宏命令和函數(shù)對(duì)所有的硬件和設(shè)備支持部分進(jìn)行抽象。USB內(nèi)核包含了所有USB設(shè)備驅(qū)動(dòng)和主控制器驅(qū)動(dòng)的共同的USB程序。這些函數(shù)主要集中在上層和底層API。如圖1所示,有一個(gè)USB設(shè)備的驅(qū)動(dòng)的API和一個(gè)主控制器的.驅(qū)動(dòng)。圖1USB內(nèi)核API層4.USB設(shè)備驅(qū)動(dòng)框架USB設(shè)備驅(qū)動(dòng)在內(nèi)核模塊中需要注冊(cè)和注銷。因此一個(gè)驅(qū)動(dòng)必須注冊(cè)2個(gè)入口點(diǎn)和一個(gè)設(shè)備節(jié)點(diǎn)。對(duì)于特別的USB設(shè)備(他們不適合在子系統(tǒng)中注冊(cè))一個(gè)驅(qū)動(dòng)可以注冊(cè)一對(duì)文件操作符和一個(gè)次設(shè)備號(hào)。一般一個(gè)驅(qū)動(dòng)可以服務(wù)16個(gè)相似的USB設(shè)備。幾乎所有的USB設(shè)備主設(shè)備號(hào)都是180。4.1框架數(shù)據(jù)結(jié)構(gòu)所有的USB相關(guān)的函數(shù)

7、和數(shù)據(jù)結(jié)構(gòu)的名字都是以USB_開頭的。下面給出在子系統(tǒng)中注冊(cè)一個(gè)USB驅(qū)動(dòng)程序的數(shù)據(jù)結(jié)構(gòu)。struct usb _driver const char *name; / /模塊的名字void* ( *probe)(struct usb_device *,unsigned int) ;/ /函數(shù)的進(jìn)入指針void ( *disconnect) ( struct usb_device *,void * ) ; / /撤銷連接的函數(shù)進(jìn)入指針struct list_headdriver_list ;/ /給子系統(tǒng)內(nèi)部使用,初始化時(shí)為 NULLstructfile_operations *fops ;/

8、/文件操作列表指針int minor ;/ /次設(shè)備號(hào) ;這里特別要提的就是文件操作的結(jié)構(gòu)(structfile_operations),隨著新功能不斷加入 Linux內(nèi)核,此文件操作的結(jié)構(gòu)也變得越來越大,這種增長是不會(huì)有副作用的。因?yàn)閷?duì)于特定的設(shè)備驅(qū)動(dòng),我們可以選擇自己需要的函數(shù),不需要的就設(shè)為NULL值就可以。下面主要列舉一些USB常用的幾個(gè)文件操作函數(shù):(1)int ( *open) ( struct inode *, struct file*) ; 設(shè)備打開操作一般是設(shè)備的第一個(gè)操作,不過有的設(shè)備可以不選擇這個(gè)函數(shù)。那樣設(shè)備的打開操作就會(huì)永遠(yuǎn)成功發(fā)表論文,但系統(tǒng)不會(huì)通知你的驅(qū)動(dòng)程序。(

9、2) void ( *release)( struct inode * , struct file* ) ; 當(dāng)節(jié)點(diǎn)關(guān)閉時(shí)調(diào)用這個(gè)操作。(3) int ( *read) ( struct inode * , struct file * ,char * , int) ; 用來從設(shè)備中讀取數(shù)據(jù)。函數(shù)返回一個(gè)非負(fù)值表示成功的讀取了多時(shí)字節(jié)。(4) int ( *write) ( struct inode * , struct file * ,const char * , int ) ; 向設(shè)備發(fā)數(shù)據(jù)。如果返回值非負(fù),它就表示成功寫入的字節(jié)數(shù)。(5) int ( *select) (struct in

10、ode * , struct file * ,int , select_table * ) ; select一般用于程序詢問設(shè)備是否可讀或可寫,或是否一個(gè)“異?!睏l件發(fā)生了。(6) int ( *ioctl) ( struct inode * , struct file * ,unsigned int , unsigned long) ; 系統(tǒng)調(diào)用 ioctl 提供一種調(diào)用設(shè)備相關(guān)命令的方法。(7) int ( *mmap) ( struct inode * , struct file* , struct vm_area _struct * ) ; 用來將設(shè)備內(nèi)存映射到進(jìn)程內(nèi)存中。(8) in

11、t ( *fsync) ( struct inode * , struct file* ) ; 刷新設(shè)備。4.2框架進(jìn)入指針USB 驅(qū)動(dòng)的框架增加了兩個(gè)進(jìn)入指針給普通的設(shè)備驅(qū)動(dòng)。(1) void * probe( struct usb_device * dev , unsigned int interface) ; 當(dāng)一個(gè)新設(shè)備加入總線時(shí),這個(gè)進(jìn)入指針就被調(diào)用。然后設(shè)備驅(qū)動(dòng)將創(chuàng)建一個(gè)新的設(shè)備數(shù)據(jù)結(jié)構(gòu)實(shí)例。參數(shù)dev表示設(shè)備的上下文,他包含了所有USB描述符的地址。參數(shù)interface表示接口值。如果一個(gè)USB驅(qū)動(dòng)想要綁定一個(gè)特別的設(shè)備或者接口,它必須返回一個(gè)指針。這個(gè)指針通常指向設(shè)備驅(qū)動(dòng)的上

12、下文結(jié)構(gòu)。(2) voiddisconnect ( struct usb_device * dev ,void * drv_context) ; 這個(gè)函數(shù)是在設(shè)備撤銷連接時(shí)調(diào)用的。參數(shù)dev列出了設(shè)備上下文。撤銷連接函數(shù)完成后,設(shè)備就脫離了USB的框架。以后USB驅(qū)動(dòng)就不能再調(diào)用它了。4.3框架函數(shù)(1)int usb_register ( struct usb_driver * drv) ;這個(gè)函數(shù)是用來注冊(cè)一個(gè)新的 USB 設(shè)備驅(qū)動(dòng)。指針drv指向結(jié)構(gòu)usb_driver。函數(shù)成功返回0。要不然返回一個(gè)錯(cuò)誤值。(2)voidusb_deregister ( struct usb_drive

13、r *drv) ; 此函數(shù)是注銷 USB 設(shè)備驅(qū)動(dòng)。(3)voidusb_driver_claim_interface ( struct usb_driver * driver , struct usb_interface *iface ,void * drv_context) ; 此函數(shù)是在probe函數(shù)執(zhí)行后,開始為設(shè)備驅(qū)動(dòng)申請(qǐng)更多的接口。Drive指針指向一個(gè)完整的已經(jīng)初始化的usb_driver結(jié)構(gòu)。Iface 指向usb_interface結(jié)構(gòu),此結(jié)構(gòu)是usb_config_descriptor(可以在usb_device結(jié)構(gòu)中看到)的一部分(在probe函數(shù)中賦值)。Drv_con

14、text 指針主要指向設(shè)備驅(qū)動(dòng)的上下文結(jié)構(gòu)(看probe函數(shù)的返回值)。(4)intusb_interface_claimed (struct usb_inter2face * iface); 這個(gè)函數(shù)是檢查是否有其他驅(qū)動(dòng)已經(jīng)聲明了這個(gè)接口。如果接口沒有被其它驅(qū)動(dòng)申請(qǐng)就返回0。(5)voidusb_driver_release_interface(structusb_driver * driver , struct usb_interface * iface); 這個(gè)函數(shù)主要是來釋放先前申請(qǐng)的接口。在 disconnect函數(shù)中, , 你不必釋放任何在probe函數(shù)中申請(qǐng)的接口。5.配置USB

15、設(shè)備USB內(nèi)核API除了包括了一套選擇或詢問的描述符,還有一些配置和更換的設(shè)備函數(shù)。所有這些標(biāo)準(zhǔn)操作都是通過控制傳輸給設(shè)備的。5.1數(shù)據(jù)結(jié)構(gòu)的描述Linux USB子系統(tǒng)通過擴(kuò)展或內(nèi)嵌標(biāo)準(zhǔn)的USB描述符來說明描述符的分級(jí)結(jié)構(gòu)。這種結(jié)構(gòu)有助于保存指向可選配置和接口的指針。只要被API調(diào)用,這些結(jié)構(gòu)的元素就會(huì)被描述。關(guān)于描述符的詳細(xì)信息可以在USB.H查到。struct usb_device. . .struct usb_config_descriptor* actconfig ;/ * the active configuration * /. . .struct usb_device_desc

16、riptordescriptor ;/ * Descriptor * /struct usb_config_descriptor* config ; / * 所有的參數(shù) * usb_device 結(jié)構(gòu)是所有USB專門的描述符的根節(jié)點(diǎn)。在用驅(qū)動(dòng)配置設(shè)備或者請(qǐng)求傳輸?shù)臅r(shí)候發(fā)表論文,就必須分解描述符。5.2標(biāo)準(zhǔn)的設(shè)備申請(qǐng)為了查詢或者設(shè)置一個(gè)特殊的配置或可選設(shè)置,可以用一個(gè)整型函數(shù)。并用這個(gè)函數(shù)建立標(biāo)準(zhǔn)的設(shè)備申請(qǐng)(指定設(shè)備的控制傳輸)。(1)intusb_set_configuration (struct usb_device* dev , int configuration); 此函數(shù)是激活特殊的配

17、置。0 =configuration descriptor .bNumConfigurations.設(shè)configuration為0將設(shè)備設(shè)為無地址狀態(tài)。這個(gè)意思是設(shè)備脫離這個(gè)設(shè)備地址并準(zhǔn)備接受一個(gè)新的。一般不要設(shè)0。因?yàn)槟銓⒉荒茉L問設(shè)備,直到被物理的重新連接到總線上。(2) intusb_set_interface ( struct usb_device *dev , int interface , int alternate) ; 這個(gè)函數(shù)激活指定接口的可選設(shè)置。(3) intusb_get_device_descriptor ( struct usb_device * dev) ; 這個(gè)

18、函數(shù)取出了設(shè)備完整的描述符結(jié)構(gòu)樹。當(dāng)一個(gè)設(shè)備連上總線時(shí),這個(gè)函數(shù)就會(huì)自動(dòng)被喚醒。或者當(dāng)一個(gè)USB描述符改變時(shí),此函數(shù)被調(diào)用。(4) intusb_get_string ( struct usb_device *dev , unsigned short langid , unsigned charindex , void* buf , int size) ; 如果一個(gè)設(shè)備,配置或者接口描述符涉及到字符串索引值,這個(gè)函數(shù)可以用來重新獲得字符描述符。標(biāo)準(zhǔn)的USB字符串是以UNICODE編碼的。如果成功就返回0,要不然返回一個(gè)錯(cuò)誤值。6.結(jié)束語USB的應(yīng)用越來越廣泛,傳輸速率越來越高。而Linux作為

19、一種新的操作系統(tǒng),其發(fā)展前景是無法估量的,同時(shí)也為USB總線與各種新型設(shè)備互連成為可能。在Linux下編寫驅(qū)動(dòng)程序的原理和思想與window環(huán)境下的驅(qū)動(dòng)程序有很大的區(qū)別,在Linux環(huán)境下設(shè)計(jì)驅(qū)動(dòng)程序發(fā)表論文,思想簡潔,功能也很強(qiáng)大,但是支持函數(shù)少,只能依賴kernel中的函數(shù),有些常用的操作要自己來編寫,而且調(diào)試也不方便,還要考慮內(nèi)核的前后兼容性,因此在設(shè)計(jì)和實(shí)現(xiàn)USB設(shè)備時(shí)應(yīng)該注意這些問題。參考文獻(xiàn):1毛德操,胡希明.Linux內(nèi)核源代碼情景分析M.杭州:浙江大學(xué)出版社,2003.2Universal Serial Bus SpecificationRevisionZ. Compaq, IBM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論