Chinaunix首页 | 论坛 | 博客
  • 博客访问: 712555
  • 博文数量: 105
  • 博客积分: 3532
  • 博客等级: 中校
  • 技术积分: 1328
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 18:57
文章分类

全部博文(105)

文章存档

2015年(1)

2014年(1)

2013年(7)

2012年(14)

2011年(21)

2010年(61)

分类: 嵌入式

2010-05-21 23:10:39

  1. 平台
    内核:linux-2.6.33.4
    交叉编译器:gcc-3.4.1,glibc-2.3.3
    硬件结构: cpu:S3C2440 DM9000A接在第3存储块,基地址为0x18000000
  2. 修改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网卡使用的资源列表。使用0x18000000、0x18000004这两个地址就可以操作DM9000网 卡。

    static struct resource s3c_dm9k_resource[] = {
     [0] = {
      .start = S3C2410_CS3, //S3C2410_CS3被定义为0x
    18000000(BANK3基地址)

      .end = S3C2410_CS3+3,
      .flags = IORESOURCE_MEM,
     },
     [1] = {
      .start = S3C2410_CS3 + 4, //0x18000004

      .end = S3C2410_CS3 + 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

  3. 修改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_bankcon3;
    #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_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3;
    oldval_bankcon3=*((volatile unsigned int *)S3C2410_BANKCON3);
    *((volatile unsigned int *)S3C2410_BANKCON3)=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_bankcon3;
    #endif

  4. 配置内核

    Device Drivers --->

      Network device support --->

        [*] Network device support --->

          Ethernet (10 or 100Mbit) --->

            <*> DM9000 support

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


阅读(1050) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~