移植Linux3.4.2版本內核到mini2440

一. 內核啓動流程,據此配置內核(機器ID)
1. 獲取內核源碼 www.kernel.org
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.2.tar.bz2
2. 解壓內核
# tar xjvf linux-3.4.2.tar.bz2
3. 修改頂層Makefile,指定交叉編譯器
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
4. 使用默認配置編譯內核,可使用如下命令查看內核有哪些默認配置
# find -name “*defconfig”
使用缺省內核配置文件,s3c2410_defconfig 是SMDK2410 的缺省配置文件
# make s3c2410_defconfig
編譯、測試
# make uImage
拷貝uImage到tftpboot目錄
# cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2
下載、啓動內核
# tftp 32000000 uImage_3.4.2
# bootm 32000000
結果,啓動後會產生亂碼,原因是bootargs參數並未指定串口波特率,修改bootargs如下即可正常啓動看到輸出
# set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
5. 修改晶振頻率
# vim arch/arm/mach-s3c24xx/mach-smdk2440.c
–s3c24xx_init_clocks(16934400);
++s3c24xx_init_clocks(12000000);
編譯、測試
# make s3c2410_defconfig //支持內核較多
# make uImage

    # set machid 16a                        //SMDK2440的機器ID
    # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    # tftp 32000000 uImage_3.4.2
    # bootm 32000000
可正常輸出內核啓動信息,說明串口工作正常

二. 修改分區, 製作新的文件系統
2.1 修改分區,和我修改後的u-boot-2012.04.01一致,參考友善之臂文檔《Mini2440 Linux移植開發實戰指南.pdf》
0x00000000-0x00060000 : “bootloader”
0x00060000-0x00080000 : “params”
0x00050000-0x00580000 : “kernel”
0x00580000- : “root”
# vim arch/arm/mach-s3c24xx/common-smdk.c
點擊(此處)摺疊或打開
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “bootloader”,
.size = SZ_256K + SZ_128K,
.offset = 0,
},
[1] = {
.name = “params”,
.offset = SZ_256K + SZ_128K,
.size = SZ_128K,
},
[2] = {
.name = “kernel”,
.offset = SZ_512K,
.size = 0x00500000,
},
[3] = {
.name = “root”,
.offset = SZ_512K + 0x00500000,
.size = MTDPART_SIZ_FULL,
},
};
編譯、測試
# make uImage
# cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2

        # setenv bootcmd 'tftp 32000000 uImage_3.4.2;bootm 32000000'
        # boot
可看到打印出如下分區信息

點擊(此處)摺疊或打開
List of all partitions:
1f00 384 mtdblock0 (driver?)
1f01 128 mtdblock1 (driver?)
1f02 5120 mtdblock2 (driver?)
1f03 1042944 mtdblock3 (driver?)

    燒寫文件系統、測試fs_mini_mdev.yaffs2<該文件系統來自韋東山老師的教程>
        # tftp 32000000 fs_mini_mdev.yaffs2
        # nand erase.part root
        # nand write.yaffs 32000000 0x580000  $filesize
    測試
        # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
        # setenv bootcmd 'tftp 32000000 uImage_3.4.2;bootm 32000000'
        # boot
    結果:
        No filesystem could mount root, tried:  ext3 ext2 cramfs vfat msdos iso9660 romfs

    測試jffs2 
        # tftp 32000000 fs_mini_mdev.jffs2
        # nand erase.part root
        # nand write.jffs2 32000000 580000  $filesize
        # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
        # boot
    不能使用

2.2 製作根文件系統  
    ①   編譯安裝busybox
            編譯  busybox-1.20.0.tar.bz2
            # tar xjvf busybox-1.20.0.tar.bz2
            # cd busybox-1.20.0
            # make menuconfig
                Busybox Settings  ---> 
                    Build Options  ---> 
                        ()  Cross Compiler prefix 
                                填入arm-linux-  
        保存、退出,執行make
            # make
        創建文件系統目錄
            # cd /work/nfsroot
            # mkdir fs_mini_mdev_new
        安裝
            # make install CONFIG_PREFIX=/work/nfsroot/fs_mini_mdev_new
    ②   安裝libc庫,使用arm-linux-gcc 4.3.2 中的庫文件
            # cd /work/nfsroot/fs_mini_mdev_new
            # mkdir lib
            # cd lib
            # cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* ./ -d 
            # cd ../
            # mkdir usr/lib -p
            # cd usr/lib
            # cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* ./ -d

    ③   構建etc目錄 
            # cp -rf ../fs_mini_mdev/etc ./
        修改inttab
            # vim inittab
                將s3c2410_serial0改爲console
    ④   構建dev目錄 
            # mkdir dev
            # cd dev
            # mknod console c 5 1 
            # mknod null c 1 3
    ⑤   創建其他目錄
            # mkdir proc tmp mnt sys root

    ⑥   製作jffs2根文件系統,參考《嵌入式Linux應用開發完全手冊》
            # mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2 
    ⑦   燒寫測試
            # cp fs_mini_mdev_new.jffs2 /work/tftpboot
            # tftp 32000000 fs_mini_mdev_new.jffs2
            # nand erase.part root
            # nand write.jffs2 32000000 580000  $filesize
            # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
            # boot
    ⑧   結果
            Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
    出錯、退出

