<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux網(wǎng)絡(luò)驅(qū)動程序的開發(fā)及實現(xiàn)原理

          嵌入式Linux網(wǎng)絡(luò)驅(qū)動程序的開發(fā)及實現(xiàn)原理

          作者: 時間:2009-12-29 來源:網(wǎng)絡(luò) 收藏
          2.3.4數(shù)據(jù)包的接收和中斷處理
          設(shè)備是異步地接收外來的數(shù)據(jù)包并且主動的“請求”將硬件獲得的數(shù)據(jù)包壓入內(nèi)核。設(shè)備接收數(shù)據(jù)包是通過中斷的。對于網(wǎng)絡(luò)接口,接收到新數(shù)據(jù)包,發(fā)送完成或者報告錯誤信息及連接狀態(tài)等都會觸發(fā)中斷,通常中斷處理程序通過檢測硬件狀態(tài)寄存器判斷是哪種情況。
          當(dāng)設(shè)備收到數(shù)據(jù)后會產(chǎn)生一個中斷,由硬件通知有數(shù)據(jù)包到達(dá)。在中斷處理程序中申請一塊sk_buff(一般定義為skb)緩沖區(qū),然后從硬件讀出數(shù)據(jù)放到申請好的緩沖區(qū)里,接下來填充sk_buff中的部分信息:包括接收到數(shù)據(jù)的設(shè)備結(jié)構(gòu)體指針填入skb->dev;收到數(shù)據(jù)幀的類型填入skb->protocol;把指針skb->mac.raw指向硬件數(shù)據(jù)并丟棄硬件針頭(skb_pull);設(shè)置skb->pkt_type,標(biāo)明鏈路層數(shù)據(jù)類型。最后調(diào)用協(xié)議接口層函數(shù)netif_rx() 把接收到的數(shù)據(jù)包傳輸?shù)骄W(wǎng)絡(luò)上層協(xié)議處理。這里,netif_rx()只是負(fù)責(zé)把數(shù)據(jù)放入工作隊列就返回,真正的處理是在中斷返回以后,這樣可減少中斷處理的時間。幾乎每個中斷處理程序的編寫都要涉及底半部機(jī)制,這樣可以保證中斷的高效處理。
          實例中數(shù)據(jù)接收函數(shù)cs8900_receive()由網(wǎng)絡(luò)驅(qū)動的中斷處理函數(shù)調(diào)用,主要完成如下工作:
          a.通過從I/O口讀取RxStatus和RxLength的值,確定接收數(shù)據(jù)幀的狀態(tài)信息和長度;
          b.判斷接收數(shù)據(jù)幀的狀態(tài)是否正常,若異常則記錄相關(guān)錯誤信息,然后函數(shù)返回;
          c.正常情況下,在內(nèi)存中申請一塊sk_buff緩存,并將數(shù)據(jù)從CS8900A的片內(nèi)存儲器傳送到sk_buff緩存中;d.從數(shù)據(jù)幀中獲取協(xié)議頭并賦給skb->protocol;
          e.通過調(diào)用netif_rx()函數(shù)將接收到的數(shù)據(jù)送往上層協(xié)議棧進(jìn)行處理;
          f.記錄接收數(shù)據(jù)的時間并更新統(tǒng)計信息;
          3將設(shè)備驅(qū)動模塊編譯進(jìn)內(nèi)核
          設(shè)計好模塊化的網(wǎng)絡(luò)后,我們就可以編譯這個內(nèi)核模塊,并將這個自定義的內(nèi)核模塊作為系統(tǒng)源碼的一部分編譯出新的系統(tǒng)。下面介紹的內(nèi)容均在2.6.18內(nèi)核上編譯通過,可以在2.6.x版本內(nèi)核中通用。如前所述,由于2.6內(nèi)核引入了kbuild的新機(jī)制,使得編譯新的內(nèi)核模塊或者將自己編寫的內(nèi)核模塊集成到內(nèi)核源碼中都變得非常簡單了。
          Linux2.6內(nèi)核中,編譯內(nèi)核模塊首先要在/usr/src下正確配置和構(gòu)造內(nèi)核源碼樹,即把需要版本的內(nèi)核源碼解壓在/usr/src/,并在內(nèi)核源碼的主目錄下(這里為/usr/src/linux-2.6.18.3),使用make menuconfig或者make gconfig命令配置內(nèi)核,然后使用make all完整編譯內(nèi)核。
          下面以作者的CS8900A網(wǎng)卡驅(qū)動為實例,介紹如何將網(wǎng)絡(luò)設(shè)備驅(qū)動模塊編譯進(jìn)內(nèi)核。
          a.在系統(tǒng)源碼樹drivers目錄下創(chuàng)建新目錄Cs8900;
          b.將編寫好的文件cs8900.c和cs8900.h拷貝到drivers/Cs8900目錄下;
          c.在drivers/Cs8900目錄下,編寫Makefile文件:
          #Makefile for CS8900A Network Driver
          obj -$(CONFIG_DRIVER_CS8900A) +=cs8900.o
          d.在drivers/Cs8900目錄下,編寫Kconfig文件:
          #Just for CS8900A Network Interface
          menu CS8900A Network Interface support
          config DRIVER_CS8900A
          tristate CS8900A support
          --------help--------
          This is a network driver module for CS8900A.
          endmenu
          e.在driver目錄下的Kconfig文件endmenu語句前,加入一行:
          source drivers/Cs8900/Kconfig
          這樣在內(nèi)核源碼樹的主目錄下,通過make menuconfig或者make gconfig命令就可以在Device Drivers選項的下面找到CS8900A Network Interface support選項,并找到CS8900A support的選擇菜單,它有三種狀態(tài):未選中(不編譯)、選中(M)一編譯為模塊、選中(*)一編譯為新系統(tǒng)一部分。
          重新編譯內(nèi)核即可得到支持CS8900A網(wǎng)卡的內(nèi)核,然后將內(nèi)核下載到FS2410的板上,通過配置網(wǎng)絡(luò)參數(shù),就可以測試網(wǎng)卡驅(qū)動程序的行為了。
          4 結(jié)束語
          在這個信息爆炸的時代,人們對于網(wǎng)絡(luò)的需求愈發(fā)強烈,越來越多的設(shè)備都需要具有以太網(wǎng)的接入功能,因此網(wǎng)絡(luò)驅(qū)動程序?qū)τ诤芏?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/嵌入式">嵌入式產(chǎn)品的研發(fā)至關(guān)重要。具體開發(fā)Linux網(wǎng)絡(luò)驅(qū)動程序時,可以參照內(nèi)核中已經(jīng)支持的網(wǎng)絡(luò)驅(qū)動源代碼,在重點理解Linux網(wǎng)絡(luò)驅(qū)動的基礎(chǔ)上,按照模塊設(shè)計較為固定的開發(fā)模式,結(jié)合具體物理設(shè)備的硬件手冊,移植編寫需要的模塊化的網(wǎng)絡(luò)驅(qū)動程序。

          本文引用地址:http://www.ex-cimer.com/article/152169.htm
          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();