mini2440学习之(一)-------移植linux内核
[复制链接]
此内核移植参考Tekkaman Ninja 的文章 在此向他表示感谢
前提准备:开发板mini2440开发板
linux内核为linux-2.6.22.2
NOR FLASH为superVIVI
注:本人仅仅是从网上搜集的材料然后根据自己的板子情况一点调试修改的
其中可能有些错误或不必要修改的地方,(本人也是新手所以谅解下吧)
转载请注明出处-----------------hongshaoone
一、将Linux2.6.22.2内核源码放到工作目录的kernel文件夹下,并解压
二、修改内核源码根目录下的Makefile文件
#ARCH ?= arm
#CROSS_COMPILE ?=arm-linux-
三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。
(1)
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.size = SZ_16K*20,
.offset = 0,
},
[1] = {
.name = "kernel",
.offset = SZ_16K*20, //SZ_16K*20开始为SZ_32K*10,不过make时出错,换成为SZ_16K*20就OK了 不知道为什么
.size = SZ_2M,
},
[2] = {
.name = "yaffs2",
.offset = SZ_2M+SZ_16K*20,
.size = SZ_2M*20, // SZ_2M*20 是我随便写的 不想再算了 呵呵
},
此处的分区一定要与supervivi的分区一致 我是用的 [x] bon part 0 320k 2368k 所以只分了三个区
(2)
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30, //这 三个数字要改的 以前是20 60 20
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
四、 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。 //此段引用别人的 我只是照此修改了
搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT为NAND_ECC_NONE
五、增加Yaffs2文件系统的支持
解压Yaffs2并将其加入Linux内核(打补丁的方式)
#cd yaffs2
#./patch-ker.sh c /mnt/linux-2.6.22.2/
六、系统初始化时的芯片晶振频率的修改,修改arch/arm/mach-s3c2440/mach-smdk2440.c
......
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
七、配置内核
先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
1.General setup --->
Configure standard kernel features (for small systems) --->
选上这项,否则文件系统中的一些选项不会出现
2. System Type ---->
S3C2410 DMA support Support ARM920T processor
S3C2410 Machines --->
SMDK2410/A9M2410
S3C2440 Machines --->
SMDK2440
SMDK2440 with S3C2440 CPU module
3.Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成 (noinitrd root=/dev/mtdblock2 console=ttySAC0,115200 init=/linuxrc )
可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2是存放我的Linux文件系统的分区。
4.Enable loadable module support --->
Module unloading
Automatic kernel module loading
选择这两个,剩下的可以去掉
5.Device Drivers --->
<*> Memory Technology Device (MTD) support --->
MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
Network device support --->
Ethernet (10 or 100Mbit) --->
<*> DM9000 support
< > Real Time Clock ---> //这个去掉
6.File systems----->
Miscellaneous filesystems --->
<*>YAFFS2 file system support
我的文件系统为YAFFS2 ,如果不选此,则出现Kernel panic: VFS: Unable to mount root fs on unknown-block(31,2)
八、编译 make zImage
写的比较详细了, 基本包括了内核移植几个最重要的步骤, 但有些东西还是需要重新考虑的, 我列在下面, 如果你觉得有什么不对的, 欢迎来反驳我:)
引用offset = SZ_16K*20, //SZ_16K*20开始为SZ_32K*10,不过make时出错,换成为SZ_16K*20就OK了 不知道为什么
那多半是因为SZ_32K没有定义把:)
引用此处的分区一定要与supervivi的分区一致 我是用的 [x] bon part 0 320k 2368k 所以只分了三个区
与supervivi分区保持一致是对的, 但supervivi用的并不是bon分区, 而是MTD分区, 在superviv下用part命令可以看到相关参数和信息。
引用.twrph0 = 30, //这 三个数字要改的 以前是20 60 20
这三个NAND Flash Controller的参数要根据当前使用的NAND Flash芯片手册和CPU芯片手册相关部分来计算, 而且和NAND Flash Controller所用的HCLK频率有关
引用我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。
内核支持通用的软件ECC算法和S3C210 NAND Flash Controller的硬件ECC算法, 这里你应该根据U-boot使用的算法选择内核所用的ECC算法, 不要为了图简单就关掉ECC, 这是网上很多移植S3C2410内核的人犯的错误。
来源:百问网