JZ2440平台移植Linux内核4.15.2


title: JZ2440平台移植Linux内核4.15.2

现在开始在JZ2440平台上移植最新的liunux内核4.15.2.
第一步,实现内核的启动,并且串口能正常输出。
此部分参照韦东山老师的视频教程“毕业班第3课第1节”内容,亦参考网友课本视频课程的文字博客

https://www.cnblogs.com/kele-dad/p/7082682.html

1. 下载内核源码,并解压

内核源码的下载地址为

https://www.kernel.org/

2. 修改Makefile

修改源码根目录的Makefile文件
我们的架构为arm,交叉编译工具为arm-linux-gcc.
因此修改Makefile的内容为

ARCH  ?=   arm
CROSS_COMPILE    ?=   arm-linux-

注意:
armarm-linux-不能留有空格,否则会报错

3. 配置内核

具体寻找不详述了,具体参照上面的博客文章

make s3c2410_defconfig

4. 修改时钟配置

使用上面的配置编译后,启动新内核可以看到串口输出乱码,原因是内核时钟配置有误。
修改arch/arm/mach-s3c24xx/mach-smdk2440.c

static void __init smdk2440_init_time(void)
{
	s3c2440_init_clocks(12000000);
	samsung_timer_init();
}
make uImage
nfs 30000000 136.17.69.82:/home/shuimu/more/LinuxDriver/uImage
bootm 30000000

此时,即可看到Linux内核能够正常输出串口内容了。

/********************************************************************
编译过程中发现的问题
********************************************************************/

scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory

解决方法是:

sudo apt-get install libssl-dev

5. 修改开发板对应ID

在u-boot中设置的对应ID为 #define MACH_TYPE_SMDK2410 193
查看Linux内核的源代码
在 mach-smdk2440.h文件的最后几行,有这样一个宏:

MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks  */
    .atag_offset	= 0x100,
    .init_irq	        = s3c24xx_init_irq,
    .map_io		= smdk2440_map_io,
    .init_machine	= smdk2440_machine_init,
    .timer		= &s3c24xx_timer,
    .restart	        = s3c244x_restart,
MACHINE_END

将这个宏展开后会有 MACH_TYPE_S3C2440 这样一个宏,这个宏在 arch\arm\tools\mach-types 中定义, 将其改为

MACH_TYPE_S3C2440              193

!!!注意,在修改这个ID的时候一定要查看其他的单板号是否也设置成了193,如果是,请将相同的ID改成其他值

6. 修改分区

在内核里,搜索 “Boot Agent” , 执行 grep ““Boot\ Agent”” * -nR ( 反斜杠表示转义的意思 )
发现分区信息在 arch/arm/mach-s3c24xx/common-smdk.c 文件里
在 u-boot 里执行 mtdparts 查看 u-boot 的分区信息:

\#: name                size            offset          mask_flags
 0: u-boot              0x00040000      0x00000000      0
 1: params              0x00020000      0x00040000      0
 2: kernel              0x00200000      0x00060000      0
 3: rootfs              0x0fda0000      0x00260000      0

修改 arch/arm/mach-s3c24xx/common-smdk.c 文件,mtd_partition 改为以下内容 :

static struct mtd_partition smdk_default_nand_part[] = {
       [0] = {
               .name	= "bootloader",       //分区名字
               .size	= SZ_256K,            //分区大小
               .offset	= 0,                //偏移起始地址
       },
       [1] = {
               .name	= "params",
               .offset = MTDPART_OFS_APPEND,    //MTDPART_OFS_APPEND 表示紧接着上一个分区
               .size	= SZ_128K,
       },
       [2] = {
               .name	= "kernel",
               .offset = MTDPART_OFS_APPEND,
               .size	= SZ_4M,
       },
       [3] = {
               .name	= "rootfs",
               .offset	= MTDPART_OFS_APPEND,
               .size	= MTDPART_SIZ_FULL,            //MTDPART_SIZ_FULL 表示剩余的所有空间
       },
};

7. 使能内核中的EABI

make menuconfig
kernel feature
----Use the ARM EABI to compile the kernel[Y]
----Allow old ABI binaries to run with this kernel (EXPERIMENTA)[Y]

7. 编译下载内核

make uImage
nfs 30000000 136.17.69.70:/home/shuimu/more/LinuxDriver/uImage
nand erase.part kernel
nand write 30000000 kernel
reset

内核移植问题总结

1. 如果下载内核之后停留在Starting kernel ..., 之后无输出

这种情况一般是uboot传给kernel的machid不对造成的,kernel在支持的列表中查找不到这个ID对应的单板,所以无法运行。
解决方法:
* 修改uboot中传入的ID和内核中所启用的单板ID相同
* 简便方法,使用uboot命令设置启动ID进行尝试
set machid 392
save
重启uboot之后可以使用printenv查看设置之后的machid

2. 编译内核使用的工具链版本很重要,在编译内核之前,可以使用crosstool-ng制作最新的交叉编译工具链,之后再配置进行编译内核。最新版的内核稍有差异,但是差异不大,按照前面所述即可完成内核的移植。

3. 在编译busybox生成文件系统时,尽量使用静态编译,因为这样不仅可以节省复制库文件的时间,还会使最终生成的镜像文件占用空间减小。

你可能感兴趣的:(Linux,kernel)