linux 2.6.22.1 在s3c2410平台的移植

[ 802 查看 / 2 回复 ]

----------------------------------------------
bootloader
编译环境:
vivi
版本:0.1.4
交叉编译器(CROSS-COMPILE)版本:2.95.3
(下载地址略:网上很多搜下。)
操作系统:Fedora  7
======================================
linux
内核编译环境:
内核版本:linux2.6.22.1
交叉编译器(CROSS-COMPILE)版本: 4.2.0
(下载地址:
  http://www.codesourcery.com/gnu_toolchains/arm/download.html

注意:下载选项,要选 ARM EABI 的选项,和 IA32 GNU/linux
操作系统: Fedora  7
======================================
文件系统编译环境:
busybox1.5.1
,或1.4.2
交叉编译器(CROSS-COMPILE)版本: 3.3.2
(下载地址:http://linux.omap.com/pub/toolchain/
操作系统: Fedora  7
----------------------------------------------
硬件:
板子是中嵌科技的CE24101
   
内存:    64MB SDRAM2×16M×16位);
    CPU
      S3C2410 ARM处理器,
    Nor Flash
2MBNor Flash,用于固化测试程序(用来下载bootloader,内核,或文件系统);
    NANDflash: 64MB
Nand Flash,用于存储BootloaderLinux内核及文件系统、应用程序和数据;
===============================================================
   
一:
编译环境搭建
===============================================================
一:搭建交叉编译环境
说明:由于编译交叉编译环境比较繁琐,建议大家用已经编译好的交叉编译环境。
下面以3.3.2的交叉编译环境的搭建为例,其他的两个的编译器环境搭建一样。


1. 解压文件命令:
        tar  jxvf  obsolete-gcc-3.3.2.tar.bz2
     
obsolete-gcc-3.3.2.tar.bz2下载地址:http://linux.omap.com/pub/toolchain/


2. 把解压的文件夹中的 “3.3.2”文件夹拷贝到 /usr/local/arm目录下
(如果没有arm目录就新建arm目录,但是一定要是拷贝到这个目录,不然不能运行)。


3. 在命令窗口输入
        export PATH=/usr/local/arm/3.3.2/bin:$PATH


4. 如果输入 arm
然后按下tab键能自动补全命令 armlinux
说明搭建成功。


===============================================================
     
二:    bootloader 编译
===============================================================


二:  bootloader的修改


主要修改分区信息,如果要能下载yaffs文件系统还得另外打补丁,最近我会写编这样的文章。
具体修改:


1.    解压vivi(具体命令略,如果你解压都不会,移植可能对你来说有点困难)
      [root@localhost vivi]# ls
      arch    CVS            drivers  init  Makefile        Rules.make  test  vivi      vivi.map
      COPYING  Documentation  include  lib  Makefile.newSDK  scrīpts    util  vivi-elf


2.    [root@localhost vivi]# vim ./arch/s3c2410/smdk.c
修改 NAND flash 分区如下:
----------------------------------------------------------------------
mtd_partition_t default_mtd_partitions[] = {
        {
                name:          "bootloader",
                offset:        0,
                size:          0x00020000,
                flag:          0
        }, {
                name:          "param",
                offset:        0x00020000,
                size:          0x000E0000,
                flag:          0
        }, {
                name:          "kernel",
                offset:        0x00100000,
                size:          0x00300000,
                flag:          0
        }, {
                name:          "root",
                offset:        0x00400000,
                size:          0x01400000,
                flag:          MF_BONFS
        }, {
                name:          "user",
                offset:        0x01800000,
                size:          0x02C00000,
                flag:          MF_BONFS
        }
};
-------------------------------------------------------------------------


3. 修改Makefile
[root@localhost vivi]# vim Makefile
修改  ARCH    LINUX_INCLUDE_DIR  CROSS_COMPILE 如下:
------------------------------------------------------------------------
ARCH := arm
LINUX_INCLUDE_DIR      = /usr/local/arm/2.95.3/include/
CROSS_COMPILE  = /usr/local/arm/2.95.3/bin/arm-linux-

TOP
凌阳教育嵌入式培训

3. 编译
[root@localhost vivi]# make


------------------------------------------------------------------------
会在 vivi目录生成你要的 vivi 程序(bootloader
------------------------------------------------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明:我的nand falsh的一块为16k
所以上面的分区:


**************************************
 
分区信息
**************************************
bootloader
  128k
param   
  896k
kernel   
  3M
root     
  20M
user     
  40M


**************************************
  bon
操作
**************************************
bon part 0 1M 4M:m 24M:m


解释一下上面的命令:
       
1个分区从0开始;
       
2个分区从0x30000(192K)开始;
       
3个分区从0x200000(2M)开始;
       
4个分区从0x400000(4M)开始.
***********************************
  bon part info
***********************************


bon part info
BON info. (4 partitions)
N offset      size            flags    bad
---------------------------------------------
  0: 0x00000000  0x00100000      00000000    0    1M
  1: 0x00100000  0x00300000      00000000    0    3M
  2: 0x00400000  0x01400000      00000001    0  20M
  3: 0x01800000  0x027fc000      00000001    0  39M+1008k


***********************************
  part show
***********************************
mtdpart info. (5 partitions)
name              offset        size        flag
------------------------------------------------
bootloader      : 0x00000000    0x00020000    0  128k
param          : 0x00020000    0x000e0000    0  896k
kernel          : 0x00100000    0x00300000    0    3M
root            : 0x00400000    0x01400000    4  20M
user            : 0x01800000    0x02c00000    4  44M
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
==============================================================
     
三:
内核
编译
===============================================================


三:
内核
编译
注意:用的编译器是4.2.0的交叉编译器


1. 修改 Makefile
[root@localhost porting]# cd linux-2.6.22
[root@localhost linux-2.6.22]# vim Makefile
修改 ARCH CROSS_COMPILE
--------------------------------------------------------------
ARCH            ?= arm
CROSS_COMPILE  ?=/usr/local/arm/4.2.0/bin/arm-none-eabi-


2. 修改common-smdk.c文件
[root@localhost linux-2.6.22]# vim arch/arm/plat-s3c24xx/common-smdk.c
------------------------------------------------------------------------------
static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name  = "Boot",
                .size  = SZ_128K,
                .offset = 0,
        },
        [1] = {
                .name  = "param",
                .offset = MTDPART_OFS_APPEND,
                .size  = SZ_1M - SZ_128K,
        },
        [2] = {
                .name  = "kernel",
                .offset = SZ_1M,
                .size  = SZ_1M * 3,
        },
        [3] = {
                .name  = "root",
                .offset = MTDPART_OFS_APPEND,
                .size  = SZ_2M * 10,
        },


/*
      ,
        [5] = {
                .name  = "S3C2410 flash partition 5",
                .offset = SZ_1M * 14,
                .size  = SZ_1M * 10,
        },
        [6] = {
                .name  = "S3C2410 flash partition 6",
                .offset = SZ_1M * 24,
                .size  = SZ_1M * 24,
        },
        [7] = {
                .name  = "S3C2410 flash partition 7",
                .offset = SZ_1M * 48,
                .size  = SZ_16M,
        }
*/


};
---------------------------------------------------------------------------------


