这次说到是网卡驱动。
这个费了我很多时间。
我首先使用自带到dm9000的驱动,然后编译,下载,加载执行。到网卡驱动加载到时候(激活网卡,IP-Config),发现只是打印一句:
dm9000 Ethernet Driver, V1.31
然后就是等待。
我查看正常到启动过程,下一步应该是要打印probe中到一个信息,即dm9000注册成功,类似:
eth0: dm9000a at c8858000, c885c400 IRQ 185 MAC: aa:bb:cc:dd:ee:ff (chip)
但其中没有,我有点奇怪,probe为啥没执行到呢?
疑惑很久,先怀疑是新内核中到驱动有问题,按照老到内核中的dm9000驱动修改了一些,其实也就是初始化了mac地址,然后让从eeprom读mac地址改为一个死的地址赋值。还是不行。
然后把老到驱动直接拿过来替换,遇到很多编译问题,比如最明显一个:
//board_info_t *db = (board_info_t *) dev->priv;
board_info_t *db = netdev_priv(dev); // rings wpl add
上面的是老的代码,要修改成下面到样子,类似此处很多,需要一一修改过来,当然还有其他问题,都是类似。
这样改过以后,还是不行。
仔细思考。
仔细思考。
大概一天。
想起驱动初始化到时候,所谓中断,基地址等资源。然后想起应该有个地方初始化,当然想到了linux-03.00.01.06_baegle/arch/arm/mach-omap2/board-omap3beagle.c
原来当时用了beagle到此文件,有些东西没有添加进来,比如:
#define OMAP_DM9000_GPIO_IRQ 25
static void __init omap_dm9000_init(void)
{
if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) {
printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ/n",
OMAP_DM9000_GPIO_IRQ);
return;
}
gpio_direction_input(OMAP_DM9000_GPIO_IRQ);
}
起源是omap3_beagle_init_irq中,在最后,要添加 omap_dm9000_init() 调用。
这是中断。
资源,先是:
static struct platform_device *omap3_beagle_devices[] __initdata = {
&omap3_beagle_lcd_device,
&leds_gpio,
&keys_gpio,
&omap_dm9000_dev, // wpl add
};
涉及到:
static struct platform_device omap_dm9000_dev = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(omap_dm9000_resources),
.resource = omap_dm9000_resources,
.dev = {
.platform_data = &omap_dm9000_platdata,
},
};
再涉及到:
static struct resource omap_dm9000_resources[] = {
[0] = {
.start = OMAP_DM9000_BASE,
.end = (OMAP_DM9000_BASE + 0x4 - 1),
.flags = IORESOURCE_MEM,
},
[1] = {
.start = (OMAP_DM9000_BASE + 0x400),
.end = (OMAP_DM9000_BASE + 0x400 + 0x4 - 1),
.flags = IORESOURCE_MEM,
},
[2] = {
.start = OMAP_GPIO_IRQ(OMAP_DM9000_GPIO_IRQ),
.end = OMAP_GPIO_IRQ(OMAP_DM9000_GPIO_IRQ),
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
},
};
如果提示IRQF_TRIGGER_LOW未定义,还有其它错误,记得添加:
#include <linux/dm9000.h>
#include <linux/interrupt.h>
然后,编译,就可以了。