日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年11月10日(星期日)

正在發(fā)生

2021年11月10日 | mini2440 dm9000 網(wǎng)卡驅(qū)動詳解 (二)

發(fā)布者:落霞與孤鶩 來源: eefocus關(guān)鍵字:mini2440  dm9000  網(wǎng)卡驅(qū)動 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

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ù)取4a清單如下:


/*    

 *  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);      

[1] [2]
關(guān)鍵字:mini2440  dm9000  網(wǎng)卡驅(qū)動 引用地址:mini2440 dm9000 網(wǎng)卡驅(qū)動詳解 (二)

上一篇:Mini2440 DM9000 驅(qū)動分析(一)
下一篇:mini2440 dm9000 網(wǎng)卡驅(qū)動詳解 (一)

推薦閱讀

11月5日起,中國國際進(jìn)口博覽會大幕開啟。172個國家、地區(qū)和國際組織參會,3600多家企業(yè)參展。這次盛會云集眾多高科技元素,上海國展中心的盒馬機(jī)器人餐廳就是其中之一。其中,收餐機(jī)器人“谷神星”吸引了眾多嘉賓的注意力,“谷神星”由阿里巴巴人工智能實(shí)驗(yàn)室研發(fā),為餐飲服務(wù)提供智能化解決方案,一天能節(jié)省餐廳服務(wù)員80%的體力勞動。(“谷神星”在盒...
(文章來源:中科羅伯特機(jī)器人學(xué)院) 工業(yè)機(jī)器人發(fā)展到現(xiàn)在已經(jīng)不在局限于某一個行業(yè)或者是領(lǐng)域了,在我國工業(yè)機(jī)器人已經(jīng)逐漸占領(lǐng)了各大流水線上的工作。隨著人們生活質(zhì)量的提高,傳統(tǒng)的工業(yè)機(jī)器人作業(yè)方式已經(jīng)不能滿足人們對產(chǎn)品的需求,科技的進(jìn)步會帶動工業(yè)機(jī)器人進(jìn)入到什么樣的發(fā)展呢。 行業(yè)是現(xiàn)在僅次于汽車的第二大應(yīng)用領(lǐng)域, 3C行業(yè)由于產(chǎn)品更...
截至11月9日收盤,A股三大指數(shù)今日集體大漲,其中滬指收盤上漲1.86%,收報(bào)3373.73點(diǎn);深成指上漲2.19%,收報(bào)14141.15點(diǎn),盤中創(chuàng)5年多新高,創(chuàng)業(yè)板指上漲2.96%,收報(bào)2814.00點(diǎn)。市場成交量放大,兩市合計(jì)成交超過一萬億元,今日達(dá)到1.08萬億元,北向資金今日大幅凈買入196.99億元。從盤面上看,第三代半導(dǎo)體、港口航運(yùn)、證券板塊漲幅居前,無板塊下跌。兩市...
谷歌在近期的 Android 開發(fā)者峰會上宣布推出專為大屏幕打造的 Android 12L 功能更新,以及全新的 API、工具和指南,讓開發(fā)者更加容易地為大屏幕構(gòu)建應(yīng)用。  今日,谷歌官方發(fā)布了 Android 12L 的詳細(xì)適配介紹,表示有超過 2.5 億臺大屏幕設(shè)備搭載了 Android 系統(tǒng),希望開發(fā)者為大屏幕設(shè)備進(jìn)行更多適配?! ndroid 12L 預(yù)覽:適...

史海拾趣

問答坊 | AI 解惑

請問如何用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    ...…

查看全部問答∨

如何實(shí)現(xiàn)PC與模擬器之間串口通訊

我要在EVC模擬器下開發(fā)基于WinCE的串口通信應(yīng)用程序,PC機(jī)只有一個串口com1 該怎么實(shí)現(xiàn)PC機(jī)與模擬器之間的串口通訊?…

查看全部問答∨

如何自動獲取設(shè)備識別串口號

各位大哥,大姐:     我現(xiàn)在需要做一個wince下的即插即用的程序,設(shè)備是usb模擬的串口。我需要在程序中檢測設(shè)備插入和拔出,這點(diǎn)已經(jīng)可以做到?,F(xiàn)在的問題是我想自動獲取新設(shè)備映射的串口號,并打開設(shè)備,請問有什么辦法可以做到嗎? ...…

查看全部問答∨

ds18b20的詭異問題

可以讀出ROM中固化的序列號,但是讀取溫度就是0x07ff。能讀出ROM中的內(nèi)容應(yīng)該說明讀寫時序沒問題,但是又讀不出正確的溫度。難道說是溫度轉(zhuǎn)化功能失效了? 注:連接為外部供電,4.7k上拉。單一元器件。溫度轉(zhuǎn)化時間絕對在750ms以上?!?

查看全部問答∨

易電源轉(zhuǎn)發(fā)

https://bbs.eeworld.com.cn/thread-352431-1-1.html…

查看全部問答∨

mega這么容易解密,改Xmega如何?

老板最近讓我們改用xmega128a3u,說是可以直接用USB下載顯示內(nèi)容而且暫時無法解密。原來的設(shè)計(jì)讓深圳給仿了,沒多少利潤了。xmega對我這種小鳥有點(diǎn)困難,有大俠用過嗎?給些快速進(jìn)入狀態(tài)的方法。…

查看全部問答∨

diy效果器 遇到的一些問題請各位指教了啊 多謝

大家好: 這是一張電吉他單塊效果器ds1的圖紙,有些地方不明太,跟大家請教一下,謝謝了 1:兩個虛線框里的ic如何接啊,我知道ic1a,ic1b的解法是原理的中的圈1到圈7,但為什么沒有圈1和圈5的地方啊? 2:還有ic2怎么接???  ic1和ic2 ...…

查看全部問答∨

關(guān)于stm32編程的iar軟件

剛開始學(xué)習(xí)stm32,之前stm8用的iar軟件,不知道stm32可不可以繼續(xù)使用呢?…

查看全部問答∨

【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ā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved