一、工具下载
1、Linux3.5.2下载
下载地址: www.kernel.org
2、yaffs2 代码
进入 http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/,点击“Download GNU
tarball”,下载后出现 cvs-root.tar.gz 压缩包。
3、busybox-1.13.3
从 http://www.busybox.net/downloads/下载 busybox,这里下载的是 busybox-1.13.3.tar.gz。
4、根文件系统制作工具
到 友 善 之 臂 http://www.arm9.net/ 网 站 下 载 根 文 件 系 统 制 作 工 具
mkyaffs2image.tgz。
5、友善之臂的根文件系统
在制作根文件系统时,需要用到链接库,为保证链接库能用直接用友善之臂
的根文件系统 root_qtopia 中的链接库 lib,到友善之臂网站 http://www.arm9.net/
下载 root_qtopia.tgz。
6、硬件平台
友善之臂的 tiny4412
二、Linux 3.5.2内核移植
1、修改对硬件平台的支持。
先添加对arm的支持,在linux-3.5.2主目录下的Makefile文件下添加如下信息:
ARCH?= arm
CROSS_COMPILE?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
2、修改平台时钟
找到内核源码 arch/arm/mach-exynos/mach-tiny4412.c 文件,在函数 static
void __init smdk4x12_map_io(void)中,修改成 s3c24xx_init_clocks(24000000)。
3、 修改 Nand flash 分区信息
很多人的做法是直接修改arch/arm/plat-s3c24xx/Common-smdk.c文件里面的smdk_default_nand_part数据结构,这样是不提倡的做法,因为还是那句话,破坏了内核。我们应该在arch/arm/mach-exynos/mach-tiny4412.c文件中建立我们自己板文件的nand信息。我们在mach-tiny4412.c的staticstruct platform_device *smdk2440_devices[]前面添加:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "loader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_1M + SZ_256K + SZ_512K,
},
[2] = {
.name = "root",
.offset = SZ_2M,
.size = SZ_32M,
},
[3] = {
.name = "user1",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
修改nand flash的参数:
在同一个文件中找到
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
改成
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
drivers/mtd/nand/s3c2410.c
839 chip->ecc.mode = NAND_ECC_NONE;//NAND_ECC_SOFT;
4、建立板文件支持
修改arch/arm/mach-exynos/mach-tiny4412.c文件将MACHINE_START宏括号里面的名字换成ID换成TINY4412,,这个ID最终会被扩展为MACH_TYPE_TINY4412。然后到arch/arm/tools/mach_types里面找对应的ID号,所有做完以这一步我们要在mach_types添加我们机器的ID。
以下为主要步骤:
A、重新复制一份mach-smdk4x12.c,并命名为mach-tiny4412.c
[root@localhost arch]#cp arm/mach-exynos/mach-smdk4x12.c arm/mach-exypons/mach-
tiny4412.c
利用vi命令打开mach-tiny4412.c文件,修改如下内容(黄色区域)
B、[root@localhost linux-3.5.2]#cd arch/arm/tools
[root@localhost tools]#vi mach_types
然后在mach_types里面添加我们机器的ID,再最后一行添加
Tiny4412 MACH_TINY4412 TINY4412 4173
第一个表示机器名字,第二个在Kconfig配置项里面定义的宏名称,下面一步我们会定义到,我们取名为MACH_tiny4412,第三表示MACH_START第一个参数ID名字,第四个是ID号,ID号我们取为4173。
C、修改arch/arm/mach-exynos/目录下的Kconfig和Makefile,以建立内核对板文件的支持使其可以被配置和编译进内核。
首先修改Kconfig,在endmenu之前加入下面的内容:
再修改Makefile,在Makefile文件中添加如下一行 :obj-$(CONFIG_MACH_TINY4412)+= mach-tiny4412.o
D、配置 Linux 内核
进入 linux-3.5.2 内核主目录,通过以下命令将 exynos的默认配置文件写到
当前目录下的.config
[root@localhost linux-3.5.2]# cp arch/arm/configs/exynos4_defconfig ./
[root@localhost linux-3.5.2]# make exynos4_defconfig
执行加载默认配置文件后,可以开始配置新增加的菜单
[root@localhost linux-3.5.2]# make menuconfig
进入System Types菜单项,打开SAMSUNG EXYNOS SoCs Support --->菜单,出现一个目标开发板的列表:
选中tiny4412选项,然后执行make zImage,如果能够正常编译,可以将能够将体内一412板文件编译进内核.。
如下为编译成功截图:
三、根文件系统的制作
1、建立根文件系统目录
进入 到/opt/MyARM 目 录,新 建建立 根 文件系统 目录的 脚本文件
create_rootfs_bash,使用命令 chmod +x create_rootfs_bash 改变文件的可执行权
限,./create_rootfs_bash 运行脚本,就完成了根文件系统目录的创建。
#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp
chmod 1777 var/tmp
echo "-------make direction done---------"
改变了 tmp 目录的使用权,让它开启 sticky 位,为 tmp 目录的使用权开启此
位,可确保 tmp 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式
系统多半是单用户,不过有些嵌入式应用不一定用 root 的权限来执行,因此需
要遵照根文件系统权限位的基本规定来设计。
动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝 lib 的内
容到新建的根文件目录 lib 内。
tar –zxvf root_qtopia.tgz –C /opt/MyARM
cp –rfd /opt/MyARM/root_qtopia/lib/* /opt/MyARM/rootfs/lib/*
2 交叉编译 busybox
tar –zxvf busybox-1.13.3.tar.tgz –C /opt/MyARM
3、进入源码,修改 Makefile 文件:
cd /opt/MyARM/busybox-1.13.3
修改:
CROSS_COMPILE ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
ARCH ?=arm
4、配置 busybox
输入 make menuconfig 进行配置
(1)、Busybox Settings--->
General Configuration--->
[*] Show verbose applet usage messages
[*] Store applet usage messages in compressed form
[*] Support –install [-s] to install applet links at runtime
[*] Enable locale support(system needs locale for this to work)
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.port for –long-options
[*] Use the devpts filesystem for unix98 PTYs
[*] Support writing pidfiles
[*] Runtime SUID/SGID configuration via /etc/busybox.config
[*] Suppress warning message if /etc/busybox.conf is not readable
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)
[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6)Minimum password legth
(2)MD5:Trade Bytes for Speed
[*]Fsater /proc scanning code(+100bytes)
[*]Command line editing
(1024)Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*]Fancy shell prompts
(4) Copy buffer size ,in kilobytes
[*]Use ioctl names rather than hex values in error messages
[*]Support infiniband HW
下面的选项将增加对 mdev 的支持。
Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal
cd /opt/MyARM/busybox-1.13.3
make CONFIG_PREFIX=/opt/MyARM/rootfs install
在 rootfs 目录下会生成目录 bin、sbin、usr 和文件 linuxrc 的内容。
6 建立 etc 目录下的配置文件
1)、etc/mdev.conf 文件,内容为空。
2)、拷贝主机 etc 目录下的 passwd、group、shadow 文件到 rootfs/etc 目录下。
3)、etc/sysconfig 目录下新建文件 HOSTNAME,内容为”YuYanze”。
4)、etc/inittab 文件:
#etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
5)、etc/init.d/rcS 文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo "----------munt all----------------"
mount -a
mdev -s
echo "***********************************************"
echo "****************My ARM*********************"
echo "Kernel version:linux-3.5.1"
echo "Student:Yu yanze"
echo "Date:2015.12.15"
echo "***********************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
使用以下命令改变 rcS 的执行权限:
Chmod +x rcS
6)、etc/fstab 文件:
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
7)、etc/profile 文件:
#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[\u@\h=W]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
7、制作根文件系统映像文件
使用以下命令安装好 yaffs 文件系统制作工具:
tar –zxvf mkyaffs2image.tgz –C /
在/opt/MyARM 目录下,使用命令 mkyaffs2image rootfs rootfs.img 生成根文件系统映像文件。