Linux下的網路裝置驅動 一

2021-06-26 17:15:21 字數 3253 閱讀 7714

一.

網路裝置驅動基礎 1.

乙太網基礎理論

乙太網是區域網的一種,它使用載波監聽多路訪問及衝突檢測技術(csma/cd),並以10m/s的速率執行在多種型別的電纜上,常用的網絡卡晶元有dm9000、dm9161、

cs8900晶元。

乙太網的拓撲結構有匯流排型和星型,乙太網的工作模式有半雙工和全雙工。目前雙絞線是乙太網最普通的傳輸介質,它多用於從主機到集線器或交換機的連線,光纖主要用於交換機間的級聯和交換機到路由器間的點到點的鏈路上。

在區域網中,多個節點是共享傳輸介質的,這就必須有某種機制來決定某個時刻,哪個裝置占用傳輸介質來傳輸資料,因此,區域網的鏈路層要有介質訪問控制的功能,即資料鏈路層分為邏輯鏈路控制llc子層和介質訪問控制mac子層。

乙太網的幀結構主要有ethernet ii 、ethernet 802.3raw、ethernet802.3sap、ethernet802.3snap

乙太網控制器實現了mac層功能,而且必須與phy(物理層收發器)聯合使用,前者與osi的資料鏈路層相關,後者實現物理層功能。mii(**無關介面)是連線快速乙太網mac和phy的標準介面,乙太網的裝置驅動是通過mii與phy通訊,以配置phy id、速率、雙工模式等引數。

2.       

linux

網路驅動層次

linux網路驅動可以劃分四層,即網路協議介面層、網路裝置介面層、裝置驅動功能層和裝置物理媒介層,核心中是通過以dev_base為頭指標的裝置鍊錶來管理所有的網路裝置。網路裝置驅動的編寫主要是網路裝置net_device的初始化和資料報的收發函式。

網路協議介面層

網路協議介面層最主要的功能是給上層協議提供了透明的資料報傳送和接收介面,當上層的api或ip需要傳送資料報時,它將呼叫網路協議介面層的dev_queue_xmit函式傳送乙個內容為sk_buff的資料;當上層對資料報的接收資料,則是通過向netif_rx函式傳遞乙個sk_buff資料結構的指標來完成的。sk_buff套接字緩衝區為linux網路層提供了高效的緩衝區處理和流量控制機制,當傳送資料報時,linux核心的網路處理模組必須建立乙個需要傳輸的資料報sk_buff,然後將sk_buff遞交給下層,各層在sk_buff中新增不同的協議頭直至交給網路裝置傳送。同樣的,當網路裝置從網路媒介上接收到資料報後,必須去掉不同的協議頭再交給使用者。

下面是sk_buff的部分結構體成員定義

struct sk_buff ;

對於sk_buff操作,除了分配和釋放外,需要知道如下幾個函式:在緩衝區尾部增加資料skb_put;在緩衝區開頭增加資料skb_push;在緩衝區開頭移除資料skb_pull;調整整個緩衝區的頭部skb_reserve。

網路裝置介面層

網路裝置介面層主要是為變化多端的網路定義了乙個統一且抽象的net_device,實現了多種硬體在軟體層次上的統一。網路裝置驅動主要是填充net_device的成員並註冊net_device來實現硬體操作函式和核心的掛接。通常情況下,網路裝置驅動以中斷方式接受資料,而net_device中則定義了poll_controller這種純輪詢的介面方式,另外由於寬頻介面每秒會收到幾千個資料報,如果使用中斷方式會導致系統效能下降,為了提高linux在寬頻系統上的效能,網路子系統開發者建立了一種基於輪詢的資料接收方式是napi(new api),其資料接收流程是」接收中斷來臨—關閉接收中斷—以輪詢方式接收完所有資料—開啟接收中斷—接收中斷來臨……」,與napi相關的函式有新增napi,使能napi,排程napi,具體函式是netif_napi_add,napi_enable,napi_schedule。最後需要注意的是對於napi方式和中斷方式接收資料,驅動設計上還是有一些不同的,比如napi方式是用netif_receive_skb函式將資料報傳遞給核心,而不是使用netif_rx函式。

裝置驅動功能層

對於具體的裝置,工程師應該實現net_device中的open,stop,tx,hard_header,get_stats,tx_timeout,interruppt等函式。

網路裝置媒介層

網路裝置媒介層直接對應實際的硬體裝置,我們需要定義一組讀寫裝置內部暫存器的函式,如ior,iow。 二.

網路裝置驅動移植

下面我們主要講解基於mini2440的dm9000網絡卡驅動的移植

首先看內涵dm9000**在/driver/net/dm9000.c

檢視/driver/net/makefile

obj-$(config_dm9000) += dm9000.o

檢視/driver/net/konfig

menuconfig net_ethernet

bool "ethernet (10 or 100mbit)"

config dm9000

tristate "dm9000 support"

depends on arm || blackfin || mips

select crc32

select mii

所以配置核心make menuconfig 時,需要選中這一項。

根據開發板電路圖知道dm9000的aen埠接到了ngcs4上,同時dm9000的int埠接到了irq_eint7上,另外dm9000的cmd埠接到了laddr2上,最後發現dm9000上資料線是sd0-sd15,即資料線的位數是16位。

根據mini2440位址空間的分配與片選訊號的定義知道,引腳ngcs4對應的空間的起始位址為0x20000000,這個由系統位址線控制。同時我們知道dm9000使用的中斷號就是irq_eint7。另外,dm9000上的cmd訊號是控制位址埠還是資料埠的,如果cmd為0,即laddr2為0表示訪問位址暫存器,當cmd為1,即laddr2為1表示訪問資料暫存器。

下面我們進行dm9000驅動的移植,在mach-mini2440.c中新增如下**

#include

#define mach_mini2440_dm9k_base (s3c2410_cs4 + 0x300)

static struct resource mini2440_dm9k_resource = ,

[1] = ,

[2] = };

static struct dm9000_plat_data mini2440_dm9k_pdata = ,   //mac位址};

static struct platform_device mini2440_device_eth = , };

最後在mini2440的bsp檔案mach-mini2440.c中新增如下**

static struct platform_device *mini2440_devices __initdata = ;

這樣移植完畢後編譯核心生成核心映象。

Linux網路裝置驅動 一

一 網路裝置驅動基礎 1.乙太網基礎理論 乙太網是區域網的一種,它使用載波監聽多路訪問及衝突檢測技術 csma cd 並以10m s的速率執行在多種型別的電纜上,常用的網絡卡晶元有dm9000 dm9161 cs8900晶元。乙太網的拓撲結構有匯流排型和星型,乙太網的工作模式有半雙工和全雙工。目前雙...

linux網路裝置驅動

linux網路裝置驅動 linux網路驅動程式的體系結構可劃分為4個層次。linux核心源 中提供了網路裝置介面及以網路子系統的上層的 移植特定網路硬體的驅動程式的主要工作就是完成裝置驅動功能層的相應 根據底層具體的硬體特性,定義網路裝置介面struct net device型別的結構體變數,並實現...

linux 網路裝置驅動

linux 網路驅動 謹以此文紀念過往的歲月 一.前言 在linux中網路驅動也是乙個大頭,如何去理解網路驅動是作為乙個linux驅動工程師必備的技能。不過同樣的裝置,在不同人的手中會有不同的效果,其原因就在於驅動的好與否。二.裝置註冊 學習網路的驅動與學習普通cdev驅動一樣,都是學習其模板,然後...