3. 去掉nand flash ECC
[root@localhost linux-2.6.22]# vim drivers/mtd/nand/s3c2410.c
---------------------------------------------------------------------------------
1
、打开drivers/mtd/nand/s3c2410.c
2
、搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里
3
、修改NAND_ECC_SOFTNAND_ECC_NONE
---------------------------------------------------------------------------------


4. 支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/devdevfs文件系统。
[root@localhost linux-2.6.22]# vi fs/Kconfig
-----------------------------------------------------------------------------------
找到menu "Pseudo filesystems"
添加如下语句:
config DEVFS_FS
  bool "/dev file system support (OBSOLETE)"
  default y
config DEVFS_MOUNT
  bool "Automatically mount at boot"
  default y
  depends on DEVFS_FS
----------------------------------------------------------------------------------


5. 编译内核
[root@localhost linux-2.6.22]# cp ./arch/arm/configs/s3c2410_defconfig  .config
[root@localhost linux-2.6.21.5]#  make  xconfig

----------------------------------------------------------------------------------
Userspace binary formats
        [ ]Kernel support for a.out and ECOFF binaries (BINFMT_AOUT)
(去除该选项)


Boot options
  Default kernel command string
 
改成:
  noinitrd root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
再选上你想选的选项,如果编译通不过,对照着错误,看下把哪些选项去除,或添加哪些选项。
-----------------------------------------------------------------------------------


6. 编译
[root@localhost linux-2.6.22]# make zImage


============================================================
     
四:
文件系统的制作
===============================================================
四:
文件系统的制作
注意:交叉编译器 3.3.2  busybox1.5.1
静态编译
编译更详细的内容:http://bbs.ss.pku.edu.cn/ss/inde ... e_itemid_11825.html


