05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统

一、框架介绍及简单修改

1.1 Bootloader如何引导内核

Bootloader的工作:

(1)讲内核读入内存中

(2)存一些内核启动参数到指定位置,内核启动时去解析

(3)启动内核,传入机器ID

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第1张图片

1.2、内核的启动流程:

首先 内核的最终目的是挂接根文件系统,并启动应用程序。

想启动应用程序—需要挂接根文件系统—装载驱动程序(flash、网卡)--要解析参数(文件系统在哪)--根据R1判断内核是否支持该ID—支持调用初始化相关函数

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第2张图片

每个开发板都有不同的硬件参数

内核移植过程中要决定我这个内核支持哪些硬件开发板

我在内核里针对这个开发板给他一个ID。Uboot启动的时候传入和内核中设置好的匹配起来。

1.3  移植linux3.4.2到JZ2440

(1)解压tar xjf linux-3.4.2.tar.bz2

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第3张图片

(2)修改makefile    vi makefile

修改架构为 ARM 以及编译器




(3)选择默认配置find -name"*defconfig"

linux-3.4.2/arch/arm/configs$ ls

make s3c2410_defconfig(生成.config文件)





查看支持的单板

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第4张图片

(4)编译make uImage



建立source insight工程

(5)拷贝生成的内核文件到nfs服务器

cp arch/arm/boot/uImage  /work/nfs_root/uImage_new


(6)下载内核到32000000

nfs 32000000  192.168.1.101:/work/nfs_root/uImage_new    (需要在linux虚拟机上设置开发板IP)

测试nfs:mount -t nfs    192.168.1.101:/work/nfs_root/ /mnt/nfs


(7)启动内核


(8)u-boot2012里默认的是193机器ID

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第5张图片

(9)现在内核支持很多单板

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第6张图片

随便设置一个机器ID

内核启动时提示,不支持这个设备

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第7张图片 05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第8张图片


支持的如上,支持太多内核庞大

(10)设置机器ID为362 使用SMDK2440(362)

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第9张图片

查看开发手册:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第10张图片



05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第11张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第12张图片

(11)

设置为16a 下载 启动----会乱码

用mini2440的机器ID 1999,设置启动参数:

set serverip 192.168.1.101

set ipaddr 192.168.1.116

set machid 7CF   

set bootargs console=ttySAC0,115200root=/dev/mtdblock3

save

nfs 32000000192.168.1.101:/work/nfs_root/uImage_new

bootm 32000000(7cf成功启动,没有乱码)

7cf  成功  已经默认12M

16a 乱码  不是12


(12)修改162单板的晶振信息

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第13张图片


修改晶振

cd arch/arm/mach-s3c24xx/  

vi mach-smdk2440.c

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第14张图片

cp arch/arm/boot/uImage/work/nfs_root/uImage_new

set serverip 192.168.1.101

set ipaddr 192.168.1.116

set machid 16a  

set bootargs console=ttySAC0,115200root=/dev/mtdblock3

save

nfs 32000000192.168.1.101:/work/nfs_root/uImage_new

bootm 32000000

此时内核在开发板上启动成功,有如下输出:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第15张图片


二、修改分区

1根据报错,搜索
05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第16张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第17张图片

有如下默认分区:
Common-smdk.c (linux-2.6.22.6\arch\arm\plat-s3c24xx)	
static struct mtd_partition smdk_default_nand_part[] = {
	[0] = {
		.name	= "Boot Agent",
		.size	= SZ_16K,
		.offset	= 0,
	},
	[1] = {
		.name	= "S3C2410 flash partition 1",
		.offset = 0,
		.size	= SZ_2M,
	},
	[2] = {
		.name	= "S3C2410 flash partition 2",
		.offset = SZ_4M,
		.size	= SZ_4M,
	},
	[3] = {
		.name	= "S3C2410 flash partition 3",
		.offset	= SZ_8M,
		.size	= SZ_2M,
	},
	[4] = {
		.name	= "S3C2410 flash partition 4",
		.offset = SZ_1M * 10,
		.size	= SZ_4M,
	},
	[5] = {
		.name	= "S3C2410 flash partition 5",
		.offset	= SZ_1M * 14,
		.size	= SZ_1M * 10,
	},
	[6] = {
		.name	= "S3C2410 flash partition 6",
		.offset	= SZ_1M * 24,
		.size	= SZ_1M * 24,
	},
	[7] = {
		.name	= "S3C2410 flash partition 7",
		.offset = SZ_1M * 48,
		.size	= SZ_16M,
	}
};


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第18张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第19张图片

