娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

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

正在發生

2021年11月10日 | mini2440 dm9000 網卡驅動詳解 (一)

發布者:yunhao 來源: eefocus關鍵字:mini2440  dm9000  網卡驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

雖然Linux驅動程序應該是和具體的硬件平臺分離的,但是為了更好的理解DM9000的驅動程序,這里還是結合一下Mini2440開發板,這樣也可以更好的體會如何實現驅動和平臺分離。


本文分成以下幾個部分:


一、Mini2440開發板上DM9000的電氣連接和Mach-mini2440.c文件的關系。 


二、兩個重要的結構體介紹:sk_buff和net_device


三、具體代碼分析


一、Mini2440開發板上DM9000的電氣連接和Mach-mini2440.c文件的關系


Mini2440開發板上DM9000與S3C2440的連接關系如下:

這個DM9000平臺設備作為眾多平臺設備中的一個在扳子初始化的時候就被添加到了總線上。代碼清單如下:


其中片選信號AEN使用了nGCS4,所以網卡的內存區域在BANK4,也就是從地址0x20000000開始。DM9000的TXD[2:0]作為strap pin在電路圖中是空接的,所以IO base是300H。中斷使用了EINT7。這些內容在Mach文件中有如下體現:


#define S3C2410_CS4 (0x20000000)     

#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)      

static struct resource mini2440_dm9k_resource[] __initdata = {       

    [0] = {       

        .start = MACH_MINI2440_DM9K_BASE,       

        .end   = MACH_MINI2440_DM9K_BASE + 3,       

        .flags = IORESOURCE_MEM       

    },       

    [1] = {       

        .start = MACH_MINI2440_DM9K_BASE + 4,       

        .end   = MACH_MINI2440_DM9K_BASE + 7,       

        .flags = IORESOURCE_MEM       

    },       

    [2] = {       

        .start = IRQ_EINT7,       

        .end   = IRQ_EINT7,       

        .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,       

    }       

};    


另外在Mach文件中還定義了DM9000平臺設備,設備名稱為“dm9000”,設備資源就是上面定義的IO和中斷資源。代碼清單如下:


static struct dm9000_plat_data mini2440_dm9k_pdata __initdata = {      

    .flags      = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),      

};      

     

static struct platform_device mini2440_device_eth __initdata = {      

    .name       = "dm9000",      

    .id     = -1,      

    .num_resources  = ARRAY_SIZE(mini2440_dm9k_resource),      

    .resource   = mini2440_dm9k_resource,      

    .dev        = {      

        .platform_data  = &mini2440_dm9k_pdata,      

    },      

};    


MACHINE_START(MINI2440, "MINI2440")      

    /* Maintainer: Michel Pollet */     

    .phys_io    = S3C2410_PA_UART,      

    .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,      

    .boot_params    = S3C2410_SDRAM_PA + 0x100,      

    .map_io     = mini2440_map_io,      

    .init_machine   = mini2440_init, /*初始化函數*/     

    .init_irq   = s3c24xx_init_irq,      

    .timer      = &s3c24xx_timer,      

MACHINE_END    

  

static void __init mini2440_init(void)      

{      

    ...      

         ...      

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));      

     

        ...      

        ...      

}    

 

static struct platform_device *mini2440_devices[] __initdata = {      

    &s3c_device_usb,      

    &s3c_device_wdt,      

/*  &s3c_device_adc,*/ /* ADC doesn't like living with touchscreen ! */     

    &s3c_device_i2c0,      

    &s3c_device_rtc,      

    &s3c_device_usbgadget,      

    &mini2440_device_eth, /*dm9000是眾多平臺設備中的一個*/     

    &mini2440_led1,      

    &mini2440_led2,      

    &mini2440_led3,      

    &mini2440_led4,      

    &mini2440_button_device,      

    &s3c_device_nand,      

    &s3c_device_sdi,      

    &s3c_device_iis,      

    &mini2440_audio,      

/*  &s3c_device_timer[0],*/ /* buzzer pwm, no API for it */     

    /* remaining devices are optional */     

};    


二、兩個重要的結構體簡單介紹:sk_buff和net_device

 *sk_buff


