我的开发板是mini2440,bootlorder是vivi ,交叉编译工具是 arm-linux-4.4.3
很多人都是看公司开发板的移植方法做的,很详细简单,但很多都是技术人员帮你做好的,都不是通用的,只是针对于一款硬件设备,学不到多少东西。所以下面介绍一下我的移植方法,一种通用的
下面是详细的制作流程:
准备工作:下载Linux-2.6.32.2内核源码
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2
解压:tar xvzf linux-2.6.32.2.tar.gz
(1)进入linux-2.6.32.2内核源码顶层目录,修改对硬件平台的支持。
gedit Makefile
(注:在193 行)
(2)修改平台时钟
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); (已改,原来是16934400) //default is 16934400, changed by yangdk
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
(3)修改机器码 (如果机器码错误,系统会提示选取平台,死机)
gedit arch/arm/tools/mach-types
修改机器码,使之与bootloader的机器码相同,这里使用的是ivi,机器码为1999
(查看:在Norflash下启动选择【q】进入Vivi中,输入: param show )
$vim arch/arm/tools/mach-types
379 s3c2440 ARCH_S3C2440 S3C2440 168 (把168改为1999)
(4)修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。在Norflash下启动选择【q】,然后输入:part show查看
在arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定要跟bootloader的一致。在我的板子中修改如下:
(5)向内核加入对YAFFS2的支持(这样在你配置内核时才有Yaffs2选项)
去网上下载个yaffs2补丁包,进行解压。进入解压后的目录。
执行后 你会在linux-2.6.32.2下的/fs下看到yaffs2这个文件目录。
Makefile 文件和 Kconfig 文件也添加了 yaffs2 的配置和编译条件
(6)内核的定制
首先复制一下对于S3C2410/2440的通用配置
注:所有命令在Linux源代码顶层目录执行
cp arch/arm/configs/s3c2410_defconfig .config
make menuconfig
弹出窗口后选择以下配置。
支持EABI
(注:由于使用了codesourcery的工具链,此工具链支持EABI,,内核编译时也要选上,否则用这个编译器编出来的用户程序无法运行,最典型的错误是Busybox无法运行 )
支持 NandFlash
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个去掉
还有别的以下定制
system type -> 2410/arm92410
如果之前编译没有成功,要先 make clean
#make zImage
编译成功会后在arch/arm/boot/下面生成zImage文件(到此恭喜你!!!),不过此文件只能用Vivi启动,如果用uboot启动,需要用mkimage生成uboot可执行的文件。
这里生成的zImage文件就可以通过uboot来引导了。
上面讲完了内核的引导及传参,需要引起注意的就是在使用mkimage命令生成内核时,-e后面的地址要比-a后面的地址偏移0x40。
下面分享一下:修改nand Flash的校验方式,去掉ECC校验。(也可选,需要做以下改动)
在drivers/mtd/nand/s3c2410.c 第669行
将chip->ecc.mode = NAND_ECC_SOFT;
改为 chip->ecc.mode = NAND_ECC_NONE;
注意:关于这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测。而我一开始也是编译的时候就去掉了ECC校验的选项,原以为在编译选项中去掉就可以了,结果一直报这样的错:
end_request: I/O error, dev mtdblock2, sector 0
FAT: unable to read boot sector
VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)
Please append a correct "root=" boot option; here are the available partitions:
1f00 192 mtdblock0 (driver?)
1f01 1856 mtdblock1 (driver?)
1f02 30720 mtdblock2 (driver?)
1f03 32768 mtdblock3 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
后来发现配置中去掉的这个选项在代码中并没有完全去掉,只是去掉了硬件校验的方式,换成了软件校验。只有在代码中给改成NAND_ECC_NONE,才不会校验,但是这样是不提倡的,但这样系统才启动起来。