解決方法
配置內核
    # make menuconfig
        Kernel Features  --->  
            [*] Use the ARM EABI to compile the kernel  //選中該項
    # make uImage
    # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2_eabi

測試
        # tftp 32000000 uImage_3.4.2_eabi
        # bootm 32000000
可正常啓動
        Please press Enter to activate this console. 
        / # 

三. 移植YAFFS文件系統
獲取yaffs2源碼
# git clone git://www.aleph1.co.uk/yaffs2
給內核打yaffs2補丁,參考readme
# cd yaffs2
# ./patch-ker.sh c m /work/kernel/linux-3.4.2
配置內核使其支持yaffs2文件系統
# make menuconfig
File systems —>
[*]Miscellaneous filesystems —>
<*> yaffs2 file system support
# make uImage

製作yaffs2根文件系統 
    # mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
    # mv fs_mini_mdev_new.yaffs2 /work/tftpboot/
    # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2_yaffs2
燒寫Yaffs2文件系統
    # tftp 32000000 fs_mini_mdev_new.yaffs2
    # nand erase.part root                                          //擦除root分區
    # nand write.yaffs 32000000 580000  $filesize          //親測用nand write.jffs2會出錯,找不到init進程

啓動內核
    # tftp 32000000 uImage_3.4.2_yaffs2
    # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    # bootm 32000000 

可修改bootcmd參數便捷啓動
# setenv bootcmd ‘tftp 32000000 uImage_3.4.2_yaffs2;bootm 32000000’

四. 裁剪內核
查看現在內核大小
# ls arch/arm/boot/uImage -l
-rw-r–r– 1 root root 2486104 Dec 30 22:41 arch/arm/boot/uImage
# make menuconfig //去掉不需要的項
a. 去掉不需要支持的單板
System Type —>
SAMSUNG S3C24XX SoCs Support —>
* S3C24XX SoCs *
[ ] SAMSUNG S3C2410
[ ] SAMSUNG S3C2412
[ ] SAMSUNG S3C2416/S3C2450
[*] SAMSUNG S3C2440
[ ] SAMSUNG S3C2442
[ ] SAMSUNG S3C2443
* S3C2440 Boards *
[ ] Simtec Electronics ANUBIS
[ ] Avantech AT2440EVB development board
[*] MINI2440 development board
[ ] NexVision NEXCODER 2440 Light Board
[ ] Simtec IM2440D20 (OSIRIS) module
[ ] HP iPAQ rx3715
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module

b.  裁剪對文件系統的支持
    File systems  ---> 
        < > Second extended fs support                          //去掉對ext2的支持
        < > Ext3 journalling file system support                //去掉對ext3的支持
        DOS/FAT/NT Filesystems  --->                         //不作修改,對U盤的支持需要
c.  裁剪對驅動的支持
    Device Drivers  ---> 
        Input device support  ---> 
            [ ]     Provide legacy /dev/psaux device    //delete
            [ ]   Mice  --->                                    //delete
            [ ]   Keyboards  --->                               //delete
 d.繼續裁剪
    File systems  ---> 
            CD-ROM/DVD Filesystems  --->
                < > ISO 9660 CDROM file system support  //去掉對光盤的支持
            [*] Miscellaneous filesystems  ---> 
                < >   Compressed ROM file system support (cramfs)   //delete
                [ ]     Include support for ZLIB compressed file systems    //delete
                < >   ROM file system support //delete
    Device Drivers  --->
        Input device support  ---> 
            [*]   Touchscreens  --->
                <*>   Samsung S3C2410/generic touchscreen input driver  //配置上該項
                < >   USB Touchscreen Driver    //delete

    Device Drivers  --->
            <*> Sound card support  ---> 
            <*>   Advanced Linux Sound Architecture  ---> 
            [ ]   USB sound devices  --->   //delete
    Device Drivers  --->
            [*] USB support  --->
                    [ ]   The shared table of common (or usual) storage devices     //delete
    保存、退出編譯內核
    # make uImage
    # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2_sm
燒寫內核
    # tftp 30000000 uImage_3.4.2_sm
    # nand erase.part kernel; nand write 30000000 kernel
啓動內核
    # set bootcmd 'nand read 30000000 kernel;bootm 30000000'
    # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    # set machid 16a
    # save
    # boot

原文地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章