linux 網路裝置驅動

2021-09-07 15:35:59 字數 2055 閱讀 6662

linux 網路驅動

謹以此文紀念過往的歲月

一.前言

在linux中網路驅動也是乙個大頭,如何去理解網路驅動是作為乙個linux驅動工程師必備的技能。不過同樣的裝置,在不同人的手中會有不同的效果,其原因就在於驅動的好與否。

二.裝置註冊

學習網路的驅動與學習普通cdev驅動一樣,都是學習其模板,然後再創造學習。在學習網路驅動過程中,我們忽略其對硬體的具體操作,這樣會更具有通用性。以dm9000a為例。網路驅動亦如usb驅動一樣,其核心將許多任務作都完成了。dm9000a認採用了platform bus的辦法來實現裝置與驅動的匹配。在前文中也說,其裝置所屬的裝置型別與裝置的型別並沒有關係,就如usb匯流排一下,其usb鍵盤屬於cdev,而usb storage則屬於block裝置,但是他們都是usb匯流排裝置。網路裝置也是一樣的。所以這裡的裝置採用platform匯流排反而更加的直觀。對於platform裝置的註冊和驅動的註冊咱們就不說了。不過在這之前還需要說明一點東西,即是記憶體對映,該對映非彼對映。以s3c6410和dm9000a為例,dm9000a的data和address線連線在cpu的srom1的介面。在裡面就需要理解乙個巨集定義

#define s3c64xx_pa_dm9000    (0x18000000)和#define dm9000_cmd    0x04

第乙個就是dm9000的實體地址為什麼是0x18000000,因為dm9000的data和addr是連線在srom1的介面,而srom1的起始位址為0x18000000,這裡是用於外設的位址。

第二個是cmd位址為什麼是0x04,因為dm9000的cmd與data區分的那個引腳連線在srom1的addr[2]上,故cmd的位址為0x04,如果學過數電這個就很好懂的。

我們就從裝置的探測開始來開始我們的網路驅動之旅。

2.1 裝置探測

在網路裝置探測中,其各個不同的裝置的硬體初始化是不同的,不過其本質還是一樣一樣的。

void dm9000_probe(struct platform_device *pdev)

probe中對於ndev的操作分為三部 開闢ndev -> 初始化ndev ->註冊ndev,有沒有發現這個過程怎麼這麼類似於其他的驅動模型呢。這裡面的核心是ndev

2.2 網路裝置的開啟和釋放

在open中,往往都會去申請中斷,對硬體進行復位,並且啟用裝置傳送佇列,以dm9000_open為例

static int dm9000_open(struct net_device *dev)

在close中則相反,主要是資源的釋放和停止裝置傳送佇列。

static int dm9000_stop(struct net_device *ndev)

2.3 資料傳送

將從上層傳入的資料傳送的media中。

static int dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)

else

spin_unlock_irqrestore(&db->lock, flags);

dev_kfree_skb(skb);

return 0;

}2.4 中斷處理

對於media每次接送或傳送完成一幀資料後都會產生乙個中斷,根據中斷flags來判斷是傳送完成還是接受完成。

static irqreturn_t dm9000_interrupt(int irq, void *dev_id)

static void dm9000_tx_done(struct net_device *dev, board_info_t * db)

2.5 資料接受

對於資料接受而言,其實就是將資料從media的緩衝區讀出,然後提交給上層。讀取資料的真正核心是下面的**

static void dm9000_rx(struct net_device *dev)

2.6 在驅動中會設定乙個定時器

該定時器的功能就是定時查詢mii的狀態。

三.總結

網路驅動的核心在於ndev和skb,需要好好去理解。

這次的網路驅動學習的很是粗糙,因為網路驅動是乙個很大的部分,需要慢慢去細嚼其中的每一點。前途是光明的,不過道路是曲折的。

linux網路裝置驅動

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

Linux網路裝置驅動 一

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

Linux下的網路裝置驅動 一

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