Welcome 微信登录

首页 / 操作系统 / Linux / Redboot 的DM9000 网卡驱动在 MINI2440平台的移植

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 FujitsuMB93091 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 address2)设置正确的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); // DM90004)填入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驱动本身的行为。Linux 下 Firefox 3.6.15 Flash player 10 崩溃问题记录RHEL6 无线网卡的安装与配置相关资讯      Linux驱动 
  • Linux的WDT(watchdog)驱动  (07/23/2015 10:25:38)
  • Linux最简单的驱动编写及测试流程  (05/23/2015 09:25:33)
  • AMD统一Linux开源和闭源驱动  (10/09/2014 16:36:05)
  • 在Linux上安装闭源驱动程序、媒体  (07/21/2015 15:13:14)
  • AMD催化剂Linux驱动打败Windows驱  (01/04/2015 14:26:27)
  • Linux驱动的两种加载方式过程分析  (06/23/2014 08:55:19)
本文评论 查看全部评论 (0)
表情: 姓名: 字数