雖然Linux驅(qū)動(dòng)程序應(yīng)該是和具體的硬件平臺(tái)分離的,但是為了更好的理解DM9000的驅(qū)動(dòng)程序,這里還是結(jié)合一下Mini2440開發(fā)板,這樣也可以更好的體會(huì)如何實(shí)現(xiàn)驅(qū)動(dòng)和平臺(tái)分離。
本文分成以下幾個(gè)部分:
一、Mini2440開發(fā)板上DM9000的電氣連接和Mach-mini2440.c文件的關(guān)系。
二、兩個(gè)重要的結(jié)構(gòu)體介紹:sk_buff和net_device
三、具體代碼分析
一、Mini2440開發(fā)板上DM9000的電氣連接和Mach-mini2440.c文件的關(guān)系
Mini2440開發(fā)板上DM9000與S3C2440的連接關(guān)系如下:
這個(gè)DM9000平臺(tái)設(shè)備作為眾多平臺(tái)設(shè)備中的一個(gè)在扳子初始化的時(shí)候就被添加到了總線上。代碼清單如下:
其中片選信號AEN使用了nGCS4,所以網(wǎng)卡的內(nèi)存區(qū)域在BANK4,也就是從地址0x20000000開始。DM9000的TXD[2:0]作為strap pin在電路圖中是空接的,所以IO base是300H。中斷使用了EINT7。這些內(nèi)容在Mach文件中有如下體現(xiàn):
#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平臺(tái)設(shè)備,設(shè)備名稱為“dm9000”,設(shè)備資源就是上面定義的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, /*初始化函數(shù)*/ .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是眾多平臺(tái)設(shè)備中的一個(gè)*/ &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 */ }; 二、兩個(gè)重要的結(jié)構(gòu)體簡單介紹:sk_buff和net_device *sk_buff 如果把網(wǎng)絡(luò)傳輸看成是運(yùn)送貨物的話,那么sk_buff就是這個(gè)“貨物”了,所有經(jīng)手這個(gè)貨物的人都要干點(diǎn)什么事兒,要么加個(gè)包裝,要么印個(gè)戳兒等等。收貨的時(shí)候就要拆掉這些包裝,得到我們需要的貨物(payload data)。沒有貨物你還運(yùn)輸什么呢?由此可見sk_buff的重要性了。關(guān)于sk_buff的詳細(xì)介紹和幾個(gè)操作它的函數(shù),參考:“l(fā)inux內(nèi)核sk_buff的結(jié)構(gòu)分析” http://www.linuxidc.com/Linux/2011-07/39163.htm,寫得非常明白了。贊一個(gè)~ *net_device 又是一個(gè)龐大的結(jié)構(gòu)體。好吧,我承認(rèn)我從來就沒有看全過這個(gè)結(jié)構(gòu)體。它在內(nèi)核中就是指代了一個(gè)網(wǎng)絡(luò)設(shè)備。驅(qū)動(dòng)程序需要在探測的時(shí)候分配并初始化這個(gè)結(jié)構(gòu)體,然后使用register_netdev來注冊它,這樣就可以把操作硬件的函數(shù)與內(nèi)核掛接在一起。 三、具體代碼的分析 在順序分析之前先看三個(gè)結(jié)構(gòu)體變量和一個(gè)自定義的結(jié)構(gòu)體。 * dm9000_driver變量。是platform_driver結(jié)構(gòu)體變量,其中包含了重要的:驅(qū)動(dòng)的名字(用來match)和幾個(gè)重要操作函數(shù)。 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結(jié)構(gòu)體變量, 其中定義了操作net_device的重要函數(shù),我們在驅(qū)動(dòng)程序中根據(jù)需要的操作要填充這些函數(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 }; * dm9000_ethtool_ops變量。是ethtool_ops結(jié)構(gòu)體變量,為了支持ethtool,其中的函數(shù)主要是用于查詢和設(shè)置網(wǎng)卡參數(shù)(當(dāng)然也有的驅(qū)動(dòng)程序可能不支持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結(jié)構(gòu)體。用來保存芯片相關(guān)的一些私有信息。具體在代碼中分析。下面是這個(gè)結(jié)構(gòu)體的清單。 /* 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 網(wǎng)卡驅(qū)動(dòng)詳解 (二)
下一篇:mini2440 dm9000 網(wǎng)卡驅(qū)動(dòng)詳解 (三)
推薦閱讀
史海拾趣
作為一家有遠(yuǎn)見的企業(yè),靜芯微電子不僅關(guān)注自身的發(fā)展,還積極履行社會(huì)責(zé)任。公司積極參與環(huán)保公益活動(dòng)和社會(huì)責(zé)任項(xiàng)目,致力于推動(dòng)電子行業(yè)的可持續(xù)發(fā)展。同時(shí),靜芯微電子還注重員工的培訓(xùn)和發(fā)展,為員工提供良好的工作環(huán)境和晉升機(jī)會(huì)。這些舉措不僅增強(qiáng)了企業(yè)的凝聚力和向心力,也為企業(yè)的長期發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
作為一家有遠(yuǎn)見的企業(yè),靜芯微電子不僅關(guān)注自身的發(fā)展,還積極履行社會(huì)責(zé)任。公司積極參與環(huán)保公益活動(dòng)和社會(huì)責(zé)任項(xiàng)目,致力于推動(dòng)電子行業(yè)的可持續(xù)發(fā)展。同時(shí),靜芯微電子還注重員工的培訓(xùn)和發(fā)展,為員工提供良好的工作環(huán)境和晉升機(jī)會(huì)。這些舉措不僅增強(qiáng)了企業(yè)的凝聚力和向心力,也為企業(yè)的長期發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
在電子行業(yè)的快速發(fā)展中,Dremio公司以其獨(dú)特的數(shù)據(jù)治理技術(shù)嶄露頭角。他們開發(fā)了一種新型的數(shù)據(jù)處理引擎,能夠直接在云數(shù)據(jù)湖中查詢和分析數(shù)據(jù),無需將數(shù)據(jù)復(fù)制到專有數(shù)據(jù)倉庫中。這一創(chuàng)新技術(shù)大大提高了數(shù)據(jù)處理效率,降低了成本,并為企業(yè)提供了更靈活的數(shù)據(jù)管理方式。Dremio憑借這一技術(shù),迅速在電子行業(yè)中樹立了領(lǐng)先地位。
隨著技術(shù)的不斷進(jìn)步,Ai公司在LED照明光源領(lǐng)域取得了重大突破。公司成功研發(fā)出了一系列高效、穩(wěn)定、可靠的LED光源產(chǎn)品,這些產(chǎn)品不僅性能卓越,而且設(shè)計(jì)新穎,滿足了市場對于高質(zhì)量照明光源的迫切需求。同時(shí),公司還不斷創(chuàng)新,推出了多款具有自主知識產(chǎn)權(quán)的新型LED光源,進(jìn)一步鞏固了公司在行業(yè)內(nèi)的領(lǐng)先地位。
美國派爾高球機(jī)使用的電機(jī)驅(qū)動(dòng)芯片 步進(jìn)電機(jī)控制+驅(qū)動(dòng)芯片---TMC222的原理及應(yīng)用 Gavy 13812617052 摘 要:在今日空間有限的環(huán)境中,設(shè)計(jì)人員急需功能豐富,體積精巧而整體效能強(qiáng)大的解決方案,TMC211在對步進(jìn) ...… 查看全部問答∨ |
|
炎熱的夏天,機(jī)器的硬盤(兩塊)熱得燙手(58d.c),機(jī)器性能明顯下降。 考慮加個(gè)風(fēng)扇,又懶得出去跑(天太熱~~)。想起還有臺(tái)舊電腦,很久不用了,早晚也是扔貨。不如廢物利用。 打開機(jī)箱,取出電源,拆出風(fēng)扇。把原來的四顆固定螺絲擰進(jìn)原處, ...… 查看全部問答∨ |
各位達(dá)人誰有關(guān)于Tornado組件的詳細(xì)介紹的資料啊?我前段時(shí)間一不小心把師父的工程里面的組件改了,然后怎么編譯都通不過,這才覺得這些組件也很重要?。≌l有詳細(xì)的資料或者關(guān)于這方面的書,介紹一下??!小弟在此謝了?。 ? 查看全部問答∨ |
我要在嵌入式(基于WinCE)里使用TinyXml,不知道該如何設(shè)置。我試過用于win32程序可以運(yùn)行,但用于嵌入式就出錯(cuò),總提示無法解析外部符號。我把TinyXml項(xiàng)目改成是基于嵌入式平臺(tái)的就出現(xiàn)如下錯(cuò)誤: 正在刪除項(xiàng)目“tinyxml”(配置“Debug|Pocket P ...… 查看全部問答∨ |
下面是一個(gè)異步清零的同步計(jì)數(shù)器的程序,錯(cuò)誤在程序中標(biāo)出了 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter IS PORT(areset, enable, clk : IN STD_LOGIC; ...… 查看全部問答∨ |
提供S5PC100開發(fā)板 及相關(guān)產(chǎn)品定制 提供S5PC100開發(fā)板 及相關(guān)產(chǎn)品定制 S5PC100開發(fā)板 采用Samsung S5PC100 ,其core為 ARMcortex A8 iPhone 3G中采用的就是S5PC100,只是Mark不同. S5PC100集多種功能于一身,可用于平板電腦.車載電腦.無線通信、GPS、攝像頭、手機(jī)游戲、便攜式多媒體 ...… 查看全部問答∨ |
用fopen(path, \"w\");來建立文件,無論path為\"C://1.conf\"還是直接為“1.conf\",都會(huì)建立文件失敗。 不知道在tornado里,文件建立應(yīng)該用怎樣的路徑呢?… 查看全部問答∨ |
在試驗(yàn)SDIO 代碼的時(shí)候發(fā)現(xiàn)了一個(gè)明顯的運(yùn)算錯(cuò)誤: 測試環(huán)境: 2G SD 卡, STM32 IAR Assembler for ARM 4.42A (4.42.1.501) & ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 消息稱三星在美“特斯拉專供”2nm 生產(chǎn)線 2026H2 投運(yùn),初期產(chǎn)能每月 1~1.5 萬片晶圓
- 黑客如何入侵軟件定義的汽車
- 中國首款國芯腦機(jī)智能頭環(huán)正式發(fā)布:非侵入式腦機(jī) 全自主國產(chǎn)芯片
- 自動(dòng)駕駛中Transformer大模型會(huì)取代深度學(xué)習(xí)嗎?
- 這家面板廠在車載OLED領(lǐng)域或再迎新大單
- 激光雷達(dá)和攝像頭,誰會(huì)是機(jī)器人主要的“眼睛”?
- 毫米波雷達(dá)技術(shù)參數(shù)有哪些?毫米波雷達(dá)如何用于機(jī)器人導(dǎo)航
- 毫米波雷達(dá)技術(shù)有哪些優(yōu)勢?如何提高毫米波雷達(dá)測距精度
- 工業(yè)邊緣設(shè)備的安全啟動(dòng),TPM 2.0與可信執(zhí)行環(huán)境(TEE)的硬件級防護(hù)
- 工業(yè)機(jī)器人視覺系統(tǒng)的深度學(xué)習(xí)優(yōu)化,YOLOv8、3D點(diǎn)云匹配的實(shí)時(shí)性提升
- EEWORLD 示波器問卷有獎(jiǎng)大調(diào)查
- 不可錯(cuò)過的一次邂逅,TTI攜TE傳感器樣片與你相見!免費(fèi)樣片申請活動(dòng)開始啦~
- 有獎(jiǎng)直播 | 與英飛凌一同革新您的電動(dòng)汽車溫控系統(tǒng):集成熱管理系統(tǒng)(低壓側(cè))
- 有獎(jiǎng)直播 | ST25 NFC新產(chǎn)品及應(yīng)用方案介紹 報(bào)名中
- 電源情報(bào)站 MPS小程序干貨推薦,下載有好禮!3月活動(dòng)開始啦~
- TTI&TE直播:傳感器在工業(yè)電機(jī)里的發(fā)展及最新應(yīng)用
- 【摸黑搶樓】贏大禮,關(guān)于示波器的狂想曲!正式開搶!??!
- VISHAY工業(yè)電源主題月 幸運(yùn)闖關(guān)贏大獎(jiǎng)!
- 有獎(jiǎng)直播 | 德州儀器 C2000™ 系列培訓(xùn)會(huì)
- 紅外典型應(yīng)用*技術(shù)分享*趣味尋圖,帶你走進(jìn)紅外世界
- 科技向善: 所有科技公司必須遵循的新道德準(zhǔn)則
- 超大規(guī)模云計(jì)算增長需求 Ampere?啟動(dòng)亞洲合作伙伴計(jì)劃
- 助力風(fēng)電行業(yè)解決運(yùn)維難點(diǎn)
- 臺(tái)達(dá)儲(chǔ)能系統(tǒng)解決方案創(chuàng)新應(yīng)用助力工業(yè)發(fā)展
- DARPA正在開發(fā)100%安全的投票硬件平臺(tái)
- 折疊led顯示屏有望成為高端市場新寵兒
- 蘋果Siri和百度度秘的霸主之爭
- 安富利躋身2018年Gartner高科技供應(yīng)鏈25強(qiáng)
- 馬斯克等科技大佬聯(lián)名承諾不發(fā)展致命性人工智能武器系統(tǒng)
- 華為公布手機(jī)銷量 發(fā)貨量破億
- 有人開發(fā)過完整的電子產(chǎn)品嗎?
- 請教個(gè)問題
- 請問,藍(lán)牙發(fā)送數(shù)據(jù),一臺(tái)電腦接收,多個(gè)下位機(jī)發(fā)送
- 求助,24V 5A的電源設(shè)計(jì)方案
- 關(guān)于FPGA,你不得不知道的那些事
- 路燈不同時(shí)間段的開關(guān)控制
- 請問什么是PIN衰減器 PIN移相器?
- msp430的adc模塊關(guān)于負(fù)參考電壓值是多少
- 高質(zhì)量電子產(chǎn)品設(shè)計(jì)解決方案(經(jīng)典)
- 430PWM和中斷能同時(shí)用定時(shí)器A實(shí)現(xiàn)嗎