DM9000驱动移植详解及问题点.docx
《DM9000驱动移植详解及问题点.docx》由会员分享,可在线阅读,更多相关《DM9000驱动移植详解及问题点.docx(39页珍藏版)》请在冰豆网上搜索。
DM9000驱动移植详解及问题点
OK6410、2.6.36内核移植,dm9000驱动移植,详细!
分类:
嵌入式学习Linux学习2012-04-2700:
543004人阅读评论(7)收藏举报
interfaceccompressionresourcesstructtable
还是先来吐槽:
本来我是在上一个星期的周末已经把Linux2.6.34.11的驱动已经成功的移植到,OK6410的开发板上的,并且能够启动主机上的NFS根文件系统,可是我在周一的时候,开始学习LCD的驱动程序, 在修改内核文件的时候,有几处错误修改,将原来自己做的2.6.34.11的内核源码搞的乱七八糟的,在这里还是自己在修改内核的时候没有提注重注释,并且没有记录下来自己的操作步骤,以至于我没办法,恢复2.6.34的内核,所以也就只能重新先开始最基础的内核移植了。
这次我选择的是2.6.36.2的内核,谁知到一开始移植就出现一大堆问题。
在这里我不得不说,飞凌开发人员对内核修改的代码,管理真的是太扯了,自己在注销任何一个设备是没有一点点注释,就把这个设备原有的线性地址分配给其它设备了,让我让我们这些菜鸟干看着一大堆的报错信息顶个什么用,真的是伤不起。
好了不乱扯了,现在开始记录。
我的开发环境是:
VMwareUbuntu10.10。
OK6410A版256M+2G的开发板。
主机系统:
XP。
Uboot:
飞凌提供的Uboot。
参考内核:
飞凌提供的Forlinx 的2.6.36.2内核
操作步骤 以下./ 均代表你的内核根目录
1、修改./Makefile191 ARCH ?
=arm //指定cpu类型,arm后面不要有空格,要不然编译是会提醒ARCH不能为一个目录
192 CROSS_COMPILE ?
=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- //指定交叉编译器的路径,按照你自己的进行指定路径
2、
先来说说nandflash的驱动涉及到的文件:
MTD通用nandflash驱动程序位置:
./drivers/mtd/nand/.nand_base.c
NANDFlash的platform设备信息:
./drivers/mtd/nand/s3c_nand.c
有了上面的依赖驱动依赖程序、接下来
修改./arch/arm/mach-s3c64xx/mach-smdk6410.c1) nandflash 驱动,修改方法
加载头文件
[cpp]viewplaincopyprint?
1.#include
2.#include
3.#include //这些头文件放在./arch/arm/plat-samsung/include/ 下面
#include
#include
#include//这些头文件放在./arch/arm/plat-samsung/include/下面
添加nand 结构体
[cpp]viewplaincopyprint?
1.// add by acanoe first
2.extern void s3c64xx_reserve_bootmem(void); //add by acanoe
3.
4.
5.struct mtd_partition ok6410_nand_part[] = {
6. {
7. .name = "Bootloader",
8. .offset = 0,
9. .size = (1 * SZ_1M),
10. .mask_flags = MTD_CAP_NANDFLASH,
11. },
12. {
13. .name = "Kernel",
14. .offset = (1 * SZ_1M),
15. .size = (5*SZ_1M) ,
16. .mask_flags = MTD_CAP_NANDFLASH,
17. },
18. {
19. .name = "User",
20. .offset = (6 * SZ_1M),
21. .size = (120*SZ_1M) ,
22. },
23. {
24. .name = "File System",
25. .offset = MTDPART_OFS_APPEND,
26. .size = MTDPART_SIZ_FULL,
27. }
28.};
29.
30.
31.static struct s3c2410_nand_set ok6410_nand_sets[] = {
32. [0] = {
33. .name = "nand",
34. .nr_chips = 1,
35. .nr_partitions = ARRAY_SIZE(ok6410_nand_part),
36. .partitions = ok6410_nand_part,
37. },
38.};
39.
40.
41.static struct s3c2410_platform_nand ok6410_nand_info = {
42. .tacls = 25,
43. .twrph0 = 55,
44. .twrph1 = 40,
45. .nr_sets = ARRAY_SIZE(ok6410_nand_sets),
46. .sets = ok6410_nand_sets,
47.};
48.//add by acanoe first
//addbyacanoefirst
externvoids3c64xx_reserve_bootmem(void);//addbyacanoe
structmtd_partitionok6410_nand_part[]={
{
.name="Bootloader",
.offset=0,
.size=(1*SZ_1M),
.mask_flags=MTD_CAP_NANDFLASH,
},
{
.name="Kernel",
.offset=(1*SZ_1M),
.size=(5*SZ_1M),
.mask_flags=MTD_CAP_NANDFLASH,
},
{
.name="User",
.offset=(6*SZ_1M),
.size=(120*SZ_1M),
},
{
.name="FileSystem",
.offset=MTDPART_OFS_APPEND,
.size=MTDPART_SIZ_FULL,
}
};
staticstructs3c2410_nand_setok6410_nand_sets[]={
[0]={
.name="nand",
.nr_chips=1,
.nr_partitions=ARRAY_SIZE(ok6410_nand_part),
.partitions=ok6410_nand_part,
},
};
staticstructs3c2410_platform_nandok6410_nand_info={
.tacls=25,
.twrph0=55,
.twrph1=40,
.nr_sets=ARRAY_SIZE(ok6410_nand_sets),
.sets=ok6410_nand_sets,
};
//addbyacanoefirst
修改 smdk6410_devices[]__initdata={
对照这个结构体 将那些进行修改,注意 by acanoe 的语句为修改重点。
[cpp]viewplaincopyprint?
1.static struct platform_device *smdk6410_devices[] __initdata = {
2.//#ifdef CONFIG_SMDK6410_SD_CH0 //Canceled by acanoe
3. &s3c_device_hsmmc0,
4.//#endif //Canceled by acanoe
5.//#ifdef CONFIG_SMDK6410_SD_CH1 //Canceled by acanoe
6. &s3c_device_hsmmc1,
7.//#endif //Canceled by acanoe
8. &s3c_device_i2c0,
9.// &s3c_device_i2c1, //Canceled by acanoe
10. &s3c_device_fb,
11. &s3c_device_ohci,
12. &s3c_device_usb_hsotg,
13.// &s3c64xx_device_iisv4, //Canceled by acanoe
14.// &samsung_device_keypad, //Canceled by acanoe
15.// add by acanoe 2
16. &s3c_device_nand,
17.
18.
19.#ifdef CONFIG_DM9000
20. &s3c_device_dm9000,
21.#endif
22.// add by acanoe 2
23.
24.
25.
26.
27.#ifdef CONFIG_REGULATOR
28. &smdk6410_b_pwr_5v,
29.#endif
30. &smdk6410_lcd_powerdev,
31.
32.
33.// &smdk6410_smsc911x, // Canceled by acanoe
34. &s3c_device_adc,
35.// &s3c_device_cfcon, // Canceled by acanoe
36. &s3c_device_rtc,
37.// &s3c_device_ts, // Canceled by acanoe
38.// &s3c_device_wdt,
39.};
staticstructplatform_device*smdk6410_devices[]__initdata={
//#ifdefCONFIG_SMDK6410_SD_CH0//Canceledbyacanoe
&s3c_device_hsmmc0,
//#endif//Canceledbyacanoe
//#ifdefCONFIG_SMDK6410_SD_CH1//Canceledbyacanoe
&s3c_device_hsmmc1,
//#endif//Canceledbyacanoe
&s3c_device_i2c0,
//&s3c_device_i2c1,//Canceledbyacanoe
&s3c_device_fb,
&s3c_device_ohci,
&s3c_device_usb_hsotg,
//&s3c64xx_device_iisv4,//Canceledbyacanoe
//&samsung_device_keypad,//Canceledbyacanoe
//addbyacanoe2
&s3c_device_nand,
#ifdefCONFIG_DM9000
&s3c_device_dm9000,
#endif
//addbyacanoe2
#ifdefCONFIG_REGULATOR
&smdk6410_b_pwr_5v,
#endif
&smdk6410_lcd_powerdev,
//&smdk6410_smsc911x,//Canceledbyacanoe
&s3c_device_adc,
//&s3c_device_cfcon,//Canceledbyacanoe
&s3c_device_rtc,
//&s3c_device_ts,//Canceledbyacanoe
//&s3c_device_wdt,
};
对照这个结构体 将那些进行修改,注意 by acanoe 的语句为修改重点。
//addbyacanoe2
&s3c_device_nand,//这一语句为添加nand 设备语句
#ifdefCONFIG_DM9000
&s3c_device_dm9000, //addbyacanoe
#endif
//&smdk6410_smsc911x,//Canceledbyacanoe
在smdk6410_machine_init()
//在smdk6410_machine_init()结构体中加上
//addbyacanoe
s3c_nand_set_platdata(&ok6410_nand_info);
//addbyacanoe
3、copy./include copy./.config copy./arch/arm/plat-samsung/include
这三项都是指:
从飞凌提供的内核将他们的include库拷贝的你的内核当中 ,拿来主义。
这样做的有点是你可以只先学习驱动移植,和系统移植的方法,而不是其语句的实现。
确定也是优点的相对。
在这里极有可能会因为你include 的更新而产生一些写的错误 如在飞凌自定义的 _ts_中也就是触摸屏的去的是他们自己修改的。
可能会因此报错,解决办法,就是Canceled掉 所有的有关触摸屏的驱动,都注释掉。
其实到这里,如果内不是要NFS 挂载根文件系统的话,内核移植工作已经完成。
不过这只针对飞凌的开发板来说,如果你是其他厂家的开发板,在下面的几个知识点,不得不提及一下:
3.1)给内核打上yaffs2文件系统补丁,在这里尽量选用较新的补丁,因为旧版补丁,在编译的时候会报错,
下载连接http:
//www.aleph1.co.uk/gitweb?
p=yaffs2.git;a=summary,直接点击,点那个2011年6月28号的那个版本,点击最右边的SNAPSHOT下载,这个是目前较新的的YAFFS2的源码了
3.2)修改机器号,这一步飞凌的开发板并不用操作,因为飞凌的Uboot和内核都默认使用smdk6410,的ID来进行参数传递(典型的修改注意)。
机器号修改依赖文件目录:
uboot-2011.3机器码路径:
arch/arm/include/asm/mach-types.h
飞凌体统的Uboot为旧版的Uboot它的机器码定义路径为:
include/asm-arm/mach-types.h
其中smdk6410的自己码被定义在 include/configs/smdk6410.h 定义为
#defineMACH_TYPE1626
2.6.36.2内核机器码定义路径为 arch/arm/tools/mach-types
smdky410 MACH_SMDK6410 SMDK6410 1626
以上U-boot和内核ID信息都属于smdk6410板载默认信息不用修改。
3.3)配置内核,make menuconfig
因为直接copy飞凌源码的.config文件到自己的根目录,所以配置起来比较简单。
只要注意nandflash 驱动是否被选中即可:
DeviceDrivers--->
<*>MemoryTechologyDevice(MTD)support --->
<*>NANDDeviceSupport--->
<*>NANDFlashsupportforS3CSoC
二、加载dm9000驱动。
4、加载dm9000驱动,我自己更加喜欢NFS挂载根文件系统所以内核要移植dm9000网卡的驱动。
copy drivers/net/dm9000 //copy飞凌源码到目标内核,其实这一步可以不做,因为dm9000驱动为通用驱动,这里copy也是没有必要。
4.1)修改arch/arm/mach-s3c6410/mach-smdk6410.c
添加头文件#incude
添加dm9000结构体。
[cpp]viewplaincopyprint?
1.//add by acanoe dm9000
2./* Ethernet */
3.#define S3C64XX_PA_DM9000 (0x18000000)
4.#define S3C64XX_SZ_DM9000 SZ_1M
5.#define S3C64XX_VA_DM9000 S3C_ADDR(0x03b00300)
6.
7.
8.static struct resource dm9000_resources[] = {
9. [0] = {
10. .start = S3C64XX_PA_DM9000,
11. .end = S3C64XX_PA_DM9000 + 3,
12. .flags = IORESOURCE_MEM,
13. },
14. [1] = {
15. .start = S3C64XX_PA_DM9000 + 4,
16. .end = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,
17. .flags = IORESOURCE_MEM,
18. },
19. [2] = {
20. .start = IRQ_EINT(7),
21. .end = IRQ_EINT(7),
22. .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
23. },
24.};
25.
26.
27.static struct dm9000_plat_data dm9000_setup = {
28. .flags = DM9000_PLATF_16BITONLY,
29. .dev_addr = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },
30.};
31.
32.
33.static struct platform_device s3c_device_dm9000 = {
34. .name = "dm9000",
35. .id = 0,
36. .num_resources = ARRAY_SIZE(dm9000_resources),
37. .resource = dm9000_resources,
38. .dev = {
39. .platform_data = &dm9000_setup,
40. }
41.};
42.//#ifdef CONFIG_DM9000
43.//add by acanoe dm9000
//addbyacanoedm9000
/*Ethernet*/
#defineS3C64XX_PA_DM9000(0x18000000)
#defineS3C64XX_SZ_DM9000SZ_1M
#defineS3C64XX_VA_DM9000S3C_ADDR(0x03b00300)
staticstructresourcedm9000_resources[]={
[0]={
.start=S