[嵌入式] 重温Mini2440(二)移植Linux-4.9.270

一. 获取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            ?= arm
 258 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 mini2440
  49 #include <../../../../arch/arm/mach-s3c24xx/regs-mem.h>
  50 //end

 910 static void
 911 dm9000_init_dm9000(struct net_device *dev)
 912 {
 913         //for mini2440
 914         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         //end
 919 
 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 (507 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 (507 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:   mini2440
   Created:      2021-06-02   2:01:26 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3049704 Bytes =  2.9 MB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK
Using machid 0x7cf from environment

Starting 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无法挂载并且报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值