接触ARM这么久其实还没真正的进入linux的学习路程,从今天起就开始全心来学习linux驱动了。大致学习策略如下:主参考资料为《mini2440_linux移植开发实战指南》这个可以从友善的论坛上下载,本手册基本移植大多数linux驱动,而且学有相当的部分是有原理讲解了,包括mtd驱动,网卡驱动,LCD驱动,触摸屏驱动,SD卡驱动,音频驱动,还有一些其它的小驱动。先按照手册的一步一步的去做,看到效果后然后再去找相关资料,分析其驱动框架,把这些驱动源代码看个烂熟。
今日任务是第三章 移植linux和nand-flash驱动,这里面按照手册来走并不能走通,需要做以下的一些改动,也先回顾一下步骤,需要改动的地方再说。
一:移植步骤
1:第一步 仍然是修改顶层的makefile文件以指定平台的交叉编译工具
2:make menuconfig ,arch/arm/mach-s3c2440/Kconfig,arch/arm/mach-s3c2440/Makefile,.config,这四者的关系
Kconfig就是menuconfig中的内容来源,在menuconfig中选中了某项也就会在.config中体现出来,而makefile中则根据选项来决定某项
如我现在要将arch/arm/mach-s3c2440/mach-mini2440.c编译进内核,首先要做Kconfig中增加其选项
config MACH_MINI2440
bool "MINI2440 development board"
.
.
更多内容不再列出。然后make menuconfig 在
System Type --->
S3C2440 Machines --->
[*] MINI2440 development board
如果选中了此项,在顶层的.config文件中就会有
CONFIG_MACH_MINI2440 = y
再在makefile中添加
obj-$(CONFIG_MACH_MINI2440) += mach-2440.o
这样makefile再读取.config时发现CONFIG_MACH_MINI2440为y就会把mach-2440.c编译进来。
这个过程还算比较清楚,如果你自己在arch/arm/mach-s3c2440/写了一个征对你自己开发板c文件,yourboard.c那可以把该目录下的makefile中的
obj-$(CONFIG_MACH_MINI2440) += mach-2440.o改成
obj-$(CONFIG_MACH_MINI2440) += yourboard.o即可
这里也就是将mach-smdk2440.c复制成gml-2440.c同时将obj-$(CONFIG_MACH_MINI2440) += gml-2440.o
然后修改时钟频率,注释掉smdk_machine_init();
3:修改mtd分区
按照手册上说的再自己的.c文件中添加分区信息根本不行,编译都通不过随后参考了当前目录下的mach-mini2440.c才发现没有包含相关头文件,还有一点手册当中没有说到的是mini2440_nand_info也没有使用,这个也可以参考mach-mini2440.c添加。
4:移植yaffs2
这个按照手册走没有问题,将友善光盘中提供的已经做好的root_qtopia-128M.img,用supervivi的y功能烧写到nand-flash中再启动系统便可进入shell当中。
5:关于分区信息的来源
我想知道修改mtd分区的依据是什么,难度是supervivi当中固定了一些信息
6:关于机器码
每块开发板在linux当中还需要有机器码,这个机器码由bootloader传入mini2440,mini2440还自己申请了机器码为1999,这些linux系统支持的机器码都在arch/arm/tools/mach-types中定义
mini2440 MACH_MINI2440 MINI2440 1999
这些字段都什么意思不太懂,看其字母就包含mini244,如果你把这里改了把1999改成19999内核就起不来,
在mach-2440.c中有如下字段
MACHINE_START(MINI2440,"GAOMAOLIN2440")
.
.
MACHINE_END
如果你把MINI2440改成其它的就编译不过,这里的MINI2440肯定是要做mach-types中有的。
今天第一项任务差不多是完成了。
第二个任务就是
泛读《linux mtd 源代码分析》和相关源代码,对mtd驱动框架有大致了解