這次說到是網卡驅動。
這個費了我很多時間。
我首先使用內建到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>
然後,編譯,就可以了。