1、DM9000驱动移植详解及问题点OK6410、2.6.36内核移植,dm9000 驱动移植,详细! 分类: 嵌入式学习 Linux学习 2012-04-27 00:54 3004人阅读 评论(7) 收藏 举报 interfaceccompressionresourcesstructtable 还是先来吐槽: 本来我是在上一个星期的周末已经把 Linux2.6.34.11 的驱动已经成功的移植到, OK6410 的开发板上的,并且能够启动主机上的NFS 根文件系统, 可是我在周一的时候,开始学习LCD 的驱动程序, 在修改内核文件的时候,有几处错误修改,将原来自己做的2.6.34.11 的内核源
2、码 搞的乱七八糟的,在这里还是自己在修改内核的时候没有提注重注释, 并且没有记录下来自己的操作步骤,以至于我没办法,恢复2.6.34 的内核, 所以也就只能重新先开始最基础的内核移植了。 这次我选择的是2.6.36.2 的内核, 谁知到一开始移植就出现一大堆问题。在这里我不得不说,飞凌开发人员对内核修改的代码,管理真的是太扯了,自己在注销任何一个设备是没有一点点注释,就把这个设备原有的线性地址分配给其它设备了,让我让我们这些菜鸟干看着一大堆的报错信息顶个什么用, 真的是伤不起。好了不乱扯了,现在开始记录。我的开发环境是:VMware Ubuntu 10.10 。OK6410 A版 256M+2
3、G 的开发板。 主机系统: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、先来说说nand flash 的驱动涉及到的文件:MTD 通用nand flash 驱动程序位置:.
4、/drivers/mtd/nand/.nand_base.cNAND Flash 的 platform 设备信息: ./drivers/mtd/nand/s3c_nand.c有了上面的依赖驱动依赖程序 、接下来 修改./arch/arm/mach-s3c64xx/mach-smdk6410.c 1) nandflash 驱动,修改方法加载头文件 cpp view plaincopyprint?1. #include 2. #include 3. #include/这些头文件放在./arch/arm/plat-samsung/include/下面#include #include #includ
5、e /这些头文件放在./arch/arm/plat-samsung/include/ 下面添加nand 结构体 cpp view plaincopyprint?1. /addbyacanoefirst 2. externvoids3c64xx_reserve_bootmem(void);/addbyacanoe 3. 4. 5. structmtd_partitionok6410_nand_part=6. 7. .name=Bootloader,8. .offset=0,9. .size=(1*SZ_1M),10. .mask_flags=MTD_CAP_NANDFLASH,11. ,12.
6、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=FileSystem,25. .offset=MTDPART_OFS_APPEND,26. .size=MTDPART_SIZ_FULL,27. 28. ;29. 30. 31. staticstructs3c2410_nand_setok
7、6410_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. staticstructs3c2410_platform_nandok6410_nand_info=42. .tacls=25,43. .twrph0=55,44. .twrph1=40,45. .nr_sets=ARRAY_SIZE(ok6410_nand_sets),46. .sets
8、=ok6410_nand_sets,47. ;48. /addbyacanoefirst/ add by acanoe firstextern void s3c64xx_reserve_bootmem(void); /add by acanoestruct mtd_partition ok6410_nand_part = .name = Bootloader, .offset = 0, .size = (1 * SZ_1M), .mask_flags = MTD_CAP_NANDFLASH, , .name = Kernel, .offset = (1 * SZ_1M), .size = (5
9、*SZ_1M) , .mask_flags = MTD_CAP_NANDFLASH, , .name = User, .offset = (6 * SZ_1M), .size = (120*SZ_1M) , , .name = File System, .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, ;static struct s3c2410_nand_set ok6410_nand_sets = 0 = .name = nand, .nr_chips = 1, .nr_partitions = ARRAY_SIZE(ok641
10、0_nand_part), .partitions = ok6410_nand_part, ,;static struct s3c2410_platform_nand ok6410_nand_info = .tacls = 25, .twrph0 = 55, .twrph1 = 40, .nr_sets = ARRAY_SIZE(ok6410_nand_sets), .sets = ok6410_nand_sets,;/add by acanoe first修改 smdk6410_devices _initdata = 对照这个结构体 将那些进行修改,注意 by acanoe 的语句为修改重点
11、。cpp view plaincopyprint?1. staticstructplatform_device*smdk6410_devices_initdata=2. /#ifdefCONFIG_SMDK6410_SD_CH0/Canceledbyacanoe 3. &s3c_device_hsmmc0,4. /#endif/Canceledbyacanoe 5. /#ifdefCONFIG_SMDK6410_SD_CH1/Canceledbyacanoe 6. &s3c_device_hsmmc1,7. /#endif/Canceledbyacanoe 8. &s3c_device_i2c
12、0,9. /&s3c_device_i2c1,/Canceledbyacanoe 10. &s3c_device_fb,11. &s3c_device_ohci,12. &s3c_device_usb_hsotg,13. /&s3c64xx_device_iisv4,/Canceledbyacanoe 14. /&samsung_device_keypad,/Canceledbyacanoe 15. /addbyacanoe2 16. &s3c_device_nand,17. 18. 19. #ifdefCONFIG_DM9000 20. &s3c_device_dm9000,21. #end
13、if 22. /addbyacanoe2 23. 24. 25. 26. 27. #ifdefCONFIG_REGULATOR 28. &smdk6410_b_pwr_5v,29. #endif 30. &smdk6410_lcd_powerdev,31. 32. 33. /&smdk6410_smsc911x,/Canceledbyacanoe 34. &s3c_device_adc,35. /&s3c_device_cfcon,/Canceledbyacanoe 36. &s3c_device_rtc,37. /&s3c_device_ts,/Canceledbyacanoe 38. /&
14、s3c_device_wdt, 39. ;static struct platform_device *smdk6410_devices _initdata = /#ifdef CONFIG_SMDK6410_SD_CH0 /Canceled by acanoe &s3c_device_hsmmc0,/#endif /Canceled by acanoe/#ifdef CONFIG_SMDK6410_SD_CH1 /Canceled by acanoe &s3c_device_hsmmc1,/#endif /Canceled by acanoe &s3c_device_i2c0,/ &s3c_
15、device_i2c1, /Canceled by acanoe &s3c_device_fb, &s3c_device_ohci, &s3c_device_usb_hsotg,/ &s3c64xx_device_iisv4, /Canceled by acanoe/ &samsung_device_keypad, /Canceled by acanoe/ add by acanoe 2 &s3c_device_nand,#ifdef CONFIG_DM9000 &s3c_device_dm9000,#endif/ add by acanoe 2#ifdef CONFIG_REGULATOR
16、&smdk6410_b_pwr_5v,#endif &smdk6410_lcd_powerdev,/ &smdk6410_smsc911x, / Canceled by acanoe &s3c_device_adc,/ &s3c_device_cfcon, / Canceled by acanoe &s3c_device_rtc,/ &s3c_device_ts, / Canceled by acanoe/ &s3c_device_wdt,;对照这个结构体 将那些进行修改,注意 by acanoe 的语句为修改重点。/ add by acanoe 2&s3c_device_nand, /这一语
17、句为添加nand 设备语句#ifdef CONFIG_DM9000&s3c_device_dm9000, / add by acanoe#endif/ &smdk6410_smsc911x,/ Canceled by acanoe 在smdk6410_machine_init()/在smdk6410_machine_init() 结构体中加上/add by acanoes3c_nand_set_platdata(&ok6410_nand_info);/add by acanoe3、copy ./include copy ./.config copy ./arch/arm/plat-samsun
18、g/include这三项都是指: 从飞凌提供的内核将 他们的include 库拷贝的你的内核当中 ,拿来主义。这样做的有点是你可以只先学习驱动移植 ,和系统移植的方法,而不是其语句的实现。确定也是优点的相对。在这里极有可能会因为你include 的更新而产生一些写的错误 如在飞凌自定义的 _ts_ 中也就是 触摸屏的去的是他们自己修改的。可能会因此报错,解决办法,就是Canceled 掉 所有的 有关触摸屏的驱动,都注释掉。其实到这里,如果内不是要NFS 挂载根文件系统的话,内核移植工作已经完成。不过这只针对飞凌的开发板来说, 如果你是其他厂家的开发板,在下面的几个知识点,不得不提及一下:3.
19、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
20、-types.h飞凌体统的Uboot为 旧版的Uboot 它的 机器码定义路径为:include/asm-arm/mach-types.h其中 smdk6410 的自己码被定义在 include/configs/smdk6410.h 定义为#define MACH_TYPE 16262.6.36.2 内核机器码定义路径为 arch/arm/tools/mach-typessmdky410 MACH_SMDK6410 SMDK6410 1626以上 U-boot 和 内核 ID 信息 都属于smdk6410 板载 默认信息不用修改。3.3) 配置内核, make menuconfig因为直接co
21、py 飞凌源码的.config 文件到自己的根目录,所以配置起来比较简单。只要注意nand flash 驱动是否被选中即可:Device Drivers - Memory Techology Device (MTD) support - NAND Device Support - NAND Flash support for S3C SoC二 、 加载dm9000 驱动。4、加载dm9000驱动, 我自己更加喜欢NFS 挂载根文件系统 所以内核要移植dm9000 网卡的驱动。copy drivers/net/dm9000 /copy 飞凌源码 到目标内核, 其实这一步可以不做,因为 dm900
22、0 驱动为通用驱动,这里copy 也是没有必要。4.1) 修改arch/arm/mach-s3c6410/mach-smdk6410.c添加头文件 #incude 添加dm9000 结构体。cpp view plaincopyprint?1. /addbyacanoedm9000 2. /*Ethernet*/3. #defineS3C64XX_PA_DM9000(0x18000000) 4. #defineS3C64XX_SZ_DM9000SZ_1M 5. #defineS3C64XX_VA_DM9000S3C_ADDR(0x03b00300) 6. 7. 8. staticstructre
23、sourcedm9000_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=IORESOU
24、RCE_IRQ|IRQF_TRIGGER_HIGH,23. ,24. ;25. 26. 27. staticstructdm9000_plat_datadm9000_setup=28. .flags=DM9000_PLATF_16BITONLY,29. .dev_addr=0x08,0x90,0x00,0xa0,0x90,0x90,30. ;31. 32. 33. staticstructplatform_devices3c_device_dm9000=34. .name=dm9000,35. .id=0,36. .num_resources=ARRAY_SIZE(dm9000_resourc
25、es),37. .resource=dm9000_resources,38. .dev=39. .platform_data=&dm9000_setup,40. 41. ;42. /#ifdefCONFIG_DM9000 43. /addbyacanoedm9000/add by acanoe dm9000/* Ethernet */#define S3C64XX_PA_DM9000 (0x18000000)#define S3C64XX_SZ_DM9000 SZ_1M#define S3C64XX_VA_DM9000 S3C_ADDR(0x03b00300)static struct resource dm9000_resources = 0 = .start = S