实验平台
开发板:JZ2440
CPU:三星 S3C2440
内核版本:linux-4.19.69
下载内核
首先从Linux官网 https://www.kernel.org/.上下载自己需要的内核版本,并解压
修改启动参数
因为我的开发板使用的是12MHz的晶振,所以修改初始化时钟频率
\arch\arm\mach-s3c24xx\mach-smdk2440.c +162
修改为:
static void __init smdk2440_init_time(void)
{
s3c2440_init_clocks(12000000);
samsung_timer_init();
}
内核需要知道整个nand flash中各个的分区情况,才知道从哪加载根文件系统,可以在uboot的时候使用mtdpart指令查看分区情况,如图:
内核按照分区修改代码,如下
\arch\arm\mach-s3c24xx\common-smdk.c +107
修改为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "u-boot",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "device_tree",
.offset = SZ_256K,
.size = SZ_128K,
},
[2] = {
.name = "params",
.offset = SZ_256K + SZ_128K,
.size = SZ_128K,
},
[3] = {
.name = "kernel",
.offset = SZ_512K,
.size = SZ_4M,
},
[4] = {
.name = "rootfs",
.offset = SZ_4M + SZ_512K,
.size = MTDPART_SIZ_FULL,
}
};
修改Makefile
直接修改顶层目录下的Makefile文件
1.修改架构
ARCH ?= $(SUBARCH)
修改为:
ARCH ?= arm
2.指定交叉编译工具链
直接在上一步后面加上一行
CROSS_COMPILE ?= (交叉编译工具链名称)
我用的是自己制作的 arm-S3C2440-linux-gnueabi-所以填
CROSS_COMPILE ?= arm-S3C2440-linux-gnueabi-
最后修改结果如下
配置和裁剪Linux内核
在Linux内核中已经有各个对应CPU的默认配置,在 ./arch/arm/config 目录下 ,如图:
跟我们S3C2440比较接近的配置是s3c2410,所以我们在根目录下执行make s3c2410_defconfig
,就会自动拷贝配置模板。
然后再在根目录下执行make menuconfig
就会进入图形配置界面,在这里面我们可以根据自己的需要配置和裁剪Linux内核的功能。
System Type —> SAMSUNG S3C24XX SoCs Support配置如下
这里保证内核可以支持自己使用的s3c2440,其他更多配置可以看链接: https://blog.youkuaiyun.com/tk01044242_1/article/details/78815816.
配置内核环境变量
在Uboot下使用set
指令设置启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock4 rootfstype=jffs2 noinitrd init=/linuxrc
设置CPU ID
set machid 16a
最后使用save
指令保存到nand flash
编译烧写
直接在Linux根目录下执行make uImage
指令,就可以编译内核,生成的uImage文件在 arch\arm\boot 目录下。
烧录到开发板内存中,再用bootm
指令启动内核,如果没有发现其他问题,就可以把该内核文件烧写到nand flash中。