歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Redboot 的DM9000 網卡驅動在 MINI2440平台的移植

Redboot 的DM9000 網卡驅動在 MINI2440平台的移植

日期:2017/2/28 16:19:56   编辑:Linux教程

DM9000網卡是一個目前性價比比較高的網絡芯片

在MINI2440的QEMU平台就帶有這個芯片,下面主要簡單講述一下我的移植經歷。

1. 選擇模板


這個比較簡單,但是也是最重要的。

我是這樣做的,在ecos.db中搜索DM9000,通過搜索結果就能大體的了解ecos網絡設備的構建方法。

因為本人一直做Linux開發,所以比較喜歡架構清晰的東西,不羅嗦了,看下面的結果,我們一起分析一下。

第一,是DM9000的芯片驅動

看到這裡,要做的第一件事情就是打開這個文件去看看它是做什麼的。

看到以後,就不難發現,結果和我們想象的一樣,這個是芯片驅動包含了對DM9000的寄存器設置和對協議層的掛接,

驅動支持PULL和INT兩種方式。

但是,請不要沾沾自喜,因為只有芯片驅動是不能和你的CPU配合工作的,那麼我們要怎麼做呢?

package CYGPKG_DEVS_ETH_DAVICOM_DM9000 {

alias { "Davicom DM9000 ethernet driver" dm9000_eth_driver }

hardware

directory devs/eth/davicom/dm9000

script davicom_dm9000_eth_drivers.cdl

description "Ethernet driver for Davicom DM9000 controller."

}

第二,看到這裡就有點明白了,這個是FRV的board, 繼續打開看源碼就發現這個是一個負責把芯片驅動和 具體的CPU連接的接口驅動程序,這個東西也正式我們要新編寫的。

package CYGPKG_DEVS_ETH_FRV_CB70 {

alias { "Fujitsu FR-V 405 with DM9000 ethernet driver"

devs_eth_frv_cb70 cb70_eth_driver }

hardware

directory devs/eth/frv/cb70

script cb70_eth_driver.cdl

description "Ethernet driver for Fujitsu FR-V 405 CB70 CPU card with

Davicom DM9000 ethernet interface."

}

第三,這是一個具體的應用實例,裡面可以看到放入了DM9000和接口驅動。 target mb93091 { alias { "Fujitsu MB93091 development board (FR-V 4xx,5xx)" MB93091 } packages { CYGPKG_HAL_FRV CYGPKG_HAL_FRV_MB93091 CYGPKG_IO_PCI CYGPKG_DEVS_ETH_FRV_FRV400 CYGPKG_DEVS_ETH_NS_DP83902A CYGPKG_DEVS_ETH_FRV_CB70 CYGPKG_DEVS_ETH_DAVICOM_DM9000 CYGPKG_DEVS_FLASH_FRV_FRV400 CYGPKG_DEVS_FLASH_AMD_AM29XXXXX } description " The MB93091 target provides the packages needed to run eCos on a Fujitsu MB93091 development board (FR-V 400 etc.)." } 看到這裡,我們應該知道我們的模板找到了,不是她還能是誰。 2. 按照模板創建如下模塊(ecos裡面的PKG等名字太多了,我們都叫模塊吧) package CYGPKG_DEVS_ETH_ARM_MINI2440 { alias { "Samsung MINI2440 with DM9000 ethernet driver" devs_eth_arm_mini2440 mini2440_eth_driver } hardware directory devs/eth/arm/mini2440 script mini2440_eth_driver.cdl description "Ethernet driver for Samsung MINI2440 with Davicom DM9000 ethernet interface." } target mini2440 { alias { "Samsung ARM9/MINI2440 development board" s3c2440x } packages { CYGPKG_HAL_ARM CYGPKG_HAL_ARM_ARM9 CYGPKG_HAL_ARM_ARM9_MINI2440 CYGPKG_ERROR CYGPKG_IO CYGPKG_IO_SERIAL CYGPKG_IO_SERIAL_ARM_SMDK2410 CYGPKG_IO_ETH_DRIVERS CYGPKG_DEVS_ETH_ARM_MINI2440 CYGPKG_DEVS_ETH_DAVICOM_DM9000 CYGPKG_DEVS_FLASH_ARM_MINI2440 CYGPKG_DEVS_FLASH_SST_39VFXXX } description " The MINI2440 target provides the packages needed to run eCos on Samsung S3c2440x (ARM920T) based development boards (MINI2440)." } 3.探究一下技術細節 總結下來有三點需要注意: 1)QEMU 沒有DM9000的eeprom的接口,要創建一個靜態的mac address 2)設置正確的DM9000的地址 cdl_component CYGSEM_DEVS_ETH_ARM_MINI2440_ETH0_SET_ESA { display "Set the ethernet station address" flavor bool calculated 1 description "Enabling this option will allow the ethernet station address to be forced to the value set by the configuration. This may be required if the hardware does not include a serial EEPROM for the ESA." cdl_option CYGDAT_DEVS_ETH_ARM_MINI2440_ETH0_ESA { display "The ethernet station address" flavor data default_value {"{0x08, 0x88, 0x12, 0x34, 0x56, 0x78}"} description "The ethernet station address" } } } static struct dm9000 dm9000_eth0_priv_data = { #if defined(CYGPKG_REDBOOT) && defined(CYGVAR_ETH_DM9000_REDBOOT_HOLDS_ESA_ETH0) mac_address: CYGDAT_DEVS_ETH_ARM_MINI2440_ETH0_DEFAULT_ESA, #elif defined(CYGVAR_ETH_DM9000_REDBOOT_HOLDS_ESA_ETH0) mac_address: CYGDAT_DEVS_ETH_ARM_MINI2440_ETH0_ESA, #endif io_addr: (volatile unsigned char *)0x20000300, io_data: (volatile unsigned char *)0x20000304 }; 3)加入MMU映射表 X_ARM_MMU_SECTION(0x200, 0x200, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // DM9000 4)填入DM9000 present函數 其實這個函數本來沒有特別的意義,只是用來判斷這個板子是不是有DM9000的這個芯片,不過因為某種特殊原因 QEMU需要在DM9000初始化的地方留有足夠的延時,所以我就直接放在這裡了。 雖然沒有意義,但是保證了DM9000驅動的層次機構,使得我們的DM9000芯片驅動不再需要修改了。 // Is DM9000 present? int cyg_hal_dm9000_present(void) { CYGACC_CALL_IF_DELAY_US(500); return 1; } 4.展示一下成果 這部分是本博客,一定要做的,:-)。 除了說明的確是原創,還給大家增加真實感。 說明一下: error:dm9000_mii_read:Bad register的意思是QEMU沒有dm9000 eeprom的接口, 為了保證qemu用的和實際板子是一個驅動,代碼不另作更改。 warning:NIC collision bu detected的意思是,找不到dhcp的主機的時候重啟一下chip,這個都是目前ecos 3.0以上版本自帶 DM9000驅動本身的行為。

Copyright © Linux教程網 All Rights Reserved