DM9000网卡驱动移植(linux-2.6.29mini2440)

1.修改arch/arm/plat-s3c24xx/common-smdk.c文件

在包含头文件的区域增加以下代码:

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif

在smdk_devs结构体之前添加以下代码:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)

//DM9000网卡使用的资源列表。使用0x20000000、0x20000004这两个地址就可以操作DM9000网卡。
static struct resource s3c_dm9k_resource[] = {
 [0] = {
  .start = S3C2410_CS4,           //S3C2410_CS4被定义为0x20000000(BANK4基地址) 
  .end   = S3C2410_CS4+3,      
  .flags = IORESOURCE_MEM,
 },
 [1] = {
  .start = S3C2410_CS4 + 4,    //0x20000004
  .end   = S3C2410_CS4 + 4 + 3,
  .flags = IORESOURCE_MEM,
 },
 [2] = {
  .start = IRQ_EINT7,               //连接S3C2440的EINT7引脚
  .end   = IRQ_EINT7,
  .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,    //上升沿触发
 }

};

//DM9000与开发板相关的数据,指定访问DM9000时,数据位宽为16
static struct dm9000_plat_data s3c_dm9k_platdata = {
 .flags  = DM9000_PLATF_16BITONLY,
};

static struct platform_device s3c_device_dm9k = {
 .name  = "dm9000",
 .id  = 0,
 .num_resources = ARRAY_SIZE(s3c_dm9k_resource),
 .resource = s3c_dm9k_resource,
 .dev  = {
  .platform_data = &s3c_dm9k_platdata,
 }
};
#endif

在smdk_devs结构体中添加以下代码:

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
 &s3c_device_dm9k,
#endif

2.修改drivers/net/dm9000.c文件

在包含头文件区域添加以下代码

#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif

dm9000_probe函数中的变量声明之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 unsigned int oldval_bwscon;
 unsigned int oldval_bankcon4;
#endif

在dev_dbg(&pdev->dev, "dm9000_probe()\n");语句之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 oldval_bwscon=*((volatile unsigned int *)S3C2410_BWSCON);
 *((volatile unsigned int *)S3C2410_BWSCON)=(oldval_bwscon & ~(3<<16))| S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
oldval_bankcon4=*((volatile unsigned int *)S3C2410_BANKCON4);
*((volatile unsigned int *)S3C2410_BANKCON4)=0x1f7c;
#endif

将platform_set_drvdata(pdev, ndev);之前的if判断语句改为:

if (!is_valid_ether_addr(ndev->dev_addr))
 {
  dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
    "set using ifconfig\n", ndev->name);
  #if defined(CONFIG_ARCH_S3C2410)
  printk("Now use the default MAC address: 08:90:90:90:90:90\n");
  ndev->dev_addr[0]=0x08;
  ndev->dev_addr[1]=0x90;
  ndev->dev_addr[2]=0x90;
  ndev->dev_addr[3]=0x90;
  ndev->dev_addr[4]=0x90;
  ndev->dev_addr[5]=0x90;
  #endif
 }

在dev_err(db->dev, "not found (%d).\n", ret);之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 *((volatile unsigned int *)S3C2410_BWSCON)=oldval_bwscon;
 *((volatile unsigned int *)S3C2410_BWSCON)=oldval_bankcon4;
#endif

3.配置内核

Device Drivers --->

  Network device support --->

    [*] Network device support --->

      Ethernet (10 or 100Mbit) --->

        <*> DM9000 support

4.测试一下能否ping通主机:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值