日期:2014-05-16 浏览次数:20700 次
编者:这里使用内核的版本为2.6.32,保持和板子原来自带的内核相同。因为该内核已经支持了mini2440,所以我们应该做一下基本处理。另外,这里的目标就是能建立一个可以运行的内核,当然可能这个内核只是可以运行,其实也没运行,没文件系统,不能提供什么实际的功能。另外我们的移植是以SMDK2440为蓝本进行的。
1、获取内核源码
方法很多,找个一个2.6.32的就可以,然后进行解压。
2、指定交叉编译变量
修改Makefile的这两句
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
ARCH 是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。
3、试编译
#make s3c2410_defconfig;使用缺省内核配置文件,s3c2410_defconfig 是SMDK2440 的缺省配置文件
#make ;编译时间较长
4、克隆建立自己的目标平台
4.1 关于机器码
以上编译是用的Linux 内核本身支持的目标平台配置,它对应于SMDK2440。现在我们要参考SMDK2440 加入自已的开发板平台,我们使用的是mini2440,因此取名为MINI2440。需要说明的是,Linux-2.6.32.2 本身已经包含了mini2440 的支持,这样就出现了重名。那怎么办呢?在此我们依然使用MINI2440 这个名称,只不过在后面的移植步骤中,把原始内核自带的mini2440 代码部分直接删除就可以了,以免和我们自己移植的混淆了。首先,很关键的一点,内核在启动时,是通过bootloader
传入的机器码(MACH_TYPE)确定应启动哪种目标平台的,友善之臂已经为mini2440 申请了自己的机器码为1999,它位于linux-2.6.32.2/arch/arm/tools/mach_types 文件中。接下来, 我们注意到linux-2.6.32.2/arch/arm/mach-s3c2440 目录下有个mach-mini2440.c 文件,它其实就是国外爱好者为mini2440 移植添加的主要内容了,但我们不用它,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c
复制一份。命名为mach-mini2440.c , 找到MACHINE_START(S3C2440, "SMDK2440") , 修改为MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。
4.2 修改时钟源频率
现在再来修改系统时钟源, 在mach-mini2440.c( 就是我们刚刚通过复制mach-smdk2440.c 得到的)的第160 行static void __init smdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440 目标板上的晶振是16.9344MHz)改为mini2440 开发板上
实际使用的12000000。
4.3 从SMDK2440 到MINI2440
因为我们要制作自己的mini2440 平台体系,因此把mach-mini2440.c 中所有的smdk2440 字样改为mini2440,可以使用批处理命令修改,在vim 的命令模式下输入:
%s/smdk2440/mini2440/g上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思,输入如图除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440 原来的。
4.4 编译测试
在Linux 源代码根目录下执行
#make mini2440_defconfig ;使用Linux 官方自带的mini2440 配置
#make zImage ;编译内核,时间较长,最后会生成zImage
重新编译并把生成的内核文件zImage(位于arch/arm/boot 目录)下到板子中,可以看到内核已经可以正常启动了,如下图,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。