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

          新聞中心

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

          [ARM筆記]設備驅動概述

          作者: 時間:2016-11-24 來源:網(wǎng)絡 收藏

            2.2.3 網(wǎng)絡設備驅動

          本文引用地址:http://www.ex-cimer.com/article/201611/340660.htm

            網(wǎng)絡設備和字符設備、塊設備不同,系統(tǒng)對其有專門的處理函數(shù)和機制。所有的網(wǎng)絡驅動程序都遵循通用的接口,設計時采用的是面向對象的方法。把所有網(wǎng)絡設備都抽象為一個接口對象。由數(shù)據(jù)結構struct device來表示網(wǎng)絡設備在內核中的運行情況,即網(wǎng)絡設備接口,該結構提供了對所有網(wǎng)絡設備的操作集合。它由以dev_base為頭指針的設備鏈表來集中管理所有網(wǎng)絡設備。該設備鏈表中的每個元素代表一個網(wǎng)絡設備接口。數(shù)據(jù)結構device中有很多提供給系統(tǒng)訪問和協(xié)議層調用的設備方法,包括提供給設備初始化和向系統(tǒng)注冊用的init函數(shù)、打開和關閉網(wǎng)絡設備的open和stop函數(shù)、處理數(shù)據(jù)包發(fā)送的函數(shù)hard_start_xmit,以及中斷處理函數(shù)等。一般來講,一個網(wǎng)絡設備最基本的方法有初始化(initialize)、發(fā)送和接收。初始化,當把驅動程序載入系統(tǒng)的時候會調用此程序,主要完成檢測設備、配置和初始化硬件、初始化device結構中的變量等。設備驅動各函數(shù)是網(wǎng)絡設備接口層net_device數(shù)據(jù)結構的具體成員,它通過hard_start_xmit()函數(shù)啟動發(fā)送操作,并通過網(wǎng)絡設備上的中斷觸發(fā)接收操作。

            下編寫網(wǎng)絡設備驅動的主體工作是完成net_device結構體的填充以及成員函數(shù)的實現(xiàn),底層最核心的工作是:發(fā)送數(shù)據(jù)包和接收數(shù)據(jù)包,接收數(shù)據(jù)包是由中斷觸發(fā)的。發(fā)送數(shù)據(jù)包函數(shù)的典型結構如下——網(wǎng)絡設備驅動發(fā)送數(shù)據(jù)包的典型結構。

            int xxx_tx(struct sk_buff *skb, struct net_device *dev)

            {

            int len;

            char *data, shortpkt[ETH_ZLEN];

            /* 獲得有效數(shù)據(jù)指針和長度 */

            data = skb->data;

            len = skb->len;

            if (len < ETH_ZLEN)

            {

            /* 如果幀長小于以太幀最小長度,補0 */

            memset(shortpkt, 0, ETH_ZLEN);

            memcpy(shortpkt, skb->data, skb->len);

            len = ETH_ZLEN;

            data = shortpkt;

            }

            dev->trans_start = jiffies; /* 記錄發(fā)送時間戳 */

            /* 設置硬件寄存器讓硬件把數(shù)據(jù)包發(fā)送出去 */

            xxx_hw_tx(data, len, dev);

            //...

            }

            接收數(shù)據(jù)包的典型結構如下——網(wǎng)絡設備驅動接受數(shù)據(jù)包的典型結構。

            static void xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)

            {

            //...

            switch (status &ISQ_EVENT_MASK)

            {

            case ISQ_RECEIVER_EVENT:

            /* 獲取數(shù)據(jù)包 */

            xxx_rx(dev);

            break;

            /* 其他類型的中斷 */

            }

            }

            static void xxx_rx(struct xxx_device *dev)

            {

            //...

            length = get_rev_len (...);

            /* 分配新的套接字緩沖區(qū) */

            skb = dev_alloc_skb(length + 2);

            skb_reserve(skb, 2); /* 對齊 */

            skb->dev = dev;

            /* 讀取硬件上接收到的數(shù)據(jù) */

            insw(ioaddr + RX_FRAME_PORT, skb_put(skb, length), length >> 1);

            if (length &1)

            skb->data[length - 1] = inw(ioaddr + RX_FRAME_PORT);

            /* 獲取上層協(xié)議類型 */

            skb->protocol = eth_type_trans(skb, dev);

            /*把數(shù)據(jù)包交給上層 */

            netif_rx(skb);

            /* 記錄接收時間戳 */

            dev->last_rx = jiffies;

            //...

            }

            2.3 Linux設備文件的創(chuàng)建

            Linux是一種類Unix系統(tǒng),Unix的一個基本特點是“一切皆為文件”,它抽象了設備的處理,將所有的硬件設備都像普通文件一樣看待,也就是說硬件可以跟普通文件一樣打開、關閉和讀寫。系統(tǒng)中的設備都用一個特殊文件代表,叫做設備文件。在 Linux2.4以后的內核版本中引入了設備文件系統(tǒng)(devfs),所有的設備文件作為一個可以掛裝的文件系統(tǒng),這樣就可以被文件系統(tǒng)進行統(tǒng)一管理,從而設備文件就可以掛裝到任何需要的地方。

            在前面也講過,字符設備和塊設備都可以通過文件節(jié)點來存取,而與字符設備和塊設備不同,網(wǎng)絡設備的訪問是通過Socket而不是設備節(jié)點,在系統(tǒng)里根本就不存在網(wǎng)絡設備節(jié)點,所以在此我們僅討論塊設備和字符設備。

            那么如何在內核中創(chuàng)建設備文件的掛載節(jié)點呢?簡單的說,設備文件是由系統(tǒng)調用創(chuàng)建的,在命令行中,mknod命令會調用同名的程序來創(chuàng)建文件節(jié)點。rename和unlink系統(tǒng)調用可以用于移動和刪除節(jié)點,相應的命令是mv和rm。在使用cp命令時加上-R或-a參數(shù),可以創(chuàng)建一個與原設備節(jié)點具有同樣屬性的節(jié)點。mknod命令,該命令形式如下:

            #mknod [OPTION] NAME TYPE [MAJOR MINOR]

            說明:option選項設置,最常用的就是-m,基本上可以不用;name自定義設備名稱;type設備類型,有b和c還有p;MAJOR主設備號;MINOR次設備號。

            mknod命令建立一個目錄項和一個特殊文件的對應索引節(jié)點。第一個參數(shù)Name項是設備的名稱,選擇一個描述性的設備名稱。



          關鍵詞: ARM Linux

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();