3. platform_driver的remove, suspend和resume的實(shí)現(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)該所有的功能都考慮進(jìn)去。這也體現(xiàn)了驅(qū)動和平臺分離的設(shè)計(jì)思想。
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()
進(jìn)行的工作有 向內(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來初始化一個延遲工作隊(duì)列并關(guān)聯(lián)了一個操作函數(shù)dm9000_poll_work(), 此時運(yùn)行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); /*殺死延遲工作隊(duì)列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ū)動詳解 (一)
推薦閱讀
史海拾趣
在宇航領(lǐng)域,動力電池管理芯片的性能要求極高。西安航天民芯憑借其在集成電路設(shè)計(jì)領(lǐng)域的深厚積累,成功研發(fā)出全國第一顆宇航級動力電池管理芯片。這一突破不僅打破了國外壟斷的局面,也為中國宇航事業(yè)的發(fā)展做出了重要貢獻(xiàn)。
自1958年成立以來,Chemtronics公司在電子維護(hù)和維修領(lǐng)域不斷進(jìn)取。最初,公司專注于生產(chǎn)一系列清潔劑產(chǎn)品,以其高效清潔能力獲得了市場的認(rèn)可。隨著時間的推移,Chemtronics逐漸將產(chǎn)品線擴(kuò)展至超純?nèi)軇艋壹墑e擦拭棒和擦拭布等領(lǐng)域,進(jìn)而又?jǐn)U展到電子電氣和電信工業(yè)的精密返工和維修工具。這一轉(zhuǎn)變不僅體現(xiàn)了公司對市場需求的敏銳洞察,也彰顯了其不斷創(chuàng)新的精神。
面對數(shù)字化時代的挑戰(zhàn)和機(jī)遇,DIOO公司決定加快數(shù)字化轉(zhuǎn)型步伐。通過引入云計(jì)算、大數(shù)據(jù)、人工智能等先進(jìn)技術(shù),DIOO公司實(shí)現(xiàn)了產(chǎn)品設(shè)計(jì)、生產(chǎn)、銷售等各個環(huán)節(jié)的數(shù)字化管理。同時,DIOO公司還積極探索新的商業(yè)模式和市場機(jī)會,與互聯(lián)網(wǎng)企業(yè)、電信運(yùn)營商等合作伙伴共同打造智能生態(tài)圈。未來,DIOO公司將繼續(xù)秉承創(chuàng)新、卓越、服務(wù)的理念,致力于成為全球領(lǐng)先的電子產(chǎn)品制造商和服務(wù)提供商。
在電源適配器和服務(wù)器電源市場,EUtech公司憑借技術(shù)創(chuàng)新迅速崛起。他們不斷優(yōu)化產(chǎn)品設(shè)計(jì),提高產(chǎn)品性能,同時注重節(jié)能環(huán)保。隨著下游AI行業(yè)的快速發(fā)展,公司及時抓住機(jī)遇,推出了一系列高性能、高可靠性的電源產(chǎn)品,贏得了市場的廣泛認(rèn)可。
1982年,F(xiàn)abrimex AG收購了瑞士領(lǐng)先的實(shí)驗(yàn)室電源制造商Erlenbach的K. Witmer Elektronik AG博士。這一收購不僅增強(qiáng)了公司在實(shí)驗(yàn)室電源領(lǐng)域的實(shí)力,還進(jìn)一步鞏固了其在電子行業(yè)中的地位。通過整合雙方的技術(shù)和資源,F(xiàn)abrimex AG在實(shí)驗(yàn)室電源領(lǐng)域取得了更高的市場份額和更廣泛的客戶認(rèn)可。
請問如何用51C語言搭建程序框架,而用匯編語言完成程序細(xì)節(jié)? 知道這個問題有點(diǎn)抽象,是編程編久了的人才會更好的運(yùn)用,但是現(xiàn)在我遇到的問題是直接用匯編,程序顯得亂而雜,直接用C,我的C又不是很好,所以想問問如何用51C語言搭建程序框架,而用匯編語言完成程序細(xì)節(jié)呢?誠摯的感謝寄予我?guī)椭娜藗儈~~… 查看全部問答∨ |
向高手真誠提問:關(guān)于AT91SAM7X256 開發(fā)的問題 那位高手能給我一個在IAR平臺開發(fā)的基于AT91SAM7X256 的串口通信程序?我剛開始接觸,很不了解,代碼越簡單越好, 我已有開發(fā)板,但是沒有程序參考,請高手幫幫忙,不勝感激!?。。。?! 請把程序發(fā)到我的郵箱firstyangfeng@126.com ...… 查看全部問答∨ |
我要在EVC模擬器下開發(fā)基于WinCE的串口通信應(yīng)用程序,PC機(jī)只有一個串口com1 該怎么實(shí)現(xiàn)PC機(jī)與模擬器之間的串口通訊?… 查看全部問答∨ |
各位大哥,大姐: 我現(xiàn)在需要做一個wince下的即插即用的程序,設(shè)備是usb模擬的串口。我需要在程序中檢測設(shè)備插入和拔出,這點(diǎn)已經(jīng)可以做到?,F(xiàn)在的問題是我想自動獲取新設(shè)備映射的串口號,并打開設(shè)備,請問有什么辦法可以做到嗎? ...… 查看全部問答∨ |
可以讀出ROM中固化的序列號,但是讀取溫度就是0x07ff。能讀出ROM中的內(nèi)容應(yīng)該說明讀寫時序沒問題,但是又讀不出正確的溫度。難道說是溫度轉(zhuǎn)化功能失效了? 注:連接為外部供電,4.7k上拉。單一元器件。溫度轉(zhuǎn)化時間絕對在750ms以上?!? 查看全部問答∨ |
|
老板最近讓我們改用xmega128a3u,說是可以直接用USB下載顯示內(nèi)容而且暫時無法解密。原來的設(shè)計(jì)讓深圳給仿了,沒多少利潤了。xmega對我這種小鳥有點(diǎn)困難,有大俠用過嗎?給些快速進(jìn)入狀態(tài)的方法。… 查看全部問答∨ |
大家好: 這是一張電吉他單塊效果器ds1的圖紙,有些地方不明太,跟大家請教一下,謝謝了 1:兩個虛線框里的ic如何接啊,我知道ic1a,ic1b的解法是原理的中的圈1到圈7,但為什么沒有圈1和圈5的地方啊? 2:還有ic2怎么接??? ic1和ic2 ...… 查看全部問答∨ |
【Altera SOC體驗(yàn)之旅 】Soc FPGA之DSP進(jìn)階---NEON高性能媒體引擎(二) 本帖最后由 CMika 于 2015-5-27 23:08 編輯 Neon函數(shù)在頭文件arm_neon.h中已經(jīng)被定義,頭文件既定義內(nèi)嵌函數(shù),也定義一組向量類型,編譯器將NEON內(nèi)嵌函數(shù)視為普通函數(shù)調(diào)用。 基本的DSP處理模塊 例程1 實(shí)現(xiàn)從0-99的加法運(yùn)算作為使用NE ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 電動車電池成本降一半,續(xù)航卻減一半?寧德時代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國產(chǎn)化:從物料齊全到系統(tǒng)話語權(quán)
- 總額超260億-盤點(diǎn)全球移動機(jī)器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱悠嚺cAI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫時的錯誤
- ESP32 S3接ST7789屏幕線序
- Maxim 利用nanoPower創(chuàng)新技術(shù),致力于降低系統(tǒng)的靜態(tài)功耗 看視頻答題贏好禮! 還有免費(fèi)開發(fā)板等你拿
- 有獎直播:市場環(huán)境不確定,為物聯(lián)網(wǎng)設(shè)備保駕護(hù)航英飛凌很確定
- 免費(fèi)嘗鮮:熱氣體式加速度傳感器來啦,拍攝沖擊對比實(shí)驗(yàn)有好禮
- 調(diào)查:量身定制你的 M0 單片機(jī)!參與問卷有好禮!
- 瑞薩電子RL78/G14評估板DIY精彩上演!
- 有獎直播報(bào)名 | 大聯(lián)大世平集團(tuán)&Molex 互聯(lián)方案為下一代汽車科技賦能
- 發(fā)原創(chuàng)討論 贏驚喜大禮
- 有獎直播:TI MSP430TM集成可配置信號鏈模塊在傳感測量領(lǐng)域的應(yīng)用
- 拆招有禮:洞悉電子產(chǎn)品中的大數(shù)據(jù),招招解決測量難題!Keysight DAQ970系列活動
- 電感知識大考:遇到這些問題怎么辦?|“MPS電感探索季:發(fā)現(xiàn)小且不凡的秘密!”第一站
- 手機(jī)藍(lán)光不僅傷害眼睛 還可能增加抑郁幾率
- Galaxy Note 20在韓國市場有三種額外機(jī)身顏色
- 三星Galaxy Note 20系列國行將于8月13日發(fā)布
- 一加發(fā)布全新氫OS 11:升級更多功能和交互
- 華為Mate X2解密:外折疊設(shè)計(jì) 支持手寫筆
- 全球筆記本出貨量將達(dá)2.25億臺,2021年臺式電腦銷量繼續(xù)下滑
- 泰克示波器百科學(xué)堂系列,助力工程師夯實(shí)基礎(chǔ)
- 中國廠商發(fā)力,TWS耳機(jī)銷量飆升
- ST加入ZETA聯(lián)盟,推進(jìn)新興遠(yuǎn)距離IoT連接標(biāo)準(zhǔn)普及
- 隨著中國廠商發(fā)力,2020年真無線立體聲(TWS)耳機(jī)銷量飆升