分类: LINUX
2009-03-27 20:45:58
Dm9000 移植:
主要以各自的开发板,以及DM的引脚连线.
第一要确定数据地址,第二要确定命令地址,第三要确定中断是低还是高有效.
以mini2440为例:
我自己的开发板DM是连在nGCS4的.
所以其数据地址就为:2000 0000(当然可以是nGCS4内的其他地址,不要走出nGCS4就行了)
而DM的CMD是连在ADDR2上的
所以命令是地址就是:2000 00020
中断是高是低有效由开发板 ,还有设置而定的.
Interrupt request
This pin is high active at default,its polarity can be modified by EEPROM setting or strap pin MDC
上面是DM手册所说的(手册里打进INT就可以搜到),也就是中断默许是高电平有效的,如果MDC脚被拉到高电平 那么就是低电平有效,
当然也可以在EEPROM中设定.我自己的板MDC是没有接空的,所以是高电平有效.
2.在arch/arm/mach-s3c2440/mach-smdk2440.c 中添加dm9000的platform_device。
#include
static struct resource dm9000_resource[] = {
[0]= {
.start = 0x20000000
.end = 0x20000000
.flags = IORESOURCE_MEM,
},
[1]={
.start = 0x20000020
.end = 0x20000020
.flags = IORESOURCE_MEM,
},
[2]={
.start = IRQ_EINT7,
.end = IRQ_EINT7,//我的是连在7号中断线上的
.flags = IORESOURCE_IRQ,
}
};
static struct dm9000_plat_data dm9000_platdata ={
.flags = DM9000_PLATF_16BITONLY,//work in 16bit mode //要以自己的开的板设定 我的是工作在16位的
};
struct platform_device eievk_dm9000_device = {
.name = "dm9000",
.id = -1,
.num_resources = 3,
.resource = dm9000_resource,
.dev = {
.platform_data = & dm9000_platdata,
}
};
EXPORT_SYMBOL(eievk_dm9000_device);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接下就是使IRQ_EINT7高是平有效(你的呢?)
开外部中断.
Dm9000.c中
加入:
#include
#define EXTINT0 (0x56000088)
#define EXTINT7_HIGHT (1<<28)
#define INTMSK (0x4A000008)
#define EXTINT7_OPEN (~(1<<4))
#define EINTMASK (0x560000a4)
//外部中断屏蔽
//外部中断方式
static int __devinit
dm9000_probe(struct platform_device *pdev)中加入:
u32 id_val;
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);
//配制总线 不然会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);
//开外部中断7
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));
//////////////
启动以后就可以ifconfig eth0 IP来配制.
这里会有这样的消息说什么ipq flags not set 这个没有什么事的.
chinaunix网友2010-01-10 14:07:38
请问博主, .end = IRQ_EINT7,//我的是连在7号中断线上的 这句话的意思是说,你的dm9000的INT脚连接到了cpu的gpio7上面吗?? 7号中断线是什么意思?