分类: LINUX
2009-05-07 15:31:09
一个数字问题,花费两天时间,真顶不顺。如果这个所谓的革新公司提供实验板的原理图就好了,可惜...我怀疑他们的板都不知从那里抄来的,也确实佩服他们的销售和我们学校的领导,多么成功的交易啊...
好,问题解决,留下笔记。Linux 2.6.19.2 ,参考 mach-vr1000.c 和网上众多例子...
vi arch/arm/mach-s3c2410/mach-smdk2410.c ,加入:
static struct resource s3c_d9k_resource[] = {
[0] = {
.start = 0x0A000000 + 0x300,
.end = 0x0A000000 + 0x300 + 0x03,
.flags = IORESOURCE_MEM
},
[1] = {
.start = 0x0A000000 + 0x300 + 0x4,
.end = 0x0A000000 + 0x300 + 0x4 + 0x7f,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT0,
.end = IRQ_EINT0,
.flags = IORESOURCE_IRQ
}
};
static struct dm9000_plat_data s3c_device_d9k_platdata = {
.flags= DM9000_PLATF_16BITONLY
};
struct platform_device s3c_device_d9k = {
.name= "dm9000",
.id= 0,
.num_resources= ARRAY_SIZE(s3c_d9k_resource),
.resource= s3c_d9k_resource,
.dev= {
.platform_data = &s3c_device_d9k_platdata,
}
};
修改static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_d9k
};
红色部分是关键,网上的 vr1000.c 和网上大多例子此处都为0x40。经查证,是因为DM9000A的地址线和数据线是复用的,它是通过92脚(CMD)来区分。如果CMD接到s3c2410的A2脚, 则数据端口的地址 = 地址端口 + 0x04 。那如果是0x40的话,他的CMD应该是接到s3c2410的A7脚。
奇怪的是 DM9000 在u-boot下也算工作正常,翻查代码,原来有这么两句:
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
唉,一切只能怪自己不仔细,客观的说,是经验不足 ^_^
哈哈,无论如何,终于摆脱 read wrong id 的恶梦,可是,马上又遇到可恶的 IRQ_EINT0 ,一申请0号中断就死机...