雖然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;
上一篇:mini2440 dm9000 網卡驅動詳解 (二)
下一篇:mini2440 dm9000 網卡驅動詳解 (三)
推薦閱讀
史海拾趣
2015年,FIDELIX迎來了一個重要的轉折點。在這一年,東芯半導體有限公司(以下簡稱“東芯半導體”)正式收購了FIDELIX 25.3%的股權,成為其第一大股東及實際控制人。這一收購標志著FIDELIX開始進入一個新的發展階段。
通過與東芯半導體的合作,FIDELIX獲得了更多的資金支持和市場資源。東芯半導體是一家專注于中小容量存儲芯片研發、設計和銷售的中國企業,在半導體領域擁有豐富的經驗和資源。雙方的合作不僅為FIDELIX帶來了更多的發展機會,同時也加速了FIDELIX在國際市場上的擴張步伐。
在上述兩個故事的基礎上,可以根據FIDELIX公司的具體發展歷程、重要事件、技術創新、市場策略等方面進行進一步的拓展和補充,以形成完整、詳細的故事內容。
近年來,生成式AI技術的快速發展為網絡安全帶來了新的變革。Defender Security公司緊跟這一趨勢,將生成式AI技術應用于網絡安全領域。他們利用生成式AI技術來模擬和預測網絡攻擊行為,從而提前發現潛在的安全威脅。通過不斷的技術創新和應用實踐,Defender Security在網絡安全領域取得了顯著的成果。
EPSON一直注重環保和可持續發展。公司積極采用環保材料和綠色生產工藝,降低生產過程中的能耗和排放。同時,EPSON還致力于研發環保型電子產品,如節能型打印機、環保型投影機等,以減少電子產品對環境的影響。此外,EPSON還積極參與各種環保公益活動,推動電子行業的綠色發展。
1934年,Chauvin Arnoux再次引領技術潮流,發明了電流互感器鉗形表,這是世界上第一個非接觸式電流表。這一發明不僅改變了電流測量的傳統方式,而且極大地提高了測量的便捷性和安全性。非接觸式電流表的出現,為電氣工程師和技術人員提供了更為高效和安全的測量工具,推動了電氣行業的發展。
為了持續提升產品質量和客戶滿意度,碩頡科技于2005年通過了ISO9001質量管理體系認證。這一認證標志著公司在質量管理方面達到了國際標準,也進一步提升了公司的行業地位和競爭力。通過實施嚴格的質量管理體系,碩頡科技確保了產品從設計、研發到銷售的每一個環節都符合高質量標準,為客戶提供了可靠的產品和服務。
這些故事只是碩頡科技發展歷程中的一部分,它們共同展示了公司在電子行業中不斷壯大、創新發展的歷程。未來,碩頡科技將繼續秉承創新、質量、服務的理念,不斷推出更多優質產品,拓展更廣闊的市場空間,為電子行業的發展貢獻更多力量。
Astema公司注重人才培養和團隊建設。公司設立了完善的培訓體系,為員工提供持續的學習和發展機會。同時,Astema還積極引進優秀人才,打造了一支高素質、專業化的團隊。這支團隊不僅為公司的技術創新提供了有力支持,還為公司的長期發展奠定了堅實的基礎。
大家幫我看看這個程序錯在哪??? stc89c52的單片機 輸出pwm 頻率為100Hz是完全正常 現在頻率為1000hz 就不行了 ????????? 高手給研究研究 #include<reg52.h> sbit PWM=P2^0;//PWM輸出口 int x; vo ...… 查看全部問答∨ |
|
s3c2410大多移植2.4內核或是uclinux, 2440以后基本都是2.6內核,請問內核版本選擇跟芯片有關嗎? 網上看到有人在2410板子上移植成功2.6內核, 請問這樣的配合合理嗎? 會不會有在奔3機子上裝winXP這種感覺呢?… 查看全部問答∨ |
四、硅谷模式不適全中國環境 很多從硅谷回國的海歸在創業失敗后,都會說,在中國運營公司比在硅谷要難。筆者在2005年和2006年認識了很多的回國創業的海歸人士,當年都是雄心勃勃,結果,幾年下來,現在大都已經宣布公司倒閉,有的回到美國去了,有 ...… 查看全部問答∨ |
各位大俠,有用過CoIDE開發stm32的沒?這里面怎么更新庫,還有利用他自己的組件建立工程,怎么沒有stm32f10x_it.c文件呢?難道要自己加進去?小弟初接觸,忘各位指點… 查看全部問答∨ |
|
ADC10_B只有一個ADC10MEM0,也就是每次只能轉化一個通道數據,如果我想同時轉化多個通道的數據該怎么辦呢? 我原本的想法有兩個: 第一,采用Single-channel, single-conversion,每次轉換好一個通道后,寫指令改通道,再轉換, ...… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 13:12 編輯 TI的收發集成方案請參考下面連接.AFE7225,TRF3720,TRF3711 ti./solution/femto_base_station … 查看全部問答∨ |
1、M25P16概述 M25P16是一款帶有先進寫保護機制和高速SPI總線訪問的2M字節串行Flash存儲器,該存儲器主要特點:2M字節的存儲空間,分32個扇區,每個扇區256頁,每頁256字節;寫入1頁數據所需時間為1.4 ms(典型值);能單塊擦除和 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析