新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux網絡驅動程序的開發及實現原理

        嵌入式Linux網絡驅動程序的開發及實現原理

        作者: 時間:2009-12-29 來源:網絡 收藏
        2.2.2 主要的操作方法
        int (*init)(struct net_device *dev); 設備初始化和向系統注冊的函數,僅調用一次;
        int (*open)(struct net_device *dev);設備打開接口函數,當用ifconfig激活設備時被調用,注冊所用的系統資源(I/O端口,IRQ,DMA等)同時激活硬件并增加使用計數;
        int (*stop)(struct net_device *dev);執行open方法的反操作;
        *hard_start_xmit;初始化數據包傳輸的函數;
        *hard_header;該函數(在hard_start_xmit前被調用)根據先前檢索到的源和目標硬件地址建立硬件頭。 eth_header是以太網類型接口的默認函數;
        2.3的編寫及
        系統各個層次之間的數據傳送都是通過套接字緩沖區sk_buff完成的,sk_buff數據結構是各層協議數據處理的對象。sk_buff與網絡之間交換數據的媒介,向網絡發送數據時,必須從其中獲取數據源和數據長度;驅動程序從網絡上接收到數據后也要將數據保存到sk_buff中才能交給上層協議處理。
        對于實際以太網驅動程序,可以參照內核源碼樹中的相應模板程序,重點理解網絡驅動的和程序的結構框架,然后針對的特定硬件改寫代碼,相應的操作函數。下面結合作者利用2.6.18內核在深圳優龍公司的FS2410板(SAMSUNG S3C2410處理器)上移植編寫CS8900A網卡驅動程序的實例,說明網絡驅動程序的實現
        2.3.1網絡設備初始化
        網絡設備的初始化是由net_device結構中的init函數實現的,內核加載網絡驅動模塊后,就會調用初始化過程。實例中初始化函數_init cs8900_probe中主要完成的工作:
        a.調用內核中通用的設置以太網接口的函數ether_setup();
        b.填充net_device結構體變量dev中其它大部分成員;
        c.調用check_mem_region()檢測I/O地址空間,然后調用request_mem_region()申請以dev->base_addr為起始地址的16個連續的 I/O地址空間;
        d.通過cs8900_read()探測網卡CS8900A,讀取ID信息;
        e.設置CS8900A的INTRQ0作為中斷信號輸出引腳;
        f.將MAC地址寫入CS8900A的IA寄存器中;
        g.通過register_netdev()將CS8900A注冊到全局網絡設備鏈表中;
        2.3.2打開(或關閉)網絡設備
        系統響應ifconfig命令時,打開(關閉)一個網絡接口。ifconfig命令開始會調用ioctl(SIOCSIFADDR)來將地址賦予接口。響應SIOCSIFADDR由內核來完成,與設備無關。接著,ifconfig命令會調用ioctl(SIOCSIFFLAGS)設置dev->flag的IFF_UP位來打開設備,這個調用會使設備的open方法得到調用。(當ifconfig調用ioctl(SIOCSIFFLAGS)清除dev->flag的IFF_UP位時,設備的stop方法將被調用)
        實例中利用cs8900_start()函數打開網絡設備,主要完成的工作:
        a.通過set_irq_type()向內核注冊網絡設備的中斷處理程序;
        b.通過cs8900_set()設置CS8900A網卡中各控制寄存器和配置寄存器;
        c.通過內核中netif_start_queue()函數開啟網絡接口的數據傳輸隊列;
        2.3.3網絡數據包的發送
        數據包的發送和接收是網絡驅動程序中實現的兩個最重要的任務。當網絡設備被激活時,net_device結構中的open方法被調用,它負責打開設備并調用net_device結構中的hard_header函數指針建立硬件幀頭信息。最后通過函數dev_queue_xmit()來調用net_device結構中的hard_start_xmit方法把存放在sk_buff中的數據發送到網絡物理設備。如果發送成功,則在hard_start_xmit中釋放sk_buff并返回0;如果硬件設備忙暫時無法處理,則返回1。網絡硬件在發送完數據包后會產生中斷,把dev->tbusy置0,通知系統可以再次發送。
        實例中,hard_start_xmit方法即為網絡設備數據發送函數cs8900_send_start(),該函數實現把數據發送到以太網上,由網絡協議接口層函數dev_queue_xmit()對其調用。cs8900_send_start()中主要完成的工作:
        a.發送數據前關閉中斷,中止網絡設備的數據傳輸隊列;
        b.向CS8900A寄存器TxCMD中寫入傳送數據命令控制字,向寄存器TxLength中寫入待發送數據幀長度;
        c.通過cs8900_read()反復讀取CS8900A總線狀態寄存器BusST信息,直到其已經準備好接收來自主機的數據;
        d.調用cs8900_frame_write()將待發數據送入CS8900A的sk_buff中,硬件設備會將數據幀發送到以太網上;
        e.記錄數據幀的發送時刻,打開中斷,釋放sk_buff緩存,函數返回0;
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 德令哈市| 安阳县| 靖边县| 柞水县| 新邵县| 旬邑县| 五常市| 泰兴市| 河北区| 利津县| 巩留县| 沈丘县| 德州市| 财经| 靖宇县| 武义县| 屯昌县| 武冈市| 鹰潭市| 吉安县| 寿光市| 定兴县| 德清县| 浦城县| 皋兰县| 湖南省| 平凉市| 古田县| 万载县| 从江县| 济源市| 杭锦后旗| 申扎县| 建湖县| 曲靖市| 鄂托克旗| 读书| 高青县| 神农架林区| 越西县| 揭阳市|