Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89724
  • 博文数量: 22
  • 博客积分: 2810
  • 博客等级: 少校
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 15:33
文章分类

全部博文(22)

文章存档

2011年(2)

2010年(6)

2009年(14)

我的朋友
最近访客

分类: LINUX

2009-02-20 11:26:28

   内核中自带DM9000驱动,但是里面的相关设置并不适合我们的开发板,因此需要做一点移植工作才能让它正常工作。
我移植的内核是2.6.28.7,不同版本可能有些细节不太一样,需要你自己注意一下。
移植步骤如下:
 
1.编译内核的时候,在 menuconfig 的配置选项,选中driver-->net-->10/100M net-->DM9000 support 
 

2.arch/arm/plat-s3c24xx中的devs.c中添加dm9000的platform_device。

#include

static struct resource andy_dm9000_resource[] = {

[0]= {

.start = 0x18000000,  //utu2440上接到了bank3 重要!

.end   = 0x18000003,

.flags  = IORESOURCE_MEM,

},

[1]={

.start = 0x18000004,

.end   = 0x18000007,

.flags = IORESOURCE_MEM,

},

[2]={

.start = IRQ_EINT9,

.end   = IRQ_EINT9,

.flags = IORESOURCE_IRQ,

}

};

static struct dm9000_plat_data andy_dm9000_platdata ={

.flags = DM9000_PLATF_16BITONLY,//work in 16bit mode

};

struct platform_device andy_dm9000_device = {

.name = "dm9000",

.id = -1,

.num_resources = 3,

.resource = andy_dm9000_resource,

.dev = {

.platform_data = &andy_dm9000_platdata,

}

};

EXPORT_SYMBOL(andy_dm9000_device);

 

对以上需要添加的代码我给出一点简单的说明

andy_dm9000_resources中,由于在utu2440中dm9000卡是在bank3上故它的地址为0x18000000,另,在本中该网卡被分配的中断资源是EINT9,请根据自己的情况相应修改不要照搬。

 

3.在arch/arm/plat-s3c24xx/include/plat/devs.h中 声明平台设备 andy_dm9000_device :

  extern struct platform_device andy_dm9000_device;

 

 

4.在arch/arm/mach-s3c2440/mach-smdk2440.c中将andy_dm9000_device添加到平台设备列表中(151行附近):

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c,

&s3c_device_iis,

&andy_dm9000_device, //add dm9000 by andykuo

&s3c_device_nand,

};

 

 

5.OK,经过上述努力,Dm9000设备已经成功注册进入驱动核心。下面进入driver/net/dm9000.C中,还需要做两方面的工作:设置芯片MAC地址,使能DM9000的中断。

根据2440资料。有几个地方需要设置:

1)设置GPGCON  使GPG1功能设置为EINT9 。

这可以用函数实现:s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPF3_EINT9); 

2)外部中断EXTINT1 的[6:4]位 置100 上升沿触发中断 

 

代码修改:
在dm9000.C的开始添加如下定义:
#include
static void *extint1,*intmsk;  

#define EINTMASK         (0x560000a4) //外部中断屏蔽    

#define EXTINT1          (0x5600008c) //外部中断方式

#define INTMSK           (0x4A000008) //中断屏蔽

 

在DM9000_probe函数中,register_netdev之前(1400行左右)添加如下

 

 

memcpy(ndev->dev_addr,"\0andy1",6);//设置mac地址,可以随便添个六自己字串,只要第一个字符是'\0',即可


extint1=ioremap_nocache(EXTINT1,0x0000004);
 intmsk=ioremap_nocache(INTMSK,4);   
 
 s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPG1_EINT9);  
 writel(readl(extint1)|0x40,extint1); //rising edge
 writel(readl(intmsk)&0xfff1,intmsk); 
    
iounmap(intmsk);
iounmap(extint1);

 
这样就大功告成了啊。
水平有限,如有错误,请指正
阅读(2074) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~