• 移植3.4.2的Kernel到JZ2440


        本文将介绍如何移植linux-3.4.2内核到JZ2440开发板上的全过程,使用的交叉编译工具版本为 arm-linux-gcc-4.3.2.tar.bz2

        下面来一步一步介绍如何移植。

        由于kernel的启动参数是由Uboot传递的,关键的参数有 R0=0 R1=Mach-Type R2=Tag参数地址

        其中,Mach-Type为内核支持板子的硬件型号,tag参数为Uboot存放传递给Kernel参数的内存地址。

        内核启动时,根据传入的Mach-Type参数选择对应的板级初始化函数来初始化,然后解析tag参数,设置相应系统状态值,装载驱动程序,最后挂载根文件系统。

        1. 编译内核

         修改根目录下面的Makefile,该ARCH ?= arm ,CROSS_COMPILE ?= arm-linux-

         针对arm架构的板级配置文件,位于 arch/arm/configs/mini2440_defconfig 和 s3c2410_defconfig 这两个有参考意义的配置文件。

         配置内核  make s3c2410_defconfig

         编译内核  make  uImage    //最终生成的uImage位于 arch/arm/boot/uImage

         测试新内核  开机进入boot命令行,tftp 0x32000000 uImage ; bootm 0x32000000;

         问题解决:新内核启动后,有可能串口打印出乱码,原因可能是 Uboot没有传递 console 的正确参数,也有可能是内核对于串口时钟频率没有初始化成功。

         Uboot启动时传递的Mach-Type,如果有命令行指定的,则使用指定的,否则就使用环境变量中的machid值。

         对于内核来说,每种硬件配置的板子都对于一个固定的Mach-Type ID,Uboot传递的Mach-Typ必须与其一致,这样,内核才能正确识别。 

         最少的内核启动命令行: set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 ; set machid MACH_ID

         内核支持的板级列表文件为:  include/generated/mach-types.h

         这里,我们使用的是smdk2440配置:

       1:  //arch/arm/mach-s3c24xx/mach-smdk2440.c
       2:  static void __init smdk2440_map_io(void)
       3:  {
       4:      s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
       5:      s3c24xx_init_clocks(12000000);   //将原来的16934400 改为 12000000
       6:      s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
       7:  }

         然后,重新编译,测试就可以。

     

        2. 修改内核默认分区

        默认内核启动,对nand flash的分区如下:

        image

        这样的分区,不是我们想要的,通过在内核代码中搜索 “S2C2410 flash partitions 1”可以找到位于 common-smdk.c中smdk_default_nand_part分区数组。

        我们期望的分区为:

         image ,经过修改后的分区数组如下:

       1:  //  arch/arm/mach-s3c24xx/common-smdk.c
       2:  static struct mtd_partition smdk_default_nand_part[] = {
       3:      [0] = {
       4:          .name    = "Bootloader",
       5:          .size    = SZ_256K,
       6:          .offset    = 0,
       7:      },
       8:      [1] = {
       9:          .name    = "params",
      10:          .offset = MTDPART_OFS_APPEND,
      11:          .size    = SZ_128K,
      12:      },
      13:      [2] = {
      14:          .name    = "kernel",
      15:          .offset = MTDPART_OFS_APPEND,
      16:          .size    = SZ_2M,
      17:      },
      18:      [3] = {
      19:          .name    = "rootfs",
      20:          .offset    = MTDPART_OFS_APPEND,
      21:          .size    = MTDPART_SIZ_FULL,
      22:      }
      23:  };

    3. 修改内核支持yaffs2文件系统

        3.4.2内核版本 默认支持  jaffs2 文件系统,而且在挂载根文件系统的过程中,尝试能够支持的文件系统类型(ext2,3,cramfs,vfat,msdos romfs等)

         如果文件系统类型为 jffs2类型,需要重新设置bootargs,

         set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

        如果是yaffs2类型,不需要重新设置

        编译根文件系统的编译器最好和编译内核的编译器保持一致。 先配置好交叉编译工具链,然后编译Busybox后,执行 make install CONFIG_PREFIX=/home/hao/nfs/fs_mini_mdev_new/ , 这样,基本的文件系统框架出来了。

        接着,安装glibc库,    拷贝交叉编译工具链目录下的 image  这两个库的所有的so文件拷贝到 fs_mini_mdev_new目录下的lib目录(新建立的lib目录),拷贝的时候,注意 cp *so* /home/hao/nfs/fs_mini_mdev_new/lib –d  -d选项拷贝保留链接属性。目录属性对应一致。  

        构建基本的linux目录,etc目录,这个目录可以参考以前已经创建好的etc目录

        dev目录,这个目录下,需要事先创建两个特殊设备 console 和null ,具体信息可以参考linux系统上的设备

        其他必须的目录有,proc,tmp,mnt,sys,root等。

        创建jffs2文件类型的根文件系统:

        mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

        -s    扇区大小  

        -e    可擦除块

        -d    源目录

        -o    输出文件

        如果出现 : image

        说明,内核收到退出代码为0x04的信号,经过查阅得知为非法指令,可能是内核不支持由此编译器编译出的init的特殊指令,需要设置内核支持此指令。

        Kernel Features –> Use the ARM EABI to compile the kernel  选中已支持 eabi特性。

     

       为什么内核不支持yaffs2文件系统呢?因为内核代码中不包含yaffs文件系统源码,但是包含jffs2文件系统源码。

       通过git命令下载yaffs2文件系统源码:git clone git://www.aleph1.co.uk/yaffs2

       切换到yaffs2目录中,执行 ./patch-ker.sh c m /to/linux/dir ,然后去linux源码中,通过make menuconfig来配置yaffs2即可。

       编译yaffs2中出现的错误,是yaffs中结构体函数引用不正确,加上下划线就可以了。

       另外,需要在 最新版本的Uboot的代码 drivers/mtd/nand/nand_util.c 中 ,添加 WITH_YAFFS_OOB这一项,就可以正常启动yaffs格式的uImage了。

    // drivers/mtd/nand/nand_util.c
     
    555  if (!need_skip && !(flags & WITH_DROP_FFS) && !(WITH_YAFFS_OOB)) {                                   
    556         rval = nand_write(nand, offset, length, buffer);
    557         if (rval == 0)
    558             return 0;
    559 
    560         *length = 0;
    561         printf("NAND write to offset %llx failed %d
    ",
    562             offset, rval);
    563         return rval;
    564     }

    4. 裁剪内核

        现在 .config配置文件中找支持的单板类型,然后在menuconfig中搜索选项配置位置,按图索骥,去掉对于支持类型选项。

        去掉内核支持的其他单板类型,只保留指定单板代码:

    image 搜索可知:image ,去掉对于支持的类型即可。

       在嵌入式领域用不到的文件系统,可以去掉,例如 ext2、ext3、ext4等。msdos要保留,应该以后可能会接U盘,而U盘一般为vfat文件系统。

       ……..写的不好,未完待续……………..

    Technorati 标签:
  • 相关阅读:
    JavaScript的正则表达式的基础
    运用JS判断代码可以参考学习
    调用百度地图代码
    运用了css,js
    中国地图(Highmaps)
    Centos
    代理模式【 动态代理与静态代理】
    java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。
    java集合 collection-list-LinkedList
    java集合 collection-list-vector
  • 原文地址:https://www.cnblogs.com/cherishui/p/4424434.html
Copyright © 2020-2023  润新知