Step 1 环境变量
建立交叉编译工具链,并设定工作目录
解压交叉编译工具至目标目录
#tar xvfj EABI-4.3.3_EmbedSky.tar.bz2
将文件转移到/opt中放置
设定工作目录
#export PATH=/opt/EmbedSky/4.4.3/bin:$PATH
Step 2 ARM支持
解压系统源码
添加ARM编译环境支持
修改Makefile文件,表明体系结构是ARM,编译器是arm-linux-gcc
ARCH = arm
CROSS_COMPILE = arm-linux-
Step 3 修改平台时钟
arch/arm/mach-s3c2440/mach-smdk2440.c
修改参数16934400->12000000(12MHz外部时钟输入)
s3c24xx_init_clocks(16934400);
Step 4 配置内核
#make menuconfig
出错:Unable to find the ncurse libraries or the required header files
说明缺少一个ncurse库,貌似是图形终端相关,下载ncurses-5.7并解压
生成Makefile并编译
#./configure
#make
发生错误/bin/sh: -I../c++: not found
重新生成Makefile并再次编译
#./configure --without--cxx--binding
#make
安装
#make install
再次执行make menuconfig成功,进入图形配置界面
调用默认配置单arch/arm/configs/s3c2410_defconfig
Load an Alternate Configuration File
配置内核并保存为.config
千万在S3C2440选项里面选中SMDK2440,否则会出现机器码不匹配
Step 5 修改机器码
arch/arm/tools/mach-types
将s3c2440这一行的机器码改为168,这样可以与uboot中设定的机器码匹配
Step 6 编译镜像
#make zImage
生成的镜像保存在arch/arm/boot里
Step 7 NANDFlash驱动移植
arch/arm/plat-s3c24xx/common-smdk.c
修改结构smdk_default_nand_part[],设定分区表
static struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "Uboot",
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = "Kernel",
.offset = 0x00200000,
.size = 0x00300000,
},
[2] = {
.name = "Yaffs2",
.offset = 0x00500000,
.size = MTDPART_SIZ_FULL,
},
};
禁止ECC校验
打开drivers/mtd/nand/s3c2410.c
chip->ecc.mode = NAND_ECC_SOFT
改为
chip->ecc.mode = NAND_ECC_NONE
在内核配置中Device Drivers中选中NAND Device的支持
Step 8 添加YAFFS2支持
下载yaffs2补丁cvs-root.tar.gz,解压,打上补丁
#./pathc-ker.sh /opt/EmbedSky/linux-2.6.30.4/
在内核配置中选中YAFFS2支持
Step 9 编译BusyBox
下载busybox-1.20以上版本(低版本似乎有问题),解压,修改Makefile
CROSS_COMPILE = arm-linux-
ARCH = arm
#make menuconfig
似乎配置中要选择静态链接库,不然会有问题,还有关于不同shell的,这次移植没碰到(-_-)
获得busybox文件系统目录
make;make install
Step 10 构建文件系统
创建root作为文件系统目录,里面新建一些重要目录,把busybox里_install目录里的bin,sbin,usr和linuxrc拷贝过来,在usr下面创建lib和share目录
/dev
内核挂载完文件系统后会用mdev建立,不过mdev调用init进程启动,而init需要用到/dev/console和/dev/null,所以要在制作文件系统时静态创建
#mknod console c 5 1
#mknod null c 1 3
/etc
存放系统配置文件
--fstab
挂载的文件系统
#device mount-point type options dump fsckorder
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
--group
组信息
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:sky
501:x:501:sky
--inittab
#/etc/inittab
::sysinit:/etc/init.d/rcS
tq2440_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
需要可执行权限
#chmod 777 inittab
--passwd
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp
bin:*:1:1:bin:/bin
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
sky::502:502:Linux User:/home/sky:/bin/sh
--profile
#Ash profile
#vim:syntax=sh
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h\W]#'
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
--mdev.conf
sd[a-z]*[0-9] 0:0 0600 @(mount -t vfat -o iocharset=utf8 /dev/$MDEV/udisk
sd[a-z]*[0-9] 0:0 0600 @(umount /udisk)
mmcblk[0-9]*p[0-9] 0:0 0600 @(mount -t vfat -o iocharset=utf8 /dev/$MDEV/sddisk
mmcblk[0-9]*p[0-9] 0:0 0600 @(umount /sddisk)
--/init.d/rcS
开机脚本
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
需要可执行权限
#chmod 777 inittab
--/init.d/httpd
#!/bin/sh
base=boa
case "$1" in
start)
/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
--sysconfig/HOSTNAME
EmbedSky
/lib
将交叉编译工具链库文件拷贝过来
Step 11 修改串口驱动
内核支持2个串口UART0和UART1,UART2的驱动是针对红外接口的,须作修改
arch/arm/macn-s3c2440/mach-smdk2440.c第100行
.ulcon = 0x03
drivers/serial/samsung.c第53行添加#include <mach/regs-gpio.h>
第433行添加
if (port->line == 2)
{
s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);
s3c2410_gpio_pullup(S3C2410_GPH6, 1);
s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH6_RXD2);
s3c2410_gpio_pullup(S3C2410_GPH7, 1);
//设置UART2为串口功能
}
第888行修改为
static struct uart_driver s3c24xx_uart_drv = {
...
.dev_name = "tq2440_serial",
...
}
这样,可以引导内核,然后进入文件系统。
这次移植后来系统不断重启,原来是配置中没有禁止看门狗,配置一下即可。