移植環境:
ubuntu14.04
arm-linux-gcc-4.3.2
u-boot使用前面一直的u-boot-2012.04.01
參考:《嵌入式完全開發手冊》
windows下sourceInsight建立,包含如下目錄:
arch/arm/boot、common、configs、include、kernel、lib、include/
一、修改、編譯測試
1.1 修改Makefile
原來: ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
更改後:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
1.2 選擇默認配置 : make s3c2410_defconfig
1.3 make uImage
使用NFS下載時,如果有以下問題:
ERROR: Cannot umount
解決辦法:
/etc/host 添加:目標板ip,共享目錄
10.170.41.110 /work/nfs_root/
1.4查看編譯所支持的單板:
virtual-machine:/work/linux-3.4.2/arch/arm$ find -name "mach*.o"
machid 定義處: vi include/generated/mach-types.h
mach-types.h是由以下兩個文件生成,存放的是各個板級信息.
/arch/arm/tools/gen-amch-types /arch/arm/tools/mach-types
在這裡可以查看,例如mini2440的mach-types中number是1999對應mach-types中的machid就是7cf、smdk2440為16a
u-boot中可以通過:set machid 7cf來設置所選擇的單板
1.5燒寫內核
nfs或者tftp都可以
nfs 32000000 10.170.41.120:/work/nfs_root/uImage;bootm 32000000
bootm 32000000
1.6啟動後亂碼
1)修改啟動參數:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
2)修改後選擇mini2440可以正常顯示,smdk2440晶振選擇的不是12M,所以無法正常啟動,使用其它板子或者晶振的要注意這裡,找到自己開發板定義處,然後修改晶振頻率
arch/arm/mach-s3c24xx\mach-smdk2440.c
s3c24xx_init_clock(16934400)
改為
s3c24xx_init_clock(16934400)
1.7燒寫文件系統
因為YAFFS2文件系統默認沒有編譯進內核,所以先燒寫JFFS2文件系統
nfs 30000000 10.170.41.120:/work/nfs_root/first_fs.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 3e2724 或者nand write.jffs2 30000000 260000 $filesize
注意分區:mini2440的分區與原來u-boot的分區不同。
到此處內核正常、可以掛載jffs2文件系統、掛載不上的換一個其它的jffs2文件系統試一下。
實在掛載不上也沒關系,這裡只是確認內核啟動是否正常、後面有制作對應的文件系統教程。
二、修改分區
找到各個板子對應的分區文件,然後根據自己的需要做修改就可以了。
因為編譯出來的內核超出2M,所以將kernel分區擴展為5M,測試時使用nfs下載到SDRAM中,
可以不用該分區大小,到最後把內核裁剪到2M以下再燒寫到nand flash中也可以。
要注意:內核中將分區修改到5M以後,u-boot也要做對應的分區修改,否則使用讀寫、擦除命令時,對應的分區信息有誤。
smdk2440的分區在samsung的smdk公用文件下:
smdk2440:arch\arm\mach-s3c24xx\Common-smdk.c:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset
= 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x500000,//或者SZ_2M
},
[3] = {
.name = "rootfs",
.offset
= MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
mini2440的在linux-3.4.2\arch\arm\mach-s3c24xx\Mach-mini2440.c
/* NAND Flash on MINI2440 board */
static struct mtd_partition mini2440_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset
= 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x500000;//或者SZ_2M
},
[3] = {
.name = "rootfs",
.offset
= MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
u-boot中修改分區:
/include/configs/smdk2440.h
#define MTDPARTS_DEFAULT "mtdparts=mini2440-0:256k(u-boot),"
\
"128k(params),"
\
"5m(kernel),"
\
"-(rootfs)"
\
三、制作文件系統
1.交叉編譯busybox
make menuconfig :設置編譯方式 arm-linux-
make
將busybox安裝到指定目錄: make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
2.安裝庫
查看gcc庫:
virtual-machine:/usr/local/arm/4.3.2$ find -name lib
以下是所有的lib庫
./arm-none-linux-gnueabi/libc/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
./arm-none-linux-gnueabi/libc/thumb2/usr/lib
./arm-none-linux-gnueabi/libc/thumb2/lib
./arm-none-linux-gnueabi/libc/lib
./arm-none-linux-gnueabi/lib
./lib
選擇需要的lib庫
mkdir /work/nfs_root/fs_mini_mdev_new/lib
mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p //-p可以 一次性創建上下級目錄
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d
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
3. 構造etc目錄
1)構建etc/inittab文件 啟動後第一個文件
#/etc/inittab
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
2)/etc/init.d/rcS
#!/bin/sh
ifconfig eth0 10.170.41.110
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
3)etc/fstab
# device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4、 構建dev目錄
console,null文件:
/fs_mini_mdev_new/etc/dev$ sudo mknod console c 5 1
/fs_mini_mdev_new/etc/dev$ sudo mknod null c 1 3
5. 其他目錄
/fs_mini_mdev_new$ mkdir proc tmp mnt sys root
/fs_mini_mdev_new$ls -l
bin dev etc lib linuxrc mnt proc root sbin sys tmp usr
6.生成文件系統
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
燒寫測試
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 //設置啟動時掛載的文件系統,yaffs2可以不用設置
nfs 30000000 10.170.41.120:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 $filesize
7. 配置內核支持EABI
測試結果,掛載時有問題
VFS: Mounted root (jffs2 filesystem) on device 31:3.
Freeing init memory: 172K
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
非法指令 :
SIGILL illegal instruction
解決辦法:
linux: make menuconfig ->kernel feature->加上arm EABI選項
make uImage
重新編譯燒寫內核就沒問題了
四、移植YAFFS文件系統
1.獲得源碼
安裝git: sudo apt-get install git
或者源碼:git clone git://www.aleph1.co.uk/yaffs2
2.內核打yaffs2補丁
cd yaffs-dir (/work/yaffs2)
./patch-ker.sh c m linux-tree (/work/linux3.4.2)
3. 配置內核支持YAFFS2
filesystem
miscellaneous filesystem
yaffs2 file system support
4. 編譯uImage
make uImage
5. 制作文件系統映像:
mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
燒寫yaffs2文件系統
nfs 30000000 10.170.41.120:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 $filesize
如果系統沒有mkyaffs2image ,可以按照下面步驟制作:
制作mkyaffs2image工具:
cd system/util/Development_util_ok/yaffs2/utils/
make
然後生成mkyaffs2image,放到bin目錄加可執行權限
6.啟動
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 10.170.41.120:/work/nfs_root/uImage_yaffs2
bootm 32000000
7.mini2440測試文件系統掛載成功
這裡如果出現掛載不上的話,有可能是u-boot做的有問題、上一篇文章提到u-boot燒寫yaffs2文件系統時,缺少判斷條件,將oob燒寫到正常文件存儲區
做一下修改:nand_util.c中
if (!need_skip && !(flags & WITH_DROP_FFS))
改為:
if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags &WITH_YAFFS_OOB))
五、內核裁剪
原內核大小:2486760 2.4M
1.無關的單板
保留mini2440、smdk2440、smdk244***...
2.無關的文件系統
去掉ext2、ext3、....
裁剪完2.2M
下面是可以裁剪的部分,裁剪完不影響內核正常工作,大家可以參照著裁剪一下,裁剪完就2M以下了。
但是3.4.2內核編譯完成太大,如果以後還有其它擴展的話肯定超出2M。
所以推薦修改分區,將內核分區擴展一下,記得要修改u-boot對應的分區
usbcore: registered new interface driver libusual ~~~
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
USB Serial support registered for generic
usbserial: USB Serial Driver core
usbcore: registered new interface driver ftdi_sio
USB Serial support registered for FTDI USB Serial Device
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
usbcore: registered new interface driver pl2303
USB Serial support registered for pl2303
mousedev: PS/2 mouse device common for all mice
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
lp: driver loaded but no devices found
ppdev: user-space parallel port driver
Floating point emulation
<*> FastFPE math emulation (EXPERIMENTAL
Userspace binary formats
<*> Kernel support for a.out and ECOFF binaries
Networking --->
Networking options
[*] IP: multicasting
[*] IP: BOOTP support
<*> IP: IPsec transport mode
<*> IP: IPsec tunnel mode
<*> IP: IPsec BEET mode
[*] TCP: advanced congestion control --->
Networking support
Wireless
[*] Enable LED triggers
Block devices
<*> Loopback device support
SCSI device support
<*> SCSI device support
Cryptographic API
[*] Hardware crypto devices --->
Enable the block layer
[*] Support for large (2TB+) block devices and files
Userspace binary formats
[ ] Write ELF core dumps with partial segments
LCD開機界面
Device Drivers
[ ] Bootup logo --->
六、重燒整個系統
制作u-boot_new.bin, uImage_new, fs_mini_mdev_new.yaffs
依次燒寫到開發板中
u-boot
1)使用jtag燒寫u-boot_new.bin
2)使用舊的u-boot更新自己
3)燒寫uImage、fs
1)nfs
nfs 30000000 10.170.41.120:/work/nfs_root/uImage_new
nand erase.part kernel
nand write 30000000 kernel
2)tftp
tftp 30000000 uImage_new
nand erase.part kernel
nand write 30000000 kernel
七、制作補丁
大家搞完後,一定要記得制作補丁、因為當你換個環境後肯定不會將原工程拷貝過去,而且就算是拷貝也挺麻煩的,使用補丁文件,然後自己下載源碼包就可以解決問題了
cp .config config_back保存一下配置文件
make distclean
制作補丁文件:diff -urN linux-3.4.2 linux-3.4.2_100ask > linux-3.4.2_100ask.patch
打補丁:patch -p1 < ../linux-3.4.2_100ask.patch