1. busybox的编译
-----------------------------------------------------------------------------

修改busybox中的 Makefile文件
找到  ARCH  CROSS_COMPILE 修改成如下
ARCH            ?= arm
CROSS_COMPILE  ?= /usr/local/arm/3.3.2/bin/arm-linux-

TOP


配置


[root@localhost busybox-1.4.2]# make defconfig
[root@localhost busybox-1.4.2]# make xconfig
=============================================
修改配置
主要修改如下
=============================================
Busybox Settings
    Build Options
    Build BusyBox as a static binary   
      //
选此项静态编译。

Miscellaneous Utilities
    []taskset    //
选了就会出错


-------------------------------------------------

编译
[root@localhost busybox-1.5.1]# make all install
-----------------------------------------------------------------
最后会在  busybox-1.5.1/_install/目录生成你要的 bin sbin  usr 目录
------------------------------------------------------------------
2.
编写linuxrc 文件
-----------------------------------------------------------------
#!/bin/sh
#e cho "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc


echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3  /


#mount some file system
echo "mount  /dev/shm as tmpfs"
/bin/mount -n -t  tmpfs tmpfs /dev/shm


#挂载/procproc文件系统
echo "mount /proc as proc"
/bin/mount -n -t  proc none /proc


#挂载/syssysfs文件系统
echo "mount  /sys as sysfs" 
/bin/mount -n -t  sysfs none /sys


/bin/mount -f -t ramfs ramfs /etc


echo "yaffs is mounted"
/bin/mount -t yaffs /dev/mtdblock/1 /mnt/yaffs
exec /sbin/init
---------------------------------------------------------------------
3.
权限修改
chmod  chmod 775 linuxrc


4.  编写 inittab文件
---------------------------------------------------------------------
::sysinit:/etc/init.d/rc
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
tty0::askfirst:-/bin/sh
  ::restart:/sbin/init
        ::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
----------------------------------------------------------------------


5. rc文件
----------------------------------------------------------------------
#!/bin/sh


/bin/mount -a
-----------------------------------------------------------------------


6. fastab 文件
----------------------------------------------------------------------
none  /proc  proc defaults 0 0
none  /dev/pts devpts mode=0622 0 0
tmpfs  /dev/shm tmpfs defaults 0 0
----------------------------------------------------------------------


7. 各文件的关系
----------------------------------------------------------------------
7.1
建立一个目标板的空根目录
我们将在这里构建构建根文件系统,创建基础目录结构. 存放交叉编译后生成的目标应用程序
BUSYBOXTINYLOGIN),存放库文件等。
[root@localhost rootfs]# mkdir my_rootfs
[root@localhost rootfs]# pwd
/home/arm/dev_home/rootfs/my_rootfs
[root@localhost rootfs]# cd my_rootfs
[root@localhost my_rootfs]#
7.2
my_rootfs中建立Linux目录树
[root@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr
[root@localhost my_rootfs]#mkdir mnt/etc
[root@localhost my_rootfs]#mkdir usr/bin usr/lib usr/sbin
[root@localhost my_rootfs]#touch linuxrc
[root@localhost my_rootfs]#tree
|bin
|dev
|etc
|home
|lib
|linuxrc
/*
此文件为启动脚本,是一shell脚本文件。本文后面有专门介绍 */
|mnt
| `etc 
|proc
|sbin
|sys
|tmp
|root
`usr
|bin
|lib
`sbin


8. 把上面编译出来的 busybox文件拷贝到 my_rootfs 文件系统
---------------------------------------------------------------
busybox1.5.1/_install/目录下的 bin  sbin  usr 覆盖 my_rootfs
文件夹里的空文件夹。
--------------------------------------------------------------


9. 5 生成的文件(rc)拷贝到 /mnt/etc/init.d/目录(先在/mnt/etc/目录新建格init.d目录)
46生成的文件(inittab fastab )放到 /mnt/etc/目录
2 生成的文件linuxrc 放到/目录
这里所提到的 /目录即my_rootfs目录。
10.
新建/dev设备,/dev目录(即my_rootfs/dev/.
mknod console c 5 1


8. 生成cramfs文件
----------------------------------------------------------------
下载mkfs.cramfs工具,然后用下面命令生成你要的cramfs文件系统
./mkfs.cramfs  ./my_rootfs    ./root.cramfs

TOP