MINI2440移植高版本内核
网上大多大多都是2.6.32版本的内核,因为想要学习设备树相关的知识,所以在2440中移植4.9.2版本的内核,记录一下自己遇到的问题,搭建环境时参考了一个大佬的文章,特此感谢。
linux4.9.2内核在mini2440上的移植
内核版本:linux4.9.2
虚拟机环境:VMware Workstation15 Pro,Ubuntu20.04
编译器环境:arm-linux-gcc v4.4.3,arm-linux-gnueabihf-gcc
- 下载
linux4.9.2
源码到虚拟机并解压 - 根据自己的编译环境修改顶层
Makefile
文件第255行,也就是平台及
当编译器环境为arm-linux-gcc
时,修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
当编译器环境为arm-linux-gnueabihf-gcc
时,修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
注意:写的时候后面一定不能有空格,有空格导致解析工具链出错,make无法成功
-
复制平台配置文件到顶层并重命名为
.config
平台配置文件在arch/arm/configs
目录下,执行cp ./.mini2440_defconfig ../../../.config
-
make
生成zImage
Kernel: arch/arm/boot/Image is ready
Building modules, stage 2.
Kernel: arch/arm/boot/zImage is ready
MODPOST 196 modules
- 在
arch/arm/boot/
下执行mkimage -n 'mykernel' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage
其中0x30008000
是规定的内核的起始地址为基地址偏移0x8000
,0x30008040
应该是因为zImage
多了一个64字节的信息头
自此生成了mini2440
可以使用的内核
因为是要从头写平台文件,所以要多次编译内核生成uImage
并复制到 tftp 目录下,很麻烦,所以写成一个脚本文件,脚本内容为:
mkimage -n 'mykernel' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage ./uImage_4_9_2
cp ./uImage_4_9_2 /home/huizhe/tftp_share/uImage_4_9_2
赋予可执行权限chmod a+x mkuImage.sh
以上工作我们都是在Linux
环境下操作,生成了可以在板子上运行的uImage
,所以我们接下来配置环境将生成的内核跑在板子上。
- 配置板子ip环境
串口工具为SecureCRT
将s3c2440.jflash
和uboot.bin
文件通过J-Flash ARM
软件烧入,连接开发板,连接串口,会显示
U-Boot 2010.03 (Oct 04 2017 - 23:09:46)
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
****************************************************************
U-BOOT (Ver2010.03) for FriendlyARM MINI2440 Board
CPU:Sumsung S3C2440A,Memory:64MB,NorFlash:2MB,NandFlash:256MB
Modified By ZhangLiang,2016-3-18
Copyright ZHL, All Rights Reserved
******************************************************************
Hit any key to stop autoboot: 0
printenv
查看当前环境
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.152.123:/home/huizhe/rootfs ip=192.168.152.125 console=ttySAC0,115200
bootdelay=5
ethact=dm9000
ethaddr=00:0c:29:4d:e4:f4
mtddevname=u-boot
mtddevnum=0