在linux-2.6.29.1内核中修改添加DM9000的驱动

 
具体就是按下面的步骤操作的:

1、修改DM9000平台设备
修改/arch/arm/plat-s3c24xx/common-smdk.c文件

(1)、添加要包含的头文件

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
(2)、添加DM9000的平台设备结构

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
/*DM9000*/
static struct resource s3c_dm9k_resource[]={
      [0] = {
             .start = S3C2410_CS4,    //ADDR2 = 0
             .end = S3C2410_CS4 + 3,
             .flags = IORESOURCE_MEM,
      },
      [1] = {
             .start = S3C2410_CS4 + 4,  //ADDR2 = 1
             .end = S3C2410_CS4 + 4 + 3,
             .flags = IORESOURCE_MEM,
      },
      [2] = {
             .start = IRQ_EINT7, 
             .end = IRQ_EINT7,
             .flags = IORESOURCE_IRQ,
      }
};
 
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


(3)、将DM9000平台设备加入内核设备列表中

/* devices we initialise */
 
static struct platform_device __initdata *smdk_devs[] = {
      &s3c_device_nand,
      &smdk_led4,
      &smdk_led5,
      &smdk_led6,
      &smdk_led7,
      #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
             &s3c_device_dm9k,
      #endif
};
2、修改drivers/net/dm9000.c
dm9000.c中包含dm9000_probe函数,该函数完成DM9000设备的枚举,dm9000_probe函数的介绍在《嵌入式Linux应用开发完全手册》一书中详细介绍。
(1)、添加必要的头文件
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
(2)、在dm9000_probe中设置存储器使BANK4可用,设置默认MAC地址(也可以在根文件系统启动脚本设置),添加的代码如下:
/*
 * Search DM9000 board, allocate space and register it
 */
static int __devinit
dm9000_probe(struct platform_device *pdev)
{

#if defined(CONFIG_ARCH_S3C2410)
             unsigned int oldval_bwscon; //用来保存BWSCON寄存器的值
             unsigned int oldval_bankcon4; //用来保存S3C2410_BANKCON4寄存器的值
      #endif

#if defined (CONFIG_ARCH_S3C2410)
    //设置BANK4:总线宽度为16,使能nWAIT
      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;
    //设置BANK4的时间参数
      oldval_bankcon4 = *((volatile unsigned int *)S3C2410_BANKCON4);
      *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
      #endif

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

out:
      printk("%s:not found (%d).\n",CARDNAME,ret);
      #if defined(CONFIG_ARCH_S3C2410)
      *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
      *((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
      #endif     
(3)、指定注册中断时的触发方式
dm9000_open(struct net_device *dev)
{

      irqflags |= IRQF_SHARED;
      #if defined (CONFIG_ARCH_S3C2410)
      if(request_irq(dev->irq,&dm9000_interrupt,IRQF_SHARED|IRQF_TRIGGER_RISING,dev->name,dev))
      #else
      if(request_irq(dev->irq,&dm9000_interrupt,IRQF_SHARED,dev->name,dev))
      #endif
      //if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev))
             return -EAGAIN;

}
三、在内核中增加对网卡DM9000的配置
在内核目录下执行“make menuconfig”命令进行如下的配置:
Device Drivers--->
      [*]Network device support--->
             [*]Ethernet(10 or 100Mbit)--->
                     <*>DM9000 support
[*]Networking support--->
      Networking options--->
             <*>TCP/IP networking
             <*>IP:kernel leel autoconfiguration
//增加对nfs的支持
File systems--->
      [*]Networking File Systems--->
             <*>NFS client support
             [*]NFS client support for NFS version 3
             [*]NFS client support for the NFSv3 ACL protocol extension
             [*]Boot file system on NFS
             [*]NFS server support
四、修改根文件系统启动脚本rcS
在根文件etc/init.d/rcS文件中添加如下:
echo "network interface"
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.1.230 up                 
route add default gw 192.168.1.1
 

参考的是别人的流程
我修改完成烧写内核启动
出现了
...............................................
network interface
dm9000 dm9000.0: WARNING: no IRQ resource flags set.
eth0: link down
.............................................
有兄弟遇到过这个问题吗?


 
2009-08-14,15:37:39
资料 邮件 回复 引用回复   ↑↑   ↓↓ 编辑 删除
【1楼】 aduo
积分:181
派别:
等级:------
来自:
问题解决了

[2] = { 
             .start = IRQ_EINT7,  
             .end = IRQ_EINT7, 
             .flags = IORESOURCE_IRQ, 
      } 
修改为
[2] = {
.start = IRQ_EINT7, /* 中断号*/
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING
}
就可以了,具体原因不明白。
linux真是麻烦啊
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值