现在开始在JZ2440平台上移植最新的liunux内核4.15.2.
第一步,实现内核的启动,并且串口能正常输出。
此部分参照韦东山老师的视频教程“毕业班第3课第1节”内容,亦参考网友课本视频课程的文字博客
https://www.cnblogs.com/kele-dad/p/7082682.html
内核源码的下载地址为
https://www.kernel.org/
修改源码根目录的Makefile
文件
我们的架构为arm,交叉编译工具为arm-linux-gcc.
因此修改Makefile的内容为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
注意:
在arm
和 arm-linux-
不能留有空格,否则会报错
具体寻找不详述了,具体参照上面的博客文章
make s3c2410_defconfig
使用上面的配置编译后,启动新内核可以看到串口输出乱码,原因是内核时钟配置有误。
修改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
在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改成其他值
在内核里,搜索 “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 表示剩余的所有空间
},
};
make menuconfig
kernel feature
----Use the ARM EABI to compile the kernel[Y]
----Allow old ABI binaries to run with this kernel (EXPERIMENTA)[Y]
make uImage
nfs 30000000 136.17.69.70:/home/shuimu/more/LinuxDriver/uImage
nand erase.part kernel
nand write 30000000 kernel
reset
Starting kernel ...
, 之后无输出这种情况一般是uboot传给kernel的machid不对造成的,kernel在支持的列表中查找不到这个ID对应的单板,所以无法运行。
解决方法:
* 修改uboot中传入的ID和内核中所启用的单板ID相同
* 简便方法,使用uboot命令设置启动ID进行尝试
set machid 392
save
重启uboot之后可以使用printenv
查看设置之后的machid