重温Mini2440(二)移植Linux-4.9.270
- 一. 获取Linux内核
- 二. 安装编译工具
- 三. 配置内核
- 四. 修改驱动
- 五. 生成uImage
- 六. U-Boot引导内核
一. 获取Linux内核
在The Linux Kernel Archives可以下载到最新的Linux内核
此文使用的版本是: longterm: 4.9.270
下载得到linux-4.9.270.tar.xz
压缩包,通过tar命令解压得到内核源码:
tar -xvJf linux-4.9.270.tar.xz
二. 安装编译工具
#安装交叉编译工具
sudo apt install gcc-arm-linux-gnueabihf#make编译内核过程中所需的工具
sudo apt install libncurses5-dev
sudo apt install libx11-dev:i386 libreadline6-dev:i386
sudo apt install build-essential
sudo apt install lib32stdc++6
sudo apt install lib32z1#根据编译过程中的报错提示安装对应的工具
sudo apt install bc
sudo apt install bison
sudo apt install flex
sudo apt install libssl-dev
三. 配置内核
1.进入源码目录,打开Makefile
vim Makefile
2.定位到ARCH和CROSS_COMPILE
,配置架构和交叉编译器
257 ARCH ?= arm258 CROSS_COMPILE ?= arm-linux-gnueabihf-
3.使用自带的mini2440_defconfig配置
make mini2440_defconfig
4.根据需求裁剪内核
make menuconfig
4.1 取消Flash Translation Layer support
4.2 打开Early printk(按需配置)
如果打开了此配置,u-boot的bootargs参数需要增加earlyprintk字段
四. 修改驱动
1.修改Nand Flash分区
246 /* NAND Flash on MINI2440 board */
247
248 static struct mtd_partition mini2440_default_nand_part[] __initdata = {
249 [0] = {
250 .name = "u-boot",
251 .size = 0x00060000,
252 .offset = 0,
253 },
254 [1] = {
255 .name = "u-boot-env",
256 .size = 0x00020000,
257 .offset = 0x00060000,
258 },
259 [2] = {
260 .name = "kernel",
261 /* 5 megabytes, for a kernel with no modules
262 * or a uImage with a ramdisk attached */
263 .size = 0x00500000,
264 .offset = 0x00080000,
265 },
266 [3] = {
267 .name = "root",
268 .offset = 0x00580000,
269 .size = 200*1024*1024,//MTDPART_SIZ_FULL,
270 },
271 };
2.修改dm9000网卡驱动
47 #include "dm9000.h"48 //for mini244049 #include <../../../../arch/arm/mach-s3c24xx/regs-mem.h>50 //end910 static void911 dm9000_init_dm9000(struct net_device *dev)912 {913 //for mini2440914 unsigned int oldval_bwscon = *(volatile unsigned int*)S3C2410_BWSCON;915 unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;916 *((volatile unsigned int*)S3C2410_BWSCON) = (oldval_bwscon &~(3<<16)) | (1<<16) | (1<<18) | (1<<19);917 *((volatile unsigned int*)S3C2410_BANKCON4) = 0x1f7c;918 //end919 920 struct board_info *db = netdev_priv(dev);921 unsigned int imr;922 unsigned int ncr;
五. 生成uImage
1.编译内核
#根据CPU核心数执行多任务编译
make -j4
成功编译后会生成zImage:
2.安装uImage生成工具
sudo apt install u-boot-tools
3.编写mkuImage.sh脚本,注意zImage的位置以及生成uImage的位置
echo "mkimage -A arm -O linux -Tkernel -C none -a 0x30008000 -e 0x30008040 -n mini2440 -d /home/lps/linux-4.9.270/arch/arm/boot/zImage /home/lps/rootfs/uImage" > ./mkuImage.sh
4.赋予可执行权限
chmod a+x mkuImage.sh
5.运行脚本
./mkuImage.sh
六. U-Boot引导内核
我使用nfs的方式加载并引导内核,具体方法请参考重温Mini2440(一)移植U-Boot
一切顺利后会在终端看到如下打印:
U-Boot 2010.03 (5月 07 2021 - 14:09:38)modified by tekkamanninja (tekkamanninja@163.com)Love Linux forever!!I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
Video: 240x320x16 20kHz 62Hz
In: serial
Out: serial
Err: serial
USB slave is enable!
Net: dm9000
U-Boot 2010.03 (5月 07 2021 - 14:09:38)
modified by tekkamanninja
(tekkamanninja@163.com)
Love Linux forever!!
Hit any key to stop autoboot: 0
[u-boot@MINI2440]# setenv bootcmd 'nfs 0x30008000 192.168.15.230:/home/lps/rootfs/uImage;bootm'
[u-boot@MINI2440]# save
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x6000000000002 -- 0% complete.
Writing to Nand... done
[u-boot@MINI2440]# boot
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 192.168.15.230; our IP address is 192.168.15.233
Filename '/home/lps/rootfs/uImage'.
Load address: 0x30008000
Loading: ####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
done
Bytes transferred = 3049768 (2e8928 hex)
## Booting kernel from Legacy Image at 30008000 ...Image Name: mini2440Created: 2021-06-02 2:01:26 UTCImage Type: ARM Linux Kernel Image (uncompressed)Data Size: 3049704 Bytes = 2.9 MBLoad Address: 30008000Entry Point: 30008040Verifying Checksum ... OKXIP Kernel Image ... OK
OK
Using machid 0x7cf from environmentStarting kernel ...Booting Linux on physical CPU 0x0
Linux version 4.9.270 (lps@lps-ubuntu) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) ) #2 Wed Jun 2 09:46:07 CST 2021
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c000717f
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
Memory policy: Data cache writeback
CPU S3C2440A (id 0x32440001)【此处省略一万字】VFS: Mounted root (nfs filesystem) on device 0:12.
Freeing unused kernel memory: 184K
This architecture does not have kernel memory protection.
Kernel panic - not syncing: Requested init /linuxrc failed (error -2).
CPU: 0 PID: 1 Comm: swapper Not tainted 4.9.270 #2
Hardware name: MINI2440
[<c000f1cc>] (unwind_backtrace) from [<c000ce28>] (show_stack+0x10/0x18)
[<c000ce28>] (show_stack) from [<c045acb8>] (dump_stack+0x18/0x24)
[<c045acb8>] (dump_stack) from [<c045934c>] (panic+0xac/0x244)
[<c045934c>] (panic) from [<c045c2d4>] (kernel_init+0x70/0xe8)
[<c045c2d4>] (kernel_init) from [<c000a4e8>] (ret_from_fork+0x14/0x2c)
---[ end Kernel panic - not syncing: Requested init /linuxrc failed (error -2).
由于还没有移植根文件系统,因此VFS无法挂载并且报错