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

mini2440 dm9000 網(wǎng)卡驅(qū)動詳解 (二)

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

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ù)取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來初始化一個延遲工作隊列并關(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);      

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

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

推薦閱讀最新更新時間:2025-07-23 16:07

mini2440硬件篇之看門狗
1. 硬件原理 看門狗類似定時器,它的原理是一定時間內(nèi)要喂狗(實質(zhì)是往某個寄存器寫值),否則,它就會咬你(就是重啟)。 2. 芯片手冊 3. mini2440電路圖 4. S3C2440寄存器 看門狗時鐘源是PCLK,通過預(yù)分頻器后,會再次分配得到4種頻率,可以通過配置選擇哪一個作為看門狗工作頻率。第一次啟動看門狗,往WTCNT寫初始值,每個時鐘周期WTCNT減1,在減到0以前必須再給它賦值,否則到0后會發(fā)出復(fù)位信號,然后從WATDAT自動再裝入。 WTCON控制寄存器 計數(shù)為零是否輸出復(fù)位信號 中斷使能 時鐘選擇,即分配比例 啟動看門狗 預(yù)分頻系數(shù) watchdog.h #ifndef __WTD_H_
[單片機]
<font color='red'>mini2440</font>硬件篇之看門狗
根據(jù)韋東山修改的mini2440 nand flash裸機程序
說明 開發(fā)板:mini2440 Nand flash:K9F2G08U0B2,56M 本程序?qū)崿F(xiàn)功能:我是參考韋東山的第8章的裸機程序,但是他的nand flash型號是64MB的K9F12080M,所以我依照他的程序加以修改,下載到nand flash,從nand flash實現(xiàn)將main.c程序復(fù)制到sdram中執(zhí)行。 參考書:《嵌入式應(yīng)用開發(fā)完全手冊》 《ARM處理器裸機開發(fā)實戰(zhàn)---機制而非策略》 知識點梳理 頁的絕對地址與相對地址 在nand.c中有一個函數(shù)void RdNF2SDRAM(),它的功能
[單片機]
根據(jù)韋東山修改的<font color='red'>mini2440</font> nand flash裸機程序
006_mini2440裸機異常和中斷
基于ARM920T的S3C2440的7種操作模式 1、User (usr): The normal ARM program execution state 2、 FIQ (fiq): Designed to support a data transfer or channel process 3、 IRQ (irq): Used for general-purpose interrupt handling 4、 Supervisor (svc): Protected mode for the operating system 5、 Abort mode (abt): Entered after a data or instruct
[單片機]
006_mini2440裸機異常和中斷
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

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