1.修改晶振频率
S3C2440支持两种频率:12MHZ 和16MHZ.目前市面上出售的开发板大多使用的是12MHZ的晶振,而内核源代码采用的是16MHZ频率,从而产生了错误的PCLK,因此导致内核向串口输出数据时使用了错误的比特率(正确的应该是),这样在超级终端上看到的就是乱码。因此我们只须修改内核源代码中的晶振频率即可。
将内核顶层目录下的 arch /arm/mach-s3c2440/mach-smdk2440.c的第180行:s3c24xx_init_clocks(16934400);
改为:s3c24xx_init_clocks(12000000);
2.修改Nand Flash分区表
这次内核正常启动,不再出现乱码,但未能成功挂载根文件系统。出现错误如下:
VFS :Mounted root (jffs2 filesystem ).
Freeing init memroy :132k
Warning : unable to open an initial console.
Kernel panic - not syncing : No init found . Try passing init = option to kernel.
仔细查看内核出错前的输出,发现内核在Nand Flash 上创建了 8个分区 :
Creating 8 MTD partition on "NAND 64MiB 3,3v 8-bit " :
0x00000000 -- 0x00004000 :"Boot Agent"
0x00000000 -- 0x00200000 :"S3C2410 flash partition 1"
0x00400000 -- 0x00800000 :"S3C2410 flash partition 2"
0x00800000 -- 0x00a00000 :"S3C2410 flash partition 3"
0x00a00000 -- 0x00e00000 :"S3C2410 flash partition 4"
0x00e00000 -- 0x01800000 :"S3C2410 flash partition 5"
0x01800000 -- 0x03000000 :"S3C2410 flash partition 6"
0x00300000 -- 0x04000000 :"S3C2410 flash partition 7"
kernel commal line : noinitrd root=/dev/mtdblock2 console = ttySAC0 rootfstype=jffs2
由上面看出,内核会到NAND Flash 的0x00400000 ~ 0x00800000 区间来挂载根文件系统,但事实上通过u-boot烧写根文件系统时,是将其烧写到Nand Flash 的0x00400000 ~ 0x04000000 这个区间。所以内核不能成功挂载根文件系统。因此,必须修改内核对Nand Flash的分区定义,让第3个分区位于0x00400000-0x04000000这个区间。
修改 arch /arm/plat-s3c24xx/common-smdk.c文件 ,将static struct mtd_partition ....{}函数做如下修改,这样一来,整个Nand Flash 被划分为4个分区。
第一个分区大小1MB,存放u-boot;
第二个分区大小3MB,存放kernel;
第三个分区大小60MB,存放根文件系统;
第四个分区从第64M开始一直到Nand Flash的最后,可用于扩展。
static struct mtd_partition smdk_default_nand_part[ ]={
[ 0 ] = {
.name = " Bootloader ",
.size = SZ_1M,
. offset = 0,
},
[ 1 ] = {
.name = " kernel",
. offset = SZ_1M,
.size = SZ_2M + SZ_1M,
},
[ 2] = {
.name = " Root filesystem ",
. offset = SZ_4M,
.size = SZ_64M - SZ_4M,
},
[ 3 ] = {
.name = " Extended",
. offset = SZ_64M,
.size = MTDPART_SIZE_FULL,
}
};