<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 業(yè)界動(dòng)態(tài) > [ARM筆記](méi)設備驅動(dòng)概述

[ARM筆記](méi)設備驅動(dòng)概述

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏

  mknod命令建立一個(gè)目錄項和一個(gè)特殊文件的對應索引節點(diǎn)。第一個(gè)參數Name項是設備的名稱(chēng),選擇一個(gè)描述性的設備名稱(chēng)。

本文引用地址:http://dyxdggzs.com/article/201611/340660.htm

  mknod命令有兩種形式,它們有不同的標志。mknod命令的第一種形式只能由root用戶(hù)或系統組成員執行。在第一種形式中,使用了b或c標志。b標志表示這個(gè)特殊文件是面向塊的設備(磁盤(pán)、軟盤(pán)或磁帶)。c標志表示這個(gè)特殊文件是面向字符的設備(其他設備)。在 mknod 命令的第二種形式中,使用了p標志來(lái)創(chuàng )建FIFO(已命名的管道)。

  因此,標志集合總共有三種選擇,如下:

  * b 表示特殊文件是面向塊的設備(磁盤(pán)、軟盤(pán)或磁帶)。

  * c 表示特殊文件是面向字符的設備(其他設備)。

  * p 創(chuàng )建 FIFO(已命名的管道)。

  在介紹創(chuàng )建設備文件時(shí),主設備號和從設備號是不可或缺的。傳統方式中的設備管理中,除了設備類(lèi)型外,內核還需要一對主次設備號的參數,才能唯一標識一個(gè)設備。主設備號相同的設備使用相同的驅動(dòng)程序,次設備號用于區分具體設備的實(shí)例。比如PC機中的IDE設備,一般主設備號使用3,WINDOWS下進(jìn)行的分區,一般將主分區的次設備號為1,擴展分區的次設備號為2、3、4,邏輯分區使用5、6…。

  第一種形式的最后兩個(gè)參數便是指定主設備號和次設備號,它幫助操作系統查找設備驅動(dòng)程序代碼,和指定具體的次設備。一個(gè)設備的主設備號和次設備號由該設備的配置方法分配。主設備號是由/usr/src/linux/include/linux/major.h定義的,如下定義了一個(gè)DOC設備:

  #define IGEL_FLASH_MAJOR 62

  如命令mknod doc b 62 0

  其中的doc為定義的名字,b指塊設備,0指的是整個(gè)DOC。如果把0換為1,則1指的是DOC的第一個(gè)分區。2是第2個(gè),依次類(lèi)推。

  mknod console c 5 1

  console是設備的名字;c指字符設備,還可選b(塊設備);5是該設備在major.h中定義的標記,主設備號/dev/devices里面記錄現有的設備,創(chuàng )建設備文件時(shí),找個(gè)系統中還沒(méi)有用過(guò)的就可以了;1是指第一個(gè)子設備。當你要給兩個(gè)同樣的設備加載驅動(dòng)的時(shí)候就要用到這些區別了。

  3. 驅動(dòng)程序的加載和卸載

  內核中采用可加載的模塊化設計,一般情況下編譯的內核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內核中,其它的代碼可以選擇是在內核中,或者編譯為內核的模塊文件。如果需要某種功能,比如需要訪(fǎng)問(wèn)一個(gè)NTFS分區,就加載相應的NTFS模塊。這種設計可以使內核文件不至于太大,但是又可以支持很多的功能,必要時(shí)動(dòng)態(tài)地加載。這是一種跟微內核設計不太一樣,但卻是切實(shí)可行的內核設計方案。

  3.1 Linux驅動(dòng)的加載方式

  由于Linux系統內核有如上的特點(diǎn),所以設備驅動(dòng)程序也秉承了這種特性。常見(jiàn)的驅動(dòng)程序就是作為內核模塊動(dòng)態(tài)加載的,比如聲卡驅動(dòng)和網(wǎng)卡驅動(dòng)等。而Linux最基礎的驅動(dòng),如CPU、PCI總線(xiàn)、TCP/IP協(xié)議、VFS等驅動(dòng)程序則編譯在內核文件中。因此,Linux驅動(dòng)的加載可分為靜態(tài)加載和動(dòng)態(tài)加載兩種不同的方式。

  * 靜態(tài)加載:系統啟動(dòng)時(shí)自動(dòng)加載驅動(dòng)到內核,自動(dòng)的注冊設備并創(chuàng )建設備接點(diǎn),也就是說(shuō)把驅動(dòng)程序直接編譯到內核,系統啟動(dòng)后應用程序可以直接運行、調用。靜態(tài)加載的缺點(diǎn)是調試起來(lái)比較麻煩,每次修改一個(gè)地方都要重新編譯下載內核,效率較低。

  * 動(dòng)態(tài)加載:即模塊加載,系統啟動(dòng)時(shí)不會(huì )進(jìn)行加載驅動(dòng)程序,需要人為手動(dòng)加載,就是說(shuō)系統啟動(dòng)后我們的應用程序不能直接應用驅動(dòng),而是我們必須手動(dòng)的用insmod命令去加載模塊,然后才能使用相應的設備和應用,在不需要的時(shí)候用rmmod命令來(lái)卸載。

  其中動(dòng)態(tài)加載我們又可以分為三種去研究:

  加載驅動(dòng)后,我們自己去創(chuàng )建主設備號,從設備號,利用cat /proc/devices 去查看主設備號是否重復,然后根據應用程序中使用的設備名稱(chēng)用mknod命令去創(chuàng )建設備文件接點(diǎn)。

  加載驅動(dòng)后,驅動(dòng)程序會(huì )利用register_chrdev()函數自動(dòng)產(chǎn)生主設備號去在內核中注冊設備,我們利用cat /proc/devices命令和驅動(dòng)程序中注冊的設備名去查詢(xún)主設備號和從設備號后,在根據應用程序使用的設備名,去利用mknod去創(chuàng )建。(利用驅動(dòng)中注冊的設備名是查詢(xún)自動(dòng)生成的主設備號,驅動(dòng)中的設備名稱(chēng)不一定要和創(chuàng )建的設備接點(diǎn)名相同,他們之間可以用主設備號去關(guān)聯(lián),而應用程序的設備名稱(chēng)則必須和創(chuàng )建的設備接點(diǎn)名相同)。

  加載驅動(dòng)后,驅動(dòng)程序利用devfs系統,這個(gè)系統可以自動(dòng)的產(chǎn)生主設備號,然后自動(dòng)的創(chuàng )建設備接點(diǎn)。我們只要加載驅動(dòng)后,直接運行應用程序就行了。

  一般嵌入式驅動(dòng)開(kāi)發(fā)者會(huì )先用動(dòng)態(tài)加載的方式來(lái)調試,調試完畢后再編譯到內核里。下面我們將向讀者介紹下如何使用insmod動(dòng)態(tài)加載模塊。

  3.2 Linux驅動(dòng)加載和卸載

  當我們編寫(xiě)好需要加載的模塊、創(chuàng )建了其在內核的設備掛載節點(diǎn)之后,下一步要進(jìn)行的操作就是將該設備模塊加載到內核,也就是把編譯后的驅動(dòng)程序的.ko文件加載到內核。這個(gè)工作將由insmod完成。這個(gè)程序將加載模塊的代碼段和數據段到內核,接著(zhù),執行一個(gè)類(lèi)似ld的函數,它連接模塊中任何未解決的符號連接到內核的符號表上。

  insmod接收許多命令行選項,它能夠在連接到當前內核之前,為模塊中的參數賦值,加載時(shí)配置比編譯時(shí)配置給了用戶(hù)更多的靈活性,感興趣的讀者可以查閱相關(guān)的資料。一般常用的命令方式為:

  #insmod /路徑 模塊編譯后生成文件.ko

  模塊可以用rmmod工具從內核去除。需要注意的是,如果內核認為模塊還在用,或者內核被配置成不允許模塊去除,模塊去除會(huì )失敗。除了上述兩種命令,還有一些相關(guān)的命令,在模塊加載時(shí)可以用到。如下所示:

  lsmod:列出當前系統中加載的模塊,其中顯示信息中分為三列,依次是:模塊名、模塊大小、模塊使用的數量。

  modprobe:使用modprobe命令,可以智能插入模塊,它可以根據模塊間的依存關(guān)系,以及/etc/modules.conf文件中的內容智能插入模塊。

  insmod:也是插入模塊的命令,但是它不會(huì )自動(dòng)解決依存關(guān)系。

  modinfo:用來(lái)查看模塊信息。

  4. 學(xué)習Linux驅動(dòng)程序的基礎及方法

  Linux設備驅動(dòng)的學(xué)習是一項浩大的工程,讀者需要一定的基礎。在前面,我們專(zhuān)門(mén)講到過(guò)驅動(dòng)程序是連接硬件設備和操作系統的橋梁。

  因此,驅動(dòng)的開(kāi)發(fā)不僅要有良好的硬件基礎,懂得SRAM、Flash、SDRAM、磁盤(pán)的讀寫(xiě)方式,UART、I2C、USB等設備的接口,輪詢(xún)、中斷、DMA的原理,PCI總線(xiàn)的工作方式以及CPU的內存管理單元(MMU)等硬件處理的方式;還需要對Linux內核有一定的了解,雖然并不要求工程師對內核各個(gè)部分有深入的研究,但至少要了解設備驅動(dòng)與內核的接口,尤其是對于塊設備、網(wǎng)絡(luò )設備、Flash設備、串口設備等復雜設備的驅動(dòng)框架等。

  另外,在應用中很有可能多個(gè)程序訪(fǎng)問(wèn)同一個(gè)設備,這也就需要具有良好的多任務(wù)并發(fā)控制和同步的基礎。動(dòng)手實(shí)踐永遠是學(xué)習任何軟件開(kāi)發(fā)的最好方法,學(xué)習Linux設備驅動(dòng)也不例外。

  一般來(lái)說(shuō),編寫(xiě)一個(gè)Linux設備驅動(dòng)程序的大致流程如下:

  (1)查看原理圖、數據手冊,了解設備的操作方法。

  (2)在內核中找到相近的驅動(dòng)程序,以它為模板進(jìn)行開(kāi)發(fā),有時(shí)候需要從零開(kāi)始。

  (3)實(shí)現驅動(dòng)程序的初始化:比如向內核注冊這個(gè)驅動(dòng)程序,這樣應用程序傳入文件名時(shí),內核才能找到相應的驅動(dòng)程序。

  (4)設計所要實(shí)現的操作,比如:open、close、read、write等函數。

  (5)實(shí)現中斷函數(中斷并不是每個(gè)設備驅動(dòng)所必需的)。

  (6)編譯該驅動(dòng)程序到內核中,或者用insmod命令加載。

  (7)測試驅動(dòng)程序。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: ARM Linux

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>