如果把網絡傳輸看成是運送貨物的話,那么sk_buff就是這個“貨物”了,所有經手這個貨物的人都要干點什么事兒,要么加個包裝,要么印個戳兒等等。收貨的時候就要拆掉這些包裝,得到我們需要的貨物(payload data)。沒有貨物你還運輸什么呢?由此可見sk_buff的重要性了。關于sk_buff的詳細介紹和幾個操作它的函數,參考:“linux內核sk_buff的結構分析” http://www.linuxidc.com/Linux/2011-07/39163.htm,寫得非常明白了。贊一個~


 *net_device


又是一個龐大的結構體。好吧,我承認我從來就沒有看全過這個結構體。它在內核中就是指代了一個網絡設備。驅動程序需要在探測的時候分配并初始化這個結構體,然后使用register_netdev來注冊它,這樣就可以把操作硬件的函數與內核掛接在一起。


三、具體代碼的分析


在順序分析之前先看三個結構體變量和一個自定義的結構體。


* dm9000_driver變量。是platform_driver結構體變量,其中包含了重要的:驅動的名字(用來match)和幾個重要操作函數。


static struct platform_driver dm9000_driver = {      

    .driver = {      

        .name    = "dm9000",      

        .owner   = THIS_MODULE,      

    },      

    .probe   = dm9000_probe,      

    .remove  = __devexit_p(dm9000_drv_remove),      

    .suspend = dm9000_drv_suspend,      

    .resume  = dm9000_drv_resume,      

};    


* dm9000_netdev_ops變量。是net_device_ops結構體變量, 其中定義了操作net_device的重要函數,我們在驅動程序中根據需要的操作要填充這些函數。代碼清單如下:


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      

};    



 * dm9000_ethtool_ops變量。是ethtool_ops結構體變量,為了支持ethtool,其中的函數主要是用于查詢和設置網卡參數(當然也有的驅動程序可能不支持ethtool)。代碼清單如下:


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,      

};    


*board_info結構體。用來保存芯片相關的一些私有信息。具體在代碼中分析。下面是這個結構體的清單。


/* Structure/enum declaration ------------------------------- */     