static struct mtd_partition smdk_default_nand_part[] = {}结构体数组里的内容替换成
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset  = 0,
},
// MTDPART_OFS_APPEND表示分区开始的偏移地址紧接着上一个分区
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
//MTDPART_SIZ_FULL表示取剩余下的容量
[3] = {
.name = "rootfs",
.offset  = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第20张图片

重新编译内核,并拷贝新分区好的内核到NFS

cp arch/arm/boot/uImage /work/nfs_root/uImage_new



05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第21张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第22张图片


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第23张图片

先下载一个已经一直好的内核



05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第24张图片



05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第25张图片


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第26张图片


此时内核可以正常启动,并打印出设置好的分区信息,但没有挂接上根文件系统


三、制作根文件系统

内核用哪个编译器,文件系统制作就用哪个编译器

(1)    编译busybox

rm -rf  busybox-1.20.0

tar xjf busybox-1.20.0.tar.bz2

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第27张图片

配置编译环境

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第28张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第29张图片

Make

创建安装路径:

mkdir fs_mini_mdev_new


指定路径下安装

make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new/



安装库glibc:

查看交叉工具类地址


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第30张图片

使用这两个库:


创建LIB目录

cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d


-d:如果是链接文件  则当做链接文件拷贝,而不拷贝实际对应文件

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第31张图片

创建usr/lib  

-p  不存在则直接创建全部文件

mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p


cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d
05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第32张图片


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第33张图片

创建etc目录:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第34张图片


cp fs_mini_mdev/etc/ fs_mini_mdev_new/ -rf


执行这个脚本:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第35张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第36张图片

然后启动sheel

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第37张图片
改为:

执行完脚本后,启动sheel,shell从console得到设备输入。

console对应什么设备呢?对应传入的命令行参数,console=ttySAC0,串口0。



创建dev目录:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第38张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第39张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第40张图片


创建其他目录:

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第41张图片

制作镜像文件 jffs2

先安装jffs2工具

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第42张图片


生成文件系统

mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

-s nand扇区大小  -e 可擦除块 (根据使用的nand flash信息来配置)



出现如下问题

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第43张图片

内核中查找 exitcode

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第44张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第45张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第46张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第47张图片


开启内核的Eabi接口


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第48张图片

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第49张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第50张图片05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第51张图片

到此内核启动成功,能打印正确的分区信息,并可以挂接上移植好的文件系统。

但是此时内核:

(1)不支持yaffs文件系统

(2)支持太多单板,过于庞大

(3)一些驱动不支持,如网卡驱动,flash驱动,led按键驱动等等。

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第52张图片


05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统_第53张图片


简单移植内核操作:

cp arch/arm/boot/uImage /work/nfs_root/uImage_new
set machid 16a

set serverip 192.168.1.101

set ipaddr 192.168.1.116

set bootargs console=ttySAC0,115200root=/dev/mtdblock3

save

nfs 32000000192.168.1.101:/work/nfs_root/uImage_new

移植文件系统操作:

nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev_new.jffs2(可能会出错,怀疑上网络不稳定)
nand erase.part rootfs(需要uboot支持)
nand write.jffs2 30000000 260000  $filesize(1.1.6的uboot 需要带括号)
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 

nfs 32000000 192.168.1.101:/work/nfs_root/uImage_eabi
bootm 32000000



你可能感兴趣的:(S3C2440,嵌入式Linux,S3C2440学习之旅)