2410+linux2.6 dm9000驱动移植 笔记
时间:2009-04-08 来源:guliangzeng
|
第一步:在arm/arm/mach-s3c2410/devs.c 文件中添加如下代码 //----------------------------------------------------------- static struct resource s3c_dm9000_resource[] = { [0] = { .start = 0x08000000 + 0x300, .end = 0x08000000 + 0x300 + 0x03, .flags = IORESOURCE_MEM }, [1] = { .start = 0x08000000 + 0x300 + 0x04, .end = 0x08000000 + 0x300 + 0x04 + 0x3, // 0x3f .flags = IORESOURCE_MEM }, [2] = { .start = IRQ_EINT0, .end = IRQ_EINT0, .flags = IORESOURCE_IRQ } }; 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); //----------------------------------------------------- 第二步:在 arm/arm/mach-s3c2410/devs.h 文件中 添加如下一行 extern struct platform_device s3c_device_dm9000; //---------------------------------------------------------------- 第三步:在 arm/arm/mach-s3c2410/mach-smdk2410.c 文件中的*smdk2410_devices[] __initdata 添加&s3c_device_dm9000,//for dm9000 如下所示: static struct platform_device *smdk2410_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, &s3c_device_dm9000,//for dm9000 }; //---------------------------------------------------------------- 第四步:在内核自带的dm9000网卡驱动源码driver/net/dm9000.c中添加下面两行 定义 #define INTMOD (0x4A000004) static void *intmod; 在driver/net/dm9000.c 的 static int dm9000_probe(struct device *dev) 函数中添加下面两行: intmod=ioremap_nocache(INTMOD,0x0000004); writel(0x0,intmod);
6. 5. 修改driver/net/dm9000.c 加入几个头文件,后面有用
1. #include <asm-arm/arch/irqs.h>
#include <asm-arm/arch/hardware.h>
#include <asm-arm/arch/regs-gpio.h> 在probe函数中加入
1. unsigned char ne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};//yangdk 然后在大约640行(我的改动比较多,不记得原来的行号了)左右的地方修改
这是手动修改网卡的MAC地址,在上面的数组中自己随便填入,不要是全0或者全1就行。
到此为止,网卡可以发现了,也能配上IP,但是ping不同其他主机。是初始化的问题,继续
6. 在probe函数中加入这部分代码 K,经过上述努力,Dm9000设备已经成功注册进入驱动核心。下面进入driver/net/dm9000.C中,还需要做两方面的工作:设置芯片MAC地址,使能DM9000的中断。 根据2410资料。有几个地方需要设置: 1)GPFCON (56000050) GPF7 [15:14] 置 0 ,功能设置为EINT0 。 这可以用函数实现:s3c2410_gpio_cfgpin(S3C2410_GPF0, S3C2410_GPF0_EINT0); 2)EXTINT0 (56000088) [30:28] 置0 上升沿触发中断 (复位默认为全0,可能不必设) 3)外部中断屏蔽寄存器。EINTMASK (560000a4) [0] 置0 以enable interrupt EINT0 4)全局中断屏蔽寄存器 INTMASK (4A000008) [3] 置0 使能EINT0。 代码修改: 1
2.
3. static void *bwscon,*bankcon4,*bankcon5;
4. static void *gpfcon,*gpfcon1;
5. static void *extint0,*extint01;
6. static void *intmsk;
7. static void *dsc0,*dsc1;
8. #define BWSCON (0x48000000)
9. //#define BANKCON4 (0x48000014)
10. //#define BANKCON5 (0x48000018)
11.
12. #define GPFCON (0x56000050)
13. #define GPFUP (0x56000058)
14.// #define EXTINT0 (0x5600008C)
15. #define EXTINT01 (0x56000088)
16. #define INTMSK (0x4A000008)
17. #define DSC0 0x560000c4)
18. #define DSC1 (0x560000c8)
19.
在probe中
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ne_def_eth_mac_addr[i];
20. bwscon=ioremap_nocache(BWSCON,0x0000004);
21. extint01=ioremap_nocache(EXTINT01,0x0000004);//
22. gpfcon=ioremap_nocache(GPFCON,0x0000004);
gpfup=ioremap_nocache(GPFUP,0x0000004); 23. intmsk=ioremap_nocache(INTMSK,0x0000004);
24. // dsc1=ioremap_nocache(DSC1,0x0000004);
25.
26. writel(readl(bwscon)|0xc0,bwscon); 27. //writel(readl(dsc1)|(0xf<<8),dsc1);
//s3c2410_gpio_cfgpin(S3C2410_GPF0, S3C2410_GPF0_EINT0); 28. writel(readl(gpfcon)|(0x1<<1),gpfcon); writel(readl(gpfup)|0x1,gpfup);
29.
30.
writel(readl(extint01)|(1<<2),extint01); //eint0 rise edgen 31. writel(readl(intmsk)&(~0x1),intmsk); //
相关阅读 更多 +