平台:mini2440
交叉工具链:
arm-linux-gcc-4.3.2
一、内核移植基本知识
移植内核也叫构建BSP(boardsupprot packet)。BSP的作用有两个:一是为内核运行提供底层支持,二是屏蔽与板相关的细节。
BSP的构建分三个层次
1、体系结构层次
对一些体系结提供linux内核支持,比如说ARM,X86等芯片。这一类工作一般在arc/xxx/下面额除了palt-xxx和mach-xxx目录的其他目录完成。
2、SOC层次
对一些公司提供的SOC微处理器提供linux内核支持,比如说三星公司的 S3C2440。这一类工作一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目录下完成。我们可以看到在arch /arm/目录下同时有plat-s3c24xx和mach-s3c2440两个目录,这样做是因为plat-s3c24xx目录下存放了所有s3c24 系列相同的代码,mach-s3c2440则只存放了与S3C2440有关的代码。
2,板级层次
这是我们一般的菜鸟要做的,上面两个层次一般有芯片公司的大牛完成了,但是不同的电路板的板级层次则需要由我们菜鸟完成的。这一类工作主要在mach- xxxx/目录下面的板文件完成,比如说mach-s3c2440/smdk-s3c2440.c这个S3C2440标准板文件。很多文档很多书籍都都直接在这个文件里面进行修改,这样是不对的,对于不同的电路板应该建立不同的板文件,比如说我的是mini2440,就应该建立一个smdk- mini2440.c文件或者mach-mini2440.c文件在mach-s3c2440下面。如果直接在里面修改是非常不规范的做法,这样不是在移植内核,这样是在破坏内核!(这一句是宋宝华说的)。
下面开始移植。
二、BSP构建
1.建立板文件支持
这一步我会重新建立一个板文件mach-mini2440.c,而不是直接在smdk-s3c2440.c里面修改,这样或许麻烦一些,但是为了保持对内核尊重的态度和规范的做法,认为应该这样做。
如果我们重新建立一个空的板文件将会导致大量的工作量,幸运的是smdk-s3c2440.c文件已经帮我们做了大量的工作,我们直接拷贝过来命名为mach-mini2440.c
cp arch/arm/mach-s3c2440/smdks3c2440.c arch/arm/mach-s3c2440/mach-mini2440.c
修改arch/arm/mach-s3c2440/mach-mini2440.c文件将MACHINE_START宏括号里面的名字换成ID换成 MINI2440,名字随便取,我们取“MINI2440”,这个ID最终会被扩展为MACH_TYPE_MINI2440,然后到arch/arm /tools/mach_types里面找对应的ID号,所有做完以这一步我们要在mach_types添加我们机器的ID
MACHINE_START(MINI2440,"MINI2440")
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18)& 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
然后在mach_types里面添加我们机器的ID,再最后一行添加
mini2440 MACH_MINI2440 MINI2440 1999
第一个表示机器名字,这个也随便取,第二个在Kconfig配置项里面定义的宏名称,下面一步我们会定义到,我们取名为MACH_MINI2440,第三表示MACH_START第一个参数ID名字,第四个是ID号。ID号我们取为1999。
修改arch/arm/mach-s3c2440/目录下的Kconfig和Makefile,以建立内核对板文件的支持使其可以被配置和编译进内核。
首先修改Kconfig,在endmenu之前加入下面的内容:
87 config MACH_MINI2440 // 开发板名称宏定义
88 bool "mini2440" // 开发板名称
89 select CPU_S3C2440 // 开发板使用的处理器类型
90 help
91 Say Y here if you are using the mini2440. // 帮助信息
再修改Makefile:
obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o
注意这一行要添加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o后面,否则会编译错误。
这样我们就可以通过makemenuconfig配置mini2440的板文件是否编译进内核。
我们再跳到linux-2.6.22目录,执行makemenuconfig
执行加载默认配置文件后,可以开始配置新增加的菜单。进入System Types菜单项,打开S3C24XX Implementations菜单,出现一个目标开发板的列表:
[ ] Simtec ElectronicsBAST (EB2410ITX)
[ ] IPAQ H1940
[ ] Acer N30
[ ] SMDK2410/A9M2410
[ ] SMDK2440
[ ] AESOP2440
[ ] Thorcom VR1000
[ ] HP iPAQ rx3715
[ ] NexVision OTOM Board
[ ] NexVision NEXCODER2440 Light Board
[ ] mini2440
选中mini2440选项
然后执行makezImage,如果能够正常编译,已经能够将mini2440板文件编译进内核了。如果不行,请检查上述步骤。