歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux3.4.2移植

linux3.4.2移植

日期:2017/3/3 14:13:30   编辑:Linux技術

移植環境:

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

Copyright © Linux教程網 All Rights Reserved