typedef struct board_info {      

     

    void __iomem    *io_addr;   /* Register I/O base address */     

    void __iomem    *io_data;   /* Data I/O address */     

    u16      irq;       /* IRQ */     

     

    u16     tx_pkt_cnt;      

    u16     queue_pkt_len;      

    u16     queue_start_addr;      

    u16     dbug_cnt;      

    u8      io_mode;        /* 0:word, 2:byte */     

    u8      phy_addr;      

    u8      imr_all;      

[1] [2] [3]
關鍵字:mini2440  dm9000  網卡驅動 引用地址:mini2440 dm9000 網卡驅動詳解 (一)

上一篇:mini2440 dm9000 網卡驅動詳解 (二)
下一篇:mini2440 dm9000 網卡驅動詳解 (三)

推薦閱讀

? ? ? ? 斐訊“0元購”風波另一只靴子落地,華夏萬家正式被立案?! ?1月6日,成都市公安局錦江區分局發布案情通報,錦江區分局已于9月將“華夏萬家金服”P2P平臺依法立案偵查。目前,黃某等11名犯罪嫌疑人已被依法采取刑事強制措施,案件正在進一步偵辦中。  至此,斐訊“0元購”風波涉及的兩家平臺全部被立案,另一家是今年6月爆雷的聯璧金融...
(文章來源:中國機器人網) 過去,機器人只能在工廠進行繁重的工作或進行精細的工作?,F在,波士頓動力公司靈活的四足機器人Spot可供公司租借以執行各種現實世界的工作,這標志著近年來人機之間的普通交互已經變得多么普遍。盡管Spot具有通用性和堅固性,但它卻被社會視為傳統機器人,即金屬和硬塑料的混合物。許多研究人員堅信, 能夠與人進行安全的...
今日,紫光展銳秋季發布會線上舉行。在以打造“人民的數字世界”、做“數字實際的生態承載者”戰略目標的指引下,紫光展銳正借助5G發展的機遇快速前行,發布了包括應用于CPE、射頻前端、NB-IoT、智能汽車、智能穿戴等領域的諸多行業領先的重量級芯片產品和解決方案。讓高科技人人用得起在發布會上,紫光展銳CEO楚慶開宗明義,闡釋了新展銳的企業戰略——“...
為促進中國芯片領域的發展以及為該領域內企業的成長提供支持,日前畢馬威中國在第四屆進博會上重磅發布了“畢馬威中國第二屆‘芯科技’新銳企業50評選”榜單及《中國“芯科技”新銳企業50報告》。本屆榜單中超過九成以上的企業位于長三角、京津冀、珠三角等地區,其中有約六成的企業集中在長三角地區,這些地區優質而豐富的高校資源以及大力的政府扶持政策...

史海拾趣

問答坊 | AI 解惑

簡短的一段程序,,,求救!!!!

大家幫我看看這個程序錯在哪??? stc89c52的單片機   輸出pwm 頻率為100Hz是完全正常 現在頻率為1000hz   就不行了 ????????? 高手給研究研究 #include<reg52.h> sbit PWM=P2^0;//PWM輸出口 int x; vo ...…

查看全部問答∨

linux內核版本選擇跟ARM芯片型號有關嗎?

s3c2410大多移植2.4內核或是uclinux, 2440以后基本都是2.6內核,請問內核版本選擇跟芯片有關嗎? 網上看到有人在2410板子上移植成功2.6內核, 請問這樣的配合合理嗎? 會不會有在奔3機子上裝winXP這種感覺呢?…

查看全部問答∨

探秘中國IC設計發展迷局(四):硅谷模式不適全中國環境

四、硅谷模式不適全中國環境 很多從硅谷回國的海歸在創業失敗后,都會說,在中國運營公司比在硅谷要難。筆者在2005年和2006年認識了很多的回國創業的海歸人士,當年都是雄心勃勃,結果,幾年下來,現在大都已經宣布公司倒閉,有的回到美國去了,有 ...…

查看全部問答∨

怎么使用CoIDE建工程 ?

各位大俠,有用過CoIDE開發stm32的沒?這里面怎么更新庫,還有利用他自己的組件建立工程,怎么沒有stm32f10x_it.c文件呢?難道要自己加進去?小弟初接觸,忘各位指點…

查看全部問答∨

求橫流電路PCB 有獎勵

本帖最后由 paulhyde 于 2014-9-15 09:12 編輯 求橫流電路PCB 有獎勵  …

查看全部問答∨

【ADC10_B】怎么使用?

ADC10_B只有一個ADC10MEM0,也就是每次只能轉化一個通道數據,如果我想同時轉化多個通道的數據該怎么辦呢?   我原本的想法有兩個:   第一,采用Single-channel, single-conversion,每次轉換好一個通道后,寫指令改通道,再轉換, ...…

查看全部問答∨

TI femto solution

本帖最后由 dontium 于 2015-1-23 13:12 編輯 TI的收發集成方案請參考下面連接.AFE7225,TRF3720,TRF3711 ti./solution/femto_base_station …

查看全部問答∨

Flash存儲芯片M25P16中文資料

1、M25P16概述    M25P16是一款帶有先進寫保護機制和高速SPI總線訪問的2M字節串行Flash存儲器,該存儲器主要特點:2M字節的存儲空間,分32個扇區,每個扇區256頁,每頁256字節;寫入1頁數據所需時間為1.4 ms(典型值);能單塊擦除和 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 岢岚县| 庆安县| 高密市| 灵璧县| 调兵山市| 甘孜县| 阳春市| 泉州市| 饶阳县| 松潘县| 长沙县| 普陀区| 贵德县| 九龙坡区| 孟州市| 哈巴河县| 衡山县| 论坛| 秭归县| 道真| 商丘市| 霸州市| 鹤壁市| 台北县| 绥滨县| 惠来县| 乌苏市| 阿鲁科尔沁旗| 武穴市| 依兰县| 宁化县| 民权县| 广昌县| 崇左市| 马公市| 津南区| 霍邱县| 淮安市| 哈尔滨市| 女性| 苏尼特左旗|