在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 面對不斷升級的內(nèi)核如何學(xué)習(xí)linux設(shè)備驅(qū)動

            面對不斷升級的內(nèi)核如何學(xué)習(xí)linux設(shè)備驅(qū)動

            作者: 時間:2013-03-18 來源:網(wǎng)絡(luò) 收藏

              如何應(yīng)對不斷升級的內(nèi)核

              內(nèi)核升級對驅(qū)動的影響主要體現(xiàn)在,(1)驅(qū)動接口定義的變化(2)內(nèi)核的一些功能函數(shù)的名稱、參數(shù)、頭文件、宏定義的變化(3)平臺代碼關(guān)于硬件操作方面封裝的一些函數(shù)的變化(4)設(shè)備模型的影響。下面探討一下,如何應(yīng)對這幾個方面的問題:

              驅(qū)動接口定義的變化

              如:2.4內(nèi)核中字符的注冊接口是

              int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)

              而2.6內(nèi)核中已經(jīng)不建議使用這種方法了,改為:

              int cdev_add(struct cdev *p, dev_t dev, unsigned count)

              又如:2.6.27內(nèi)核中網(wǎng)卡接口的net_device結(jié)構(gòu)成員和低版本的net_device結(jié)構(gòu)成員也發(fā)生了一些變化。

              這種接口定義及注冊方法帶來的變化,發(fā)生的并不頻繁。解決方案是:參考內(nèi)核中的代碼。這種接口定義及注冊方法在內(nèi)核中非常容易找到,如:字符的注冊方法及接口定義可以參照內(nèi)核driver/char/目錄下的很多實(shí)例。

              內(nèi)核的一些功能函數(shù)的名稱、參數(shù)、頭文件、宏定義的變化

              如:中斷注冊函數(shù)的格式及參數(shù)在2.4內(nèi)核、2.6內(nèi)核低版本和高版本之間都存在差別

              在2.6.8中,中斷注冊函數(shù)的定義為:

              int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irq_flags, const char * devname, void *dev_id)

              irq_flags的取值主要為下面的某一種或組合:

              SA_INTERRUPT、SA_SAMPLE_RANDOM、SA_SHIRQ

              在2.6.26中,中斷注冊函數(shù)的定義為:

              int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)

              typedef irqreturn_t (*irq_handler_t)(int, void *);

              irq_flags的取值主要為下面的某一種或組合:(功能和2.6.8的對應(yīng))

              IRQF_DISABLED、IRQF_SAMPLE_RANDOM、IRQF_SHARED

              當(dāng)出現(xiàn)這些問題時,編譯過程中,編譯器會給我們比較明確的錯誤提示,根據(jù)這些提示你可以判斷出是否是缺少頭問題、是否是函數(shù)參數(shù)定義有誤等。解決問題的最好辦法還是到你的目標(biāo)內(nèi)核中找信息。此時找問題的方法可以借助于搜索,如:你可以在新的內(nèi)核中搜索request_irq,看新內(nèi)核中的驅(qū)動是如何使用它的。這種方法非常有效。

              平臺代碼關(guān)于硬件操作方面封裝的一些函數(shù)的變化

              內(nèi)核中,硬件平臺相關(guān)的代碼在內(nèi)核更新過程中變化比較頻繁。和我們的也是息息相關(guān)。所以在針對一個新內(nèi)核編寫設(shè)備驅(qū)動前,一定要熟悉你的平臺代碼的結(jié)構(gòu)。有時平臺雖然提供了內(nèi)核要求的接口函數(shù),但使用起來功能卻并不完善。下面還是先舉個例子說明平臺代碼更新對設(shè)備驅(qū)動的影響。

              如:在-2.6.8內(nèi)核中,調(diào)用set_irq_type(IRQ_EINT0, IRQT_FALLING);去設(shè)置的IRQ_EINT0的中斷觸發(fā)信號類型,你會發(fā)現(xiàn)不會有什么效果。跟蹤代碼發(fā)現(xiàn)內(nèi)核的set_irq_type函數(shù)需要平臺提供一個針對硬件平臺的實(shí)現(xiàn)函數(shù)

              static struct irqchip s3c_irqext_chip = {

              .mask = s3c_irqext_mask,

              .unmask = s3c_irqext_unmask,

              .ack = s3c_irqext_ack,

              .type = s3c_irqext_type

              };

              s3c_irqext_type就是內(nèi)核需要的實(shí)現(xiàn)函數(shù),而s3c_irqext_type在2.6.8中的實(shí)現(xiàn)為:

              static int s3c_irqext_type(unsigned int irq, unsigned int type)

              {

              irqdbf("s3c_irqext_type: called for irq %d, type %d", irq, type);

              return 0;

              }

              原來并沒有實(shí)現(xiàn)。而在較高版本的內(nèi)核,如2.6.26內(nèi)核中,這個函數(shù)是實(shí)現(xiàn)了的。所以你一定要小心。當(dāng)平臺函數(shù)不好用時,一定要查查原因,或者直接操作硬件寄存器來達(dá)到目的。

              2.6內(nèi)核設(shè)備模型對驅(qū)動的影響

              在2.6內(nèi)核中寫設(shè)備驅(qū)動和在2.4內(nèi)核中有著很大的不同,就是在設(shè)備驅(qū)動中融入了比設(shè)備驅(qū)動本身結(jié)構(gòu)還復(fù)雜,難以理解的設(shè)備模型。初學(xué)驅(qū)動時你可以不理會設(shè)備模型,但你會發(fā)現(xiàn)內(nèi)核里的驅(qū)動代碼基本上都是融入了設(shè)備模型的了。所以很多時候你不得不面對現(xiàn)實(shí),還是要弄懂它,并且它也的注冊方法也會隨著內(nèi)核的升級而發(fā)生變化。解決此類問題的最好方法還是參考目標(biāo)內(nèi)核驅(qū)動代碼。

              總結(jié):

              開始學(xué)習(xí)設(shè)備驅(qū)動時,選擇一個當(dāng)前比較流行的內(nèi)核版本和硬件平臺。不著急追趕最新潮流。這樣你可以找到的網(wǎng)絡(luò)資源會比較多,不至于有孤軍奮戰(zhàn)的感覺。我想這個過程應(yīng)該不低于1年。當(dāng)過了這個過程后,嘗試將你編寫過的驅(qū)動移植到各個目標(biāo)平臺上。上面的一些建議、和應(yīng)對方法是本人的一些經(jīng)驗(yàn)總結(jié),僅供參考。

            linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

            linux相關(guān)文章:linux教程



            上一頁 1 2 下一頁

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