zoukankan      html  css  js  c++  java
  • linux2.6.18内核S3C2410平台移植笔记

      我使用的实验箱是Embest EDUKIT-III,板上资源CPU:SAMSUNG S3C2410A、FLASH:K9F5608U0(Samsung NAND 32MiB),烧录工具:embest flash programmer。因为厂家自带的是2.4的内核,目前学习开发用的基本上都是2.6内核,这两者改动还是比较大的。电话咨询过技术支持后,对方说只想在板子上跑系统的话还是比较好移植的。于是决心自己动手移植内核。不然今后的驱动编写,都没有合适的运行环境,影响进度。所以工欲善其事,必先 利其器,前期的这些准备还是很有必要的。那几天刚好ubuntu10.10发布,满怀期待的我升完级后,结果悲剧了,中文显示变得发虚模糊,主题颜色也极度不适,还有那个ubuntu one的ribbon,恶心了好几天后,也没改好,都怪自己手贱,用的好好的系统升什么级啊。最终重装了系统,结果依然不行,崩溃啊,以为是驱动的问题,后来发现是language里没有安装中文支持,我倒。重新配置了各种开发工具后,下面开始步入正题。

       (一)首先是bootloader的移植,这里选择的是vivi-20030929(实验箱带的源码包),韩国人的产品,相比uboot比较简单,据说针对S3c2410做了设计。在网上参考了CalmArrow的vivi专题文章。victor_tlh的移植过程

       <1> 修改Makefile

    ARCH := arm
    LINUX_INCLUDE_DIR
    =/usr/host/arm/2.95.3/include
    CROSS_COMPILE
    = /usr/local/arm/2.95.3/bin/arm-linux-
    ARM_GCC_LIBS
    =/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
    LINUX_INCLUDE_DIR -- 更改为交叉编译器的include文件夹
    CROSS_COMPILE     -- 交叉编译器的可执行文件的路径
    ARM_GCC_LIBS      -- 交叉编译器的lib库文件的路径
         <2> 修改arch/s3c2410/smdk.c    这一部分主要是提供flash分区的信息。
    #ifdef CONFIG_S3C2410_NAND_BOOT
    mtd_partition_t default_mtd_partitions[]
    = {
    {
    name:
    "vivi",
    offset:
    0,
    size:
    0x00020000,
    //vivi size 128k
    flag: 0
    }, {
    name:
    "param",
    offset:
    0x00020000,
    size:
    0x00010000,
    //param size 64k
    flag: 0
    }, {
    name:
    "kernel",
    offset:
    0x00030000,
    size:
    0x002d0000,
    //kernel size 2m+832k
    flag: 0
    }, {
    name:
    "root",
    offset:
    0x00300000,
    size:
    0x00300000,
    //root size 3m
    flag: MF_BONFS
    }, {
    name:
    "jffs2",
    offset:
    0x00600000,
    size:
    0x01000000,
    //user size 16m
    flag: MF_JFFS2
    }
    };
    #endif
    并没有使用全部的flash。

    将此文件中的linux_cmd[ ]改为

    char linux_cmd[] = "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0";

    noinitrd:不使用initrd文件
    root=/dev/mtdblock3:代表nand flash的第4个分区,作为rootfs
    init=/linuxrc:启动初始化文件位置
    console=ttySAC0:控制台使用串口1

    这是一条传递给内核的信息,用于内核初始化。

         在这个文件夹下还有一处要改就是head.s ,不然vivi启动后,蜂鸣器会叫个不停。我把代码插在了#ifdef CONFIG_S3C2410_SMDK 之后,

    @@@@@@@@@@@@@@@@@@ Modified Start @@@@@@@@@@@@@@@@@@@@@

    @ buzzer off
    ldr r1,
    =0x56000010 @ GPBCON
    ldr r2,
    =0x155559
    str r2, [r1]
    ldr r2,
    =0x7ff
    str r2, [r1, #
    8]
    orr r2, r2, #
    0x01 @ buzzer off when high voltage(PWM1)
    str r2, [r1, #
    4]
    @@@@@@@@@@@@@@@@@@ Modified End @@@@@@@@@@@@@@@@@@@@@@@@@
     修改蜂鸣器也可以在别的地方,可以参考CalmArrow的文章。

     在init/version.c 中可以添加启动提示信息,

    const char *vivi_banner =
    "\n\r ^_^ well done! Go on --> \n\r\n\r"
    "VIVI version " VIVI_RELEASE " (" VIVI_COMPILE_BY "@"
    VIVI_COMPILE_HOST
    ") (" VIVI_COMPILER ") " UTS_VERSION "\r\n";
      <3> 接下来就是

    配置交叉编译vivi ,在vivi目录下生成vivi程序。

    #make distclean

    #make menuconfig

    #make

    接下来可以烧录vivi ,重启电源后通过part show 查看分区信息。

      (二) 2.6.18 内核的修改编译

    1.修改MTD分区信息

    修改linux-2.6.18.3/arch/arm/mach-s3c2410/common-smdk.c 文件中的分区信息,必须与开发板上的flash分区信息一致。

    static struct mtd_partition smdk_default_nand_part[] = {
    [
    0] = {

    .name
    = "vivi",

    .size
    = SZ_128K,

    .offset
    = 0,

    },

    [
    1] = {

    .name
    = "param",

    .offset
    = SZ_128K,

    .size
    = SZ_64K,

    },

    [
    2] = {

    .name
    = "kernel",

    .offset
    = SZ_128K + SZ_64K,

    .size
    = SZ_2M + SZ_64K * 13,

    },

    [
    3] = {

    .name
    = "root",

    .offset
    = SZ_1M * 3,

    .size
    = SZ_1M * 3,

    },

    [
    4] = {

    .name
    = "jffs2",

    .offset
    = SZ_1M * 6,

    .size
    = SZ_1M * 16,

    }
    };

    2.去掉nand flash 的ECC

    因为内核通过bootloader把数据写入NAND Flash,而vivi的ECC校验算法和内核不同,内核的校验码由nand flash 控制器产生,所以在此禁用NAND Flash 的ECC 。

    所以修改 drivers/mtd/nand/s3c2410.c 搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里
    修改NAND_ECC_SOFT为NAND_ECC_NONE。

    3.修改fs/Kconfig支持启动时挂载devfs

    因为2.6.12 以后的内核取消了devfs 的配置选项。缺少了它,内核找不到mtdblock设备。所以我们需要修改fs/Kconfig这个文件。 

    打开fs/ Kconfig文件,找到menu “Pseudo filesystem”
    在其中添加:

    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
    注意:bool default 与 depends前面是Table键

    4.修改Makefile文件

    ARCH ?=arm
    CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-

    5.配置内核产生.config文件
    为简化配置内核文件的复杂度,先复制到arch/arm/configs/smdk2410_defconfig到内核根目录下。

    #cp arch/arm/configs/smdk2410_defconfig .config

    #make menuconfig

    smdk2410_defconfig是内核源码中提供的一个s3c2410平台的配置信息,基本上是可以直接用的,也可以在这个配置的基础上加上自己需要的配置。

    内核配置:

    增删的内核配置选项如下:

    Loadablemodule suport--->

    [*]Enableloadable module suport

    [*]Automatickernel module loading

    SystemType--->[*]S3C2410 DMA suport

    Bootoptions --->Default kernel command string:

    noinitrdroot=/dev/mtdblock3 init=/linuxrc consolettySAC0,115200

    mtdblock3代表第四个flash分区,为root分区

    Floatingpoint emulation---->

    [*]NWFPEmath emulation

    #MTD子系统的配置

    DeviceDrivers--->

    Memory Technology Devices(MTD)--->

    ............................................

    [*]MTDpartitioning support

    [*]Commandline partition table parsing

    ............................................

    [*]RAM/ROM/Flashchip drivers-->

    <*>Detectflash chip by Common Flash Interface(CFI) prob

    <*>Detectnon-CFI AMD/JEDEC-compatible flash chip

    <*>Supportfor Intel/Sharp flash chip

    <*>Supportfor AMD/Fujitsu flash chip

    <*>Supportfor ROM chip in bus mapping

    NAND FlashDevice Drivers--->

    ................................

    <*>NANDDevice Support

    <*>NANDFlash support foe S3C2410/S3C2440 Soc

    Characterdevices--->

    .............................

    [*]Non-standardserial port support

    [*]S3C2410RTC Driver

    Filesystems--->

    <>Secondextended fs support #去除ext2支持

    Pseudofilesystems--->

    [*]Virtualmemory file system support(former shm fs)

    [*]/devfile system support(OBSOLETE)

    [*]Automaticallymount at boot(NEW)

    Miscellaneousfilesystems--->

    ............................

    <*>JFFS2

    <*>cramfs

    .............................

    NetworkFile Systems---->

    <*>NFSfile system support

    保存退出

    6.编译内核

    #make zImage

    (三)根文件系统的制作

    <1> 编译busybox

    有人用的是busybox1.6.0的版本,我编译的时候用的是arm-linux-gcc3.4.1 没有生成busybox_unstripped,link时出错。 没有解决,看邮件列表说busybox1.8以后修正了这个bug,

    试了很多版本都没有成功,后来以为是工具链的问题,因为网上用的是4.1.1的版本,于是又开始自己制作工具链,安装是gcc需要低版本,安装gcc编译出错。遂放弃了这个方法。

    后来选择了,busybox1.1.3 成功。

    make menuconfig
    Busybox Settings >
    General Configuration >
    [*] Support for devfs
    Build Options >
    [*] Build BusyBox as a static binary (no shared libs)
    /* 将busybox编译为静态连接,少了启动时找动态库的麻烦 */
    [*] Do you want to build BusyBox with a Cross Compiler?
    (/usr/local/arm/3.3.2/bin/armlinux)Cross Compiler prefix

    Init Utilities >
    [*] init
    [*] Support reading an inittab file
    /* 支持init读取/etc/inittab配置文件,一定要选上 */
    Shells >
    Choose your default shell (ash) >
    /* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件
    * linuxrc脚本的头一句:
    * #!/bin/sh 是由bin/sh来解释执行的
    */
    [*] ash
    Coreutils >
    [*] cp
    [*] cat
    [*] ls
    [*] mkdir
    [*] echo (basic SuSv3 version taking no options)
    [*] env
    [*] mv
    [*] pwd
    [*] rm
    [*] touch
    Editors >
    [*] vi
    Linux System Utilities >
    [*] mount
    [*] umount
    [*] Support loopback mounts
    [*] Support for the old /etc/mtab file

    linux install >

    [*]Don’t use /usr //这项也要选中

    Networking Utilities >
    [*] inetd
    /*
    * 支持inetd超级服务器
    * inetd的配置文件为/etc/inetd.conf文件,
    */
     编译并安装Busybox
    [arm@localhost busybox1.1.3]$
    make TARGET_ARCH=arm

    #make install

     在 busybox-1.1.3/_install/目录生成需要的 bin sbin usr 目录及相关文件。

    2.创建根文件系统必要的目录,编写相关的配置文件

    #mkdir myrootfs

    以myrootfs为目标根文件系统的根目录

    #cd myrootfs

    #mkdir dev etc home lib mnt proc sbin sys tmp root usr

    #mkdir etc/init.d

    #touch linuxrc

    将编译busybox生成的usr sbin bin三个目录拷贝到myrootfs下

    编写myrootfs目录下的linuxrc 脚本

    #!/bin/sh

    echo "mount /etc as ramfs"

    /bin/mount -n -t ramfs ramfs /etc

    /bin/cp -a /mnt/etc/* /etc/

    echo "re-create the /etc/mtab entries"

    /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /

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

    /bin/cp -a /mnt/etc/* /etc/

    exec /sbin/init

    #chmod 775 linuxrc

    进入etc目录,编辑inittab 文件

    #cd etc

    #vi inittab

    ::sysinit:/etc/init.d/rcS

    ::askfirst:/bin/sh

    tty2::askfirst:-/bin/sh

    tty3::askfirst:-/bin/sh

    tty4::askfirst:-/bin/sh

    tty0::askfirst:-/bin/sh

    ::restart:/sbin/init

    ::ctrlaltdel:/sbin/init

    ::shutdown:/bin/umount -a -r

    ::shutdown:/sbin/swapoff -a

    编辑 fstab 文件

    #vi fstab

    devpts                  /dev/pts                devpts mode=620        0 0

    tmpfs                   /dev/shm                tmpfs   defaults        0 0

    proc                    /proc                   proc    defaults        0 0

    sysfs                   /sys                    sysfs   defaults        0 0

    进入etc/init.d目录,编辑rcS 脚本

    #cd init.d

    #vi rcS

    echo "mount tmpfs /dev"

    /bin/mount -t tmpfs mdev /dev

    echo "mount devpts /dev/pts"

    /bin/mkdir /dev/shm

    /bin/mkdir /dev/pts

    /bin/mount -t devpts devpts /dev/pts

    echo "mount sysfs /sys"

    /bin/mount -t sysfs sysfs /sys

    echo /bin/mdev > /proc/sys/kernel/hotplug

    echo "mdev -s"

    /bin/mdev -s

    echo "yaffs is mounted"

    /bin/mount -t yaffs /dev/mtdblock/4 /mnt/yaffs

    /bin/mount -a

    #chmod 775 rcS

    在dev 下建立console 和 null设备节点

    # mknod console c 5 1

    #mknod null c 1 3

    #chmod 660 console

    #chmod 660 null

     也可以将一些常用的lib文件复制到rootfs/lib/目录下,比如:ld-2.5.so libc-2.5.so libcrypt.so.1 libgcc_s.so.1 libm.so.6 ld-linux.so.3 libcrypt-2.5.so libc.so.6 libm-2.5.so等文件或符号连接,在复制时应该注意采用图形化的界面复制活打包后解包方式复制。

     也可一将PC机系统中etc目录下的 passwd shadow group profile hosts services 等配置文件拷贝到myrootfs的etc目录下,将etc目录拷贝到mnt目录下,在mnt目录下建立yaffs目录

    这两步我没做。

    <3>生成cramfs 文件

    #mkcramfs myrootfs root.cramfs

    至此根文件系统做好了。

    (四)将vivi zImage root.cramfs烧写到开发板

    在windows下 打开超级终端,启动vivi;

    这时需要对flash重新分区,分区格式为bon

    vivi> bon part 0 128K 192K 3M:m 6M 22M

    数字表示每个分区的偏移量,:m 表示为MTDblock,用于根文件系统。

    通过vivi load命令将vivi, zImage ,rootfs.cramfs 烧写进flash中。

    vivi>load flash vivi x

    vivi>load flash kernel x

    vivi>load flash root x

    断电重启后,enter就应该可以进入shell

      期间遇到了boot kernel ... 后无反应,

      linuxrc 无法启动等问题。 整个移植过程从头到尾工作量其实并不是很大,但出错总是很讨厌。出错时,不着急,分析后google百度一下,在几将放弃之时也许就找到了解决的办法。

        下一步可以将jffs2做一下,开发板上资源的驱动。

    参考:

    http://hi.baidu.com/victor_tlh/blog/item/8aaadaee89ea0effb2fb95ae.html
    http://wenku.baidu.com/view/28125e6baf1ffc4ffe47ac2e.html
    http://blog.chinaunix.net/u/21948/showart_344254.html
    http://linux.chinaunix.net/techdoc/develop/2008/10/14/1038166.shtml
    http://hi.baidu.com/victor_tlh/blog/item/8409b79bd6b300b1c9eaf4af.html
    http://blog.chinaunix.net/u/22968/showart_336079.html
    http://hi.baidu.com/kdwyc/blog/item/eef1492a3c3cfd355243c174.html
    http://blog.csdn.net/JiangBo_HIT/archive/2009/05/06/4154436.aspx
    http://blog.csdn.net/Linux_Hunter/archive/2009/10/03/4630961.aspx
    
    

  • 相关阅读:
    [转]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器
    强制将IE,Chrome设置为指定兼容模式来解析(转)
    MySQL vs NoSQL 效率与成本之争(转)
    Configure the max limit for concurrent TCP connections
    在as3中Embed(绑定)flash动画元素
    使用ASP.NET Global.asax 文件(转)
    AspExe a small ASP.NET compiler and executor for document generation
    [转]vim + cscope/ctags 查看分析代码
    编译Chromium 遇到的问题
    yum与apt命令比较
  • 原文地址:https://www.cnblogs.com/catcher/p/1855890.html
Copyright © 2011-2022 走看看