本驱动移植到linux-2.6.22.2内核上,本人只是成功移植了驱动!
(不敢保证每一步都正确和必须要修改,以后慢慢参详其中的细节原理)
希望版主帮忙解释一下每一步骤的内容
转载请注明-----------------hongshaoone--------------------http://www.aiothome.com
本驱动移植参考文章:
http://blog.chinaunix.net/u1/34474/showart_400516.html http://blog.mcuol.com/User/lvembededsys/article/6856_1.htm http://blog.chinaunix.net/u2/86355/showart_1832320.html http://blog.chinaunix.net/u2/89957/showart_1845645.html 一、硬件情况
DM9000在电路板上的连接中与编程相关的如下:
1)EECS拉高:16bit模式;
2)EECK拉高,INT连接到2440 EINT7:INT脚为高时为有效中断信号,中断线为EINT7
3)cs连接到2440的nGCS2,CMD连接2440地址总线ADDR[2]:INDEX和DATA端口地址分别为0x2000_0000和0x20000004。
二、将DM9000驱动注册到内核
在arch/arm/mach-s3c2440/mach-smdk2440.c 中添加dm9000的platform_device。
//-----------------以下为添加内容
#include <linux/dm9000.h>
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = S3C2410_CS4 + 0x300,
.end = S3C2410_CS4 + 0x300 + 0x03, //
.flags = IORESOURCE_MEM
},
[1] = {
.start = S3C2410_CS4 + 0x300 + 0x04,
.end = S3C2410_CS4 + 0x300 + 0x04 + 0x3, // 0x3f
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ
}
};
片选值S3C2410_CS4,中断线IRQ_EINT7,这些值要根据你的板子电路图来设置。
static struct dm9000_plat_data s3c_device_dm9000_platdata = {
.flags= DM9000_PLATF_16BITONLY
};
struct platform_device s3c_device_dm9000 = {
.name= "dm9000",
.id= -1,
.num_resources= ARRAY_SIZE(s3c_dm9000_resource),
.resource= s3c_dm9000_resource,
.dev= {
.platform_data = &s3c_device_dm9000_platdata,
}
};
EXPORT_SYMBOL(s3c_device_dm9000);
extern struct platform_device s3c_device_dm9000;
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_dm9000, //此为添加内容
&s3c_device_iis,
};
三、使能中断
修改/driver/net/dm9000.c文件
加入:
#include <linux/irq.h>
#include <asm/arch-s3c2410/map.h>
#include <asm/arch-s3c2410/regs-mem.h>
#include <asm/arch-s3c2410/irqs.h>
#include <asm/arch-s3c2410/hardware.h>
#include <asm/arch-s3c2410/regs-gpio.h>
static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7};//设置MAC
#define DM9000_IRQ IRQ_EINT7
#include <asm-arm/arch-s3c2410/regs-gpio.h>
#define EXTINT0 (0x56000088)
#define EXTINT7_HIGHT (1<<28)
#define INTMSK (0x4A000008)
#define EXTINT7_OPEN (~(1<<4))
#define EINTMASK (0x560000a4)
//外部中断屏蔽
//外部中断方式
u32 id_val;
//------------------------dm9000_probe(struct platform_device *pdev)中加入:(以下内容为添加内容)
static void *extint0,*intmsk,*eintmsk;
unsigned int value=0;
value = __raw_readl(S3C2410_BWSCON);
value &= ~(S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4|
S3C2410_BWSCON_DW4_32);
value |= (S3C2410_BWSCON_ST4|S3C2410_BWSCON_DW4_16);
__raw_writel(value, S3C2410_BWSCON);
value=0;
value = (S3C2410_BANKCON_Tacs4 |S3C2410_BANKCON_Tcos4|
S3C2410_BANKCON_Tacc14 |S3C2410_BANKCON_Tcoh4|
S3C2410_BANKCON_Tcah4 |S3C2410_BANKCON_Tacp6|
S3C2410_BANKCON_PMCnorm);
__raw_writel(value,S3C2410_BANKCON4);
//-------------------------------------------修改MAC (此为修改内容)
for (i = 0; i < 6; i++)
ndev->dev_addr = char net_mac_addr;
//-------------------------------------------
//--------------------------------配制总线不然会100% loss (以下内容均为添加内容)
s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_EINT7); //设定GPF7为中断所用(由于GPF7多功能脚所以配制)
extint0=ioremap_nocache(EXTINT0,4);
//设定外部中断7为高电平 (要以板子而定)
writel((readl(extint0)&0x8fffffff)|EXTINT7_HIGHT,extint0);
intmsk=ioremap_nocache(INTMSK,4);
writel(readl(intmsk)&(~(1<<4)),intmsk); //
eintmsk=ioremap_nocache(EINTMASK,4);
writel(readl(intmsk)&(~(1<<7)),eintmsk);//
iounmap(intmsk);
iounmap(extint0);
iounmap(eintmsk);
ndev = alloc_etherdev(sizeof (struct board_info));
[ 此帖被hongshaoone在2009-04-01 19:19重新编辑 ]