移植Linux内核至S3C2440

实验平台

开发板:JZ2440
CPU:三星 S3C2440
内核版本:linux-4.19.69

下载内核

首先从Linux官网 https://www.kernel.org/.上下载自己需要的内核版本,并解压
移植Linux内核至S3C2440_第1张图片

修改启动参数

因为我的开发板使用的是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指令查看分区情况,如图:
移植Linux内核至S3C2440_第2张图片
内核按照分区修改代码,如下

\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内核至S3C2440_第3张图片

配置和裁剪Linux内核

在Linux内核中已经有各个对应CPU的默认配置,在 ./arch/arm/config 目录下 ,如图:
移植Linux内核至S3C2440_第4张图片
跟我们S3C2440比较接近的配置是s3c2410,所以我们在根目录下执行make s3c2410_defconfig,就会自动拷贝配置模板。
然后再在根目录下执行make menuconfig就会进入图形配置界面,在这里面我们可以根据自己的需要配置和裁剪Linux内核的功能。
System Type —> SAMSUNG S3C24XX SoCs Support配置如下
移植Linux内核至S3C2440_第5张图片
这里保证内核可以支持自己使用的s3c2440,其他更多配置可以看链接: https://blog.csdn.net/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中。

你可能感兴趣的:(移植Linux内核相关)