注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

嵌入式开发实战4——内核的编译之六DM9000网卡支持  

2012-06-12 21:54:00|  分类: ARM开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

嵌入式开发实战4——内核的编译之六DM9000网卡支持

 

今天接着网卡的部分,主要是在目标平台文件上进行修改,同时修改DM9000的驱动文件,平台文件就是前面移植的/arch/arm/mach-s3c2440/mach-mini2440.c,驱动文件是drivers/net/dm9000.c,这是今天修改的两个文件。

首先进入 mach-mini2440.c,在当中增加:

1、头文件

#include <linux/dm9000.h>

2、网卡的物理基地址:

/* DM9000AEP 10/100 ethernet controller */

#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) 

3、老一套,增加设备的平台资源设置:

static struct resource mini2440_dm9k_resource[] = {

        [0] = {

                .start = MACH_MINI2440_DM9K_BASE,

                .end   = MACH_MINI2440_DM9K_BASE + 3,

                .flags = IORESOURCE_MEM

        },

        [1] = {

                .start = MACH_MINI2440_DM9K_BASE + 4,

                .end   = MACH_MINI2440_DM9K_BASE + 7,

                .flags = IORESOURCE_MEM

        },

        [2] = {

                .start = IRQ_EINT7,

                .end   = IRQ_EINT7,

                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,

        }

};

/*

  *    *    * The DM9000 has no eeprom, and it's MAC address is set by

 *   *   * the bootloader before starting the kernel.

 *    *    */

static struct dm9000_plat_data mini2440_dm9k_pdata = {

        .flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),

};

 

static struct platform_device mini2440_device_eth = {

        .name           = "dm9000",

        .id             = -1,

        .num_resources  = ARRAY_SIZE(mini2440_dm9k_resource),

        .resource       = mini2440_dm9k_resource,

        .dev            = {

                .platform_data  = &mini2440_dm9k_pdata,

        },

};

当然还得在__initdata平台设备里增加相应的设备:

static struct platform_device *mini2440_devices[] __initdata = {

        &s3c_device_usb,

        &s3c_device_lcd,

        &s3c_device_wdt,

        &s3c_device_i2c0,

        &s3c_device_iis,

        &mini2440_device_eth,

        &s3c_device_nand,

}; 

打开DM9000驱动文件:

修改头文件包含部分

#include <asm/delay.h>

#include <asm/irq.h>

#include <asm/io.h>

 //增加红色部分

#if defined(CONFIG_ARCH_S3C2410)

#include <mach/regs-mem.h>

#endif

 

#include "dm9000.h"

然后在函数中增加红色部分:

static int __init

dm9000_init(void)

{

#if defined(CONFIG_ARCH_S3C2410)

        unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;

                unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;

        *((volatile unsigned int *)S3C2410_BWSCON) =

                        (oldval_bwscon  &  ~(3<<16))  |  S3C2410_BWSCON_DW4_16  |

S3C2410_BWSCON_WS4 |  S3C2410_BWSCON_ST4;

 

 

                *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;

#endif

                printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);

 

        return platform_driver_register(&dm9000_driver);

}

然后在static int __devinit dm9000_probe (struct platform_device *pdev) 函数中,增加对软MAC的设置,源码中好象没有,别的资料中都说要设置一下:

if (!is_valid_ether_addr(ndev->dev_addr)) {

                /* try reading from mac */

 

                mac_src = "chip";

                for (i = 0; i < 6; i++)

                        ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

        }

        ; 使用“软”MAC地址: 08:90:90:90:90:90

        memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);

 

        if (!is_valid_ether_addr(ndev->dev_addr))

                dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "

 

其实也没啥。这样就修改完成了,同样是老规矩:

       Make menuconfig

 进入到界面配置:

Device Drivers    --->Network device support    ---> Ethernet (10 or 100Mbit)    --->

大家会发现,DM9000已经被选中,其实在LINUX这个版本中默认是支持DM9000的。

下来就是编译了,首先报了几个错,发现是太马虎,写得代码和拷贝的一部分有重复,去掉,还是报有错,发现写代码时#if define漏写了#,然后再次修改,仍然报了错误:

drivers/net/dm9000.c: In function 'dm9000_init':

drivers/net/dm9000.c:1563: error: 'S3C2410_BWSCON' undeclared (first use in this function)

drivers/net/dm9000.c:1563: error: (Each undeclared identifier is reported only once

drivers/net/dm9000.c:1563: error: for each function it appears in.)

drivers/net/dm9000.c:1565: error: 'S3C2410_BANKCON4' undeclared (first use in this function)

drivers/net/dm9000.c:1569: error: 'S3C2410_BWSCON_DW4_16' undeclared (first use in this function)

drivers/net/dm9000.c:1569: error: 'S3C2410_BWSCON_WS4' undeclared (first use in this function)

drivers/net/dm9000.c:1569: error: 'S3C2410_BWSCON_ST4' undeclared (first use in this function)

drivers/net/dm9000.c:1565: warning: unused variable 'oldval_bankcon4'

make[2]: *** [drivers/net/dm9000.o] 错误

找来找去,发现在regs-mem.h中,这些宏都定义了,可能是没包含进去,再看宏定义,晕,写错了,CONFIG_ARCH_S3C2410 写成了CONFIG_ARCH_2410.真是无语。

再编译,通过。

还有一个注意的地方,在这个驱动逐个增加了,编译也要采用增量编译,不要动不动就make clean,这样节省不少时间。

认真一点儿,好不好?

更加详细的说明,请大家参考:

http://blog.chinaunix.net/space.php?uid=13321460&do=blog&id=2902457

http://blog.csdn.net/baozhongchao/article/details/4538182

特别是第一篇,从硬件上阐明了修改的原因。再次感谢无私奉献的网友。

  评论这张
 
阅读(1010)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017