mini2440 dm9000 網絡卡驅動詳解 2

2021-06-02 11:17:06 字數 3745 閱讀 1874

3. platform_driver的remove, suspend和resume的實現

remove函式的功能是把裝置從核心中移除,釋放記憶體區域。該函式在解除安裝模組時被呼叫。**清單如下:

static int __devexit    

dm9000_drv_remove(struct platform_device *pdev)

suspend函式並不真正把裝置從核心中移除,而只是標誌裝置為removed狀態,並設定掛起標誌位,最後關閉裝置。**清單如下:

static int dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)    

}

return 0;

}

resume函式將掛起的裝置復位並初始化,軟後將裝置標誌為attached狀態,並設定掛起標誌位。**清單如下:

static int dm9000_drv_resume(structplatform_device *dev)   

db->in_suspend = 0;

}

return 0;

}

4. 下面看一下用於填充net_device中netdev_ops和ethtool_ops的一些函式。

**在上面已經寫出來了,為了看著方便在下面再寫一遍,可以看出雖然mini2440的板子上沒有為dm9000掛eeprom,但這裡還是定義了操作eeprom的函式。就是說寫驅動的時候是不考慮具體的板子的,你板子用不用是你的事,但是我們的驅動應該所有的功能都考慮進去。這也體現了驅動和平台分離的設計思想。

static const struct net_device_ops dm9000_netdev_ops = ;  

static const struct ethtool_ops dm9000_ethtool_ops = ;

*dm9000_open()

進行的工作有 向核心註冊中斷,復位並初始化dm9000,檢查mii介面,使能傳輸等。**清單如下:

/*   

* open the inte***ce.

* the inte***ce is opened whenever "ifconfig" actives it.

*/

static int

dm9000_open(struct net_device *dev)

*dm9000_stop()

做的工作基本上和open相反。**清單如下:

/*   

* stop the inte***ce.

* the inte***ce is stopped when it is brought.

*/

static int

dm9000_stop(struct net_device *ndev)

*dm9000_start_xmit()

重要的傳送資料報函式。從上層傳送sk_buff包。在看**之前先來看一下dm9000是如何傳送資料報的。

如上圖所示,在dm9000內部sram中,位址0x0000~0x0bff是tx buffer,位址0x0c00~0x3fff是rx buffer。在傳送乙個包之前,包中的有效資料必須先被儲存到tx buffer中並且使用輸出埠命令來選擇mwcmd暫存器。包的長度定義在txpll和txplh中。最後設定txcr暫存器的bit[0] txreq來自動傳送包。如果設定了imr暫存器的ptm位,則dm9000會產生乙個中斷觸發在isr暫存器的bit[1]=pts=1, 同時設定乙個完成標誌在nsr暫存器的bit[2]=tx1end或者 bit[3]=tx2end,表示包已經傳送完了。傳送乙個包的具體步驟如下:

step 1: 檢查儲存資料寬度。通過讀取中斷狀態暫存器(isr)的bit[7:6]來確定是8bit,16bit還是32bit。

step 2: 寫資料到tx sram中。

step 3: 寫傳輸長度到txpll和txplh暫存器中。

step 4: 設定txcr暫存器的bit[0]txreq來開始傳送乙個包。

**清單如下,讓我們看看在獲得自旋鎖這段期間都幹了些什麼:

/*   

* hardware start transmission.

* send a packet to media from the upper layer.

*/

static int

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

else

/*釋放自旋鎖*/

spin_unlock_irqrestore(&db->lock, flags);

/* free this skb */

dev_kfree_skb(skb);

return 0;

}

*dm9000_timeout()

當watchdog超時時呼叫該函式。主要的功能是儲存暫存器位址,停止佇列,重啟並初始化dm9000,喚醒佇列,恢復暫存器位址。

**清單如下:

/* our watchdog timed out. called by the networking layer */   

static void dm9000_timeout(struct net_device *dev)

*dm9000_hash_table()

/*   

* set dm9000 multicast address

*/

static void

dm9000_hash_table(struct net_device *dev)

/* write the hash table to mac md table */

for (i = 0, oft = dm9000_mar; i < 4; i++)

iow(db, dm9000_rcr, rcr);

spin_unlock_irqrestore(&db->lock, flags);

}

*dm9000_ioctl()

從原始碼可以看出,dm9000的ioctl實際上是使用了mii的ioctl。**清單如下:

static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd)    

*dm9000_poll_controller()

當核心配置netconsole時該函式生效。**清單如下:

#ifdef config_net_poll_controller

/*

*used by netconsole

*/

static void dm9000_poll_controller(struct net_device *dev)

#endif

mini2440 dm9000網絡卡驅動移植

核心版本 linux 2.6.32.2 實驗平台 mini2440 1.新增平台裝置支援 首先需要在mach mini2440.c中包含標頭檔案,dm9000平台裝置定義如下 dm9000aep 10 100 ethernet controller define mach mini2440 dm90...

FL2440開發板安裝DM9000網絡卡支援

1.修改核心 首先cd 到核心 資料夾下,在命令列輸入以下命令 vim arch arm mach s3c2440 mach smdk2440.c開啟mach smdk2440.c檔案後在檔案頭插入標頭檔案 include然後插入以下 define dm9000 base s3c2410 cs4 0...

DM9000網絡卡驅動移植

網絡卡驅動移植 步驟1 確定相異性 步驟2 修改 一般就是修改 iobase 和中斷 按照原理圖,其片選訊號可能是往固定段落記憶體寫資料,即是片選到這個裝置。這個也是統一編址的一種方式。根據原理圖,修改其中段引腳,把其irq修改為原理圖上面的iro.網絡卡中本來就有記憶體,當網絡卡接受到資料時候,就...