3. platform_driver的remove, suspend和resume的實現(xiàn)
remove函數(shù)的功能是把設(shè)備從內(nèi)核中移除,釋放內(nèi)存區(qū)域。該函數(shù)在卸載模塊時被調(diào)用。代碼清單如下:
static int __devexit
dm9000_drv_remove(struct platform_device *pdev)
{
struct net_device *ndev = platform_get_drvdata(pdev);
platform_set_drvdata(pdev, NULL);
unregister_netdev(ndev);
dm9000_release_board(pdev, (board_info_t *) netdev_priv(ndev));
free_netdev(ndev); /* free device structure */
dev_dbg(&pdev->dev, "released and freed devicen");
return 0;
}
suspend函數(shù)并不真正把設(shè)備從內(nèi)核中移除,而只是標(biāo)志設(shè)備為removed狀態(tài),并設(shè)置掛起標(biāo)志位,最后關(guān)閉設(shè)備。代碼清單如下:
static int dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)
{
struct net_device *ndev = platform_get_drvdata(dev);
board_info_t *db;
if (ndev) {
db = netdev_priv(ndev);
db->in_suspend = 1;
if (netif_running(ndev)) {
netif_device_detach(ndev);
dm9000_shutdown(ndev);
}
}
return 0;
}
resume函數(shù)將掛起的設(shè)備復(fù)位并初始化,軟后將設(shè)備標(biāo)志為attached狀態(tài),并設(shè)置掛起標(biāo)志位。代碼清單如下:
static int dm9000_drv_resume(structplatform_device *dev)
{
struct net_device *ndev = platform_get_drvdata(dev);
board_info_t *db = netdev_priv(ndev);
if (ndev) {
if (netif_running(ndev)) {
dm9000_reset(db);
dm9000_init_dm9000(ndev);
netif_device_attach(ndev);
}
db->in_suspend = 0;
}
return 0;
}
4. 下面看一下用于填充net_device中netdev_ops和ethtool_ops的一些函數(shù)。
代碼在上面已經(jīng)寫出來了,為了看著方便在下面再寫一遍,可以看出雖然mini2440的板子上沒有為DM9000掛EEPROM,但這里還是定義了操作EEPROM的函數(shù)。就是說寫驅(qū)動的時候是不考慮具體的板子的,你板子用不用是你的事,但是我們的驅(qū)動應(yīng)該所有的功能都考慮進去。這也體現(xiàn)了驅(qū)動和平臺分離的設(shè)計思想。
static const struct net_device_ops dm9000_netdev_ops = {
.ndo_open = dm9000_open,
.ndo_stop = dm9000_stop,
.ndo_start_xmit = dm9000_start_xmit,
.ndo_tx_timeout = dm9000_timeout,
.ndo_set_multicast_list = dm9000_hash_table,
.ndo_do_ioctl = dm9000_ioctl,
.ndo_change_mtu = eth_change_mtu,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = dm9000_poll_controller,
#endif
};
static const struct ethtool_ops dm9000_ethtool_ops = {
.get_drvinfo = dm9000_get_drvinfo,
.get_settings = dm9000_get_settings,
.set_settings = dm9000_set_settings,
.get_msglevel = dm9000_get_msglevel,
.set_msglevel = dm9000_set_msglevel,
.nway_reset = dm9000_nway_reset,
.get_link = dm9000_get_link,
.get_eeprom_len = dm9000_get_eeprom_len,
.get_eeprom = dm9000_get_eeprom,
.set_eeprom = dm9000_set_eeprom,
};
*dm9000_open()
進行的工作有 向內(nèi)核注冊中斷,復(fù)位并初始化dm9000,檢查MII接口,使能傳輸?shù)取4a清單如下:
/*
* Open the interface.
* The interface is opened whenever "ifconfig" actives it.
*/
static int
dm9000_open(struct net_device *dev)
{
board_info_t *db = netdev_priv(dev);
unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
if (netif_msg_ifup(db))
dev_dbg(db->dev, "enabling %sn", dev->name);
/* If there is no IRQ type specified, default to something that
* may work, and tell the user that this is a problem */
if (irqflags == IRQF_TRIGGER_NONE)
dev_warn(db->dev, "WARNING: no IRQ resource flags set.n");
irqflags |= IRQF_SHARED;
if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev))/*注冊一個中斷,中斷處理函數(shù)為dm9000_interrupt()*/
return -EAGAIN;
/* Initialize DM9000 board */
dm9000_reset(db);
dm9000_init_dm9000(dev);
/* Init driver variable */
db->dbug_cnt = 0;
mii_check_media(&db->mii, netif_msg_link(db), 1);
netif_start_queue(dev);
dm9000_schedule_poll(db);/*之前在probe函數(shù)中已經(jīng)使用INIT_DELAYED_WORK來初始化一個延遲工作隊列并關(guān)聯(lián)了一個操作函數(shù)dm9000_poll_work(), 此時運行schedule來調(diào)用這個函數(shù)*/
return 0;
}
*dm9000_stop()
做的工作基本上和open相反。代碼清單如下:
/*
* Stop the interface.
* The interface is stopped when it is brought.
*/
static int
dm9000_stop(struct net_device *ndev)
{
board_info_t *db = netdev_priv(ndev);
if (netif_msg_ifdown(db))
dev_dbg(db->dev, "shutting down %sn", ndev->name);
cancel_delayed_work_sync(&db->phy_poll); /*殺死延遲工作隊列phy_poll*/
/*停止傳輸并清空carrier*/
netif_stop_queue(ndev);
netif_carrier_off(ndev);
/* free interrupt */
free_irq(ndev->irq, ndev);
dm9000_shutdown(ndev);
return 0;
}
*dm9000_start_xmit()
重要的發(fā)送數(shù)據(jù)包函數(shù)。從上層發(fā)送sk_buff包。在看代碼之前先來看一下DM9000是如何發(fā)送數(shù)據(jù)包的。
如上圖所示,在DM9000內(nèi)部SRAM中,地址0x0000~0x0BFF是TX Buffer,地址0x0C00~0x3FFF是RX Buffer。在發(fā)送一個包之前,包中的有效數(shù)據(jù)必須先被存儲到TX Buffer中并且使用輸出端口命令來選擇MWCMD寄存器。包的長度定義在TXPLL和TXPLH中。最后設(shè)置TXCR寄存器的bit[0] TXREQ來自動發(fā)送包。如果設(shè)置了IMR寄存器的PTM位,則DM9000會產(chǎn)生一個中斷觸發(fā)在ISR寄存器的bit[1]=PTS=1, 同時設(shè)置一個完成標(biāo)志在NSR寄存器的bit[2]=TX1END或者 bit[3]=TX2END,表示包已經(jīng)發(fā)送完了。發(fā)送一個包的具體步驟如下:
Step 1: 檢查存儲數(shù)據(jù)寬度。通過讀取中斷狀態(tài)寄存器(ISR)的bit[7:6]來確定是8bit,16bit還是32bit。
Step 2: 寫數(shù)據(jù)到TX SRAM中。
Step 3: 寫傳輸長度到TXPLL和TXPLH寄存器中。
Step 4: 設(shè)置TXCR寄存器的bit[0]TXREQ來開始發(fā)送一個包。
代碼清單如下,讓我們看看在獲得自旋鎖這段期間都干了些什么:
/*
* 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)
{
unsigned long flags;
board_info_t *db = netdev_priv(dev);
上一篇:Mini2440 DM9000 驅(qū)動分析(一)
下一篇:mini2440 dm9000 網(wǎng)卡驅(qū)動詳解 (一)
推薦閱讀最新更新時間:2025-07-23 16:07



設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- LT1466L 的典型應(yīng)用 - 微功率雙路/四路精密軌至軌輸入和輸出運算放大器
- MIKROE-3492,用于 TIVA TM4C1294NCZAD 的 MCU 卡
- LT1183CS 浮動 CCFL 的典型應(yīng)用電路,具有燈電流的電位器控制
- CAT874 智能手機電池開關(guān)控制器的典型應(yīng)用
- S32V MIPI Cameras and De-Serializer
- Tda7376B 2 X 35W 汽車收音機功率放大器的典型應(yīng)用板參考電路
- EVAL-AD7763EDZ,用于 AD7763、24 位、625 KSPS、1 通道 ADC 的評估板,使用 EVAL-CED1Z 轉(zhuǎn)換器開發(fā)板
- 101020587, Grove - 光學(xué)旋轉(zhuǎn)編碼器 (TCUT1600X01)
- LTC3425EUH 演示板、4MHz、多相同步升壓轉(zhuǎn)換器、2V 至 3Vin、2 個電路、3.3Vout1 @ 2.25A、3.3Vout2 @ 1.8A
- 使用 NXP Semiconductors 的 MCF5282CVF80 的參考設(shè)計
- 消息稱三星在美“特斯拉專供”2nm 生產(chǎn)線 2026H2 投運,初期產(chǎn)能每月 1~1.5 萬片晶圓
- 黑客如何入侵軟件定義的汽車
- 中國首款國芯腦機智能頭環(huán)正式發(fā)布:非侵入式腦機 全自主國產(chǎn)芯片
- 自動駕駛中Transformer大模型會取代深度學(xué)習(xí)嗎?
- 這家面板廠在車載OLED領(lǐng)域或再迎新大單
- 激光雷達和攝像頭,誰會是機器人主要的“眼睛”?
- 毫米波雷達技術(shù)參數(shù)有哪些?毫米波雷達如何用于機器人導(dǎo)航
- 毫米波雷達技術(shù)有哪些優(yōu)勢?如何提高毫米波雷達測距精度
- 工業(yè)邊緣設(shè)備的安全啟動,TPM 2.0與可信執(zhí)行環(huán)境(TEE)的硬件級防護
- 工業(yè)機器人視覺系統(tǒng)的深度學(xué)習(xí)優(yōu)化,YOLOv8、3D點云匹配的實時性提升
- 2018中國西安電子信息產(chǎn)業(yè)博覽會盛大開幕
- AI芯片銷售額已達10億美元的英特爾如何看待AI芯片市場競爭
- 被動元件在PCB行業(yè)被高度關(guān)注
- LoRa技術(shù)為印度打造智能街道
- 成都企業(yè)發(fā)布首顆國產(chǎn)自主可控UWB定位芯片
- 消費級機器人平臺可以科技完成千萬美元B輪融資
- 2021年上半年,張江人工智能產(chǎn)業(yè)進一步“擴圈”
- 協(xié)作機器人未來新產(chǎn)品、新技術(shù)及發(fā)展趨勢
- 威視芯首顆智能高清電視SoC 回片點亮,四季度量產(chǎn)
- 華為自研OLED屏幕驅(qū)動芯片或已完成試產(chǎn)