• 移植linux-2.6.32.2到qq2440


    编译该版本内核使用的编译器版本:arm-linux-gcc 3.4.1

    1.获取linux-2.6.32.2

    2.解压内核

    3.切换到刚解压的内核目录下:

    cd linux-2.6.32.2

    4.修改Makefile

    将以下内容修改:

    修改前:

    ARCH            ?= $(SUBARCH)
    CROSS_COMPILE   ?=
    修改后:

    ARCH            ?= arm
    CROSS_COMPILE   ?= arm-linux-

    5.使用以下命令生成.config

    make s3c2410_defconfig

    6.修改平台输入时钟,由于qq2440的输入时钟为12MHz的无源晶振,故修改arch/arm/mach-s3c2440/mach-smdk2440.c文件的以下内容:

    修改前:

    static void __init smdk2440_map_io(void)
    {
            s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
            s3c24xx_init_clocks(16934400);
            s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
    }
    修改后:

    static void __init smdk2440_map_io(void)
    {
            s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
            s3c24xx_init_clocks(12000000);//修改了原来的数据为12000000
            s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
    }
    7.修改mtd分区信息,修改arch/arm/plat-s3c24xx/common-smdk.c文件的以下内容:

    修改前:

    static struct mtd_partition smdk_default_nand_part[] = {
            [0] = {
                    .name   = "Boot Agent",
                    .size   = SZ_16K,
                    .offset = 0,
            },
            [1] = {
                    .name   = "S3C2410 flash partition 1",
                    .offset = 0,
                    .size   = SZ_2M,
            },
            [2] = {
                    .name   = "S3C2410 flash partition 2",
                    .offset = SZ_4M,
                    .size   = SZ_4M,
            },
            [3] = {
                    .name   = "S3C2410 flash partition 3",
                    .offset = SZ_8M,
                    .size   = SZ_2M,
            },
     [4] = {
                    .name   = "S3C2410 flash partition 4",
                    .offset = SZ_1M * 10,
                    .size   = SZ_4M,
            },
            [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,
            }
    };

    修改后:

    static struct mtd_partition smdk_default_nand_part[] = {
            [0] = {
                    .name   = "Bootloader",
                    .size   = 0x00000000,
                    .offset = 0x00030000,
            },
            [1] = {
                    .name   = "Kernel",
                    .offset = 0x00050000,
                    .size   = 0x00200000,
            },
            [2] = {
                    .name   = "Root",
                    .offset = 0x00250000,
                    .size   = 0x03dac000,
            }

    };

    8.修改s3c2440的机器码,修改arch/arm/tools/mach-types文件的内容如下:

    修改前:

    s3c2440                 ARCH_S3C2440            S3C2440                 362

    修改后:

    s3c2440                 ARCH_S3C2440            S3C2440                 782

    9.给内核打yaffs2文件系统的补丁,这样就可以让内核支持yaffs2文件系统

    9.1从git仓库获取yaffs2源码,获取源码的命令如下:

    git clone git://www.aleph1.co.uk/yaffs2

    9.2将内核补丁插入内核,使用如下方法:

     a.先进入yaffs2目录下:

      cd yaffs2

     b.yaffs2目录下有一个脚本patch-ker.sh,那么执行该脚本即可:

      ./patch-ker.sh ./patch-ker.sh c m ../linux-2.6.32.2

    10.内核配置:

    使用以下命令进行配置操作:

    make menuconfig

    需要修改的配置项如下:

    10.1[*] Enable loadable module support  --->

        [*]   Forced module loading                             
        [*]   Module unloading

    10.2System Type  --->

        S3C2410 Machines  --->

          [*] SMDK2410/A9M2410 ,该条目下的其他都不选

        S3C2440 Machines  --->

          [*] SMDK2440

          [*] SMDK2440 with S3C2440 CPU module,该条目下的其他都不选

        其余Machines选项下的条目均不选(不选的有s3c2400,s3c2412,s3c2442,s3c2443)

    10.3Boot options  --->

        noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

    10.4Userspace binary formats  --->

         [*] Kernel support for ELF binaries,其余选项均不选

    10.5File systems  --->

          [*] Miscellaneous filesystems  --->

            <*>   yaffs2 file system support

            [*]         Lets yaffs do its own ECC

    10.6-*- Native language support  --->

          <*>   Codepage 437 (United States, Canada)

          <*>   Simplified Chinese charset (CP936, GB2312)

          <*>   Traditional Chinese charset (Big5)

          <*>   NLS ISO 8859-1  (Latin 1; Western European Languages)

          <*>   NLS UTF-8

    11.开始编译内核:

    make zImage -j5

    11.1出错如下:

    In file included from fs/yaffs2/yaffs_guts.c:18:
    fs/yaffs2/yaffs_endian.h:32: error: parse error before "swap_loff_t"
    fs/yaffs2/yaffs_endian.h:32: error: parse error before "lval"
    fs/yaffs2/yaffs_endian.h:33: warning: return type defaults to `int'
    fs/yaffs2/yaffs_endian.h:33: warning: function declaration isn't a prototype
    fs/yaffs2/yaffs_endian.h: In function `swap_loff_t':
    fs/yaffs2/yaffs_endian.h:34: error: `lval' undeclared (first use in this function)
    fs/yaffs2/yaffs_endian.h:34: error: (Each undeclared identifier is reported only once
    fs/yaffs2/yaffs_endian.h:34: error: for each function it appears in.)
    fs/yaffs2/yaffs_endian.h:37: error: `Y_LOFF_T' undeclared (first use in this function)
    fs/yaffs2/yaffs_endian.h:38: error: parse error before "vall"
    fs/yaffs2/yaffs_endian.h:38: warning: statement with no effect
      CC      fs/proc/uptime.o
    make[2]: *** [fs/yaffs2/yaffs_guts.o] 错误 1
    make[2]: *** 正在等待未完成的任务....
      CC      fs/proc/version.o
    In file included from fs/yaffs2/yaffs_checkptrw.c:16:
    fs/yaffs2/yaffs_endian.h:32: error: parse error before "swap_loff_t"
    fs/yaffs2/yaffs_endian.h:32: error: parse error before "lval"
    fs/yaffs2/yaffs_endian.h:33: warning: return type defaults to `int'
    fs/yaffs2/yaffs_endian.h:33: warning: function declaration isn't a prototype
    fs/yaffs2/yaffs_endian.h: In function `swap_loff_t':
    fs/yaffs2/yaffs_endian.h:34: error: `lval' undeclared (first use in this function)
    fs/yaffs2/yaffs_endian.h:34: error: (Each undeclared identifier is reported only once
    fs/yaffs2/yaffs_endian.h:34: error: for each function it appears in.)
    fs/yaffs2/yaffs_endian.h:37: error: `Y_LOFF_T' undeclared (first use in this function)
    fs/yaffs2/yaffs_endian.h:38: error: parse error before "vall"
    fs/yaffs2/yaffs_endian.h:38: warning: statement with no effect
    make[2]: *** [fs/yaffs2/yaffs_checkptrw.o] 错误 1
    make[1]: *** [fs/yaffs2] 错误 2
    make[1]: *** 正在等待未完成的任务....

    对策:看来不能使用最新的yaffs2,因此从另一个内核linux-2.35.7将fs/yaffs2文件夹的内容都复制到linux-2.6.32.2/fs/中

  • 相关阅读:
    字符串哈希之Rabin-Karp,poj1200
    字符串哈希之ELFHash,poj2503
    dfs之n的全排列
    几大排序算法(选择,插入)
    dfs之地图染色
    单纯的dfs
    dfs之记忆化搜索(字符串匹配,位置相对变)
    STL之map的一种用法
    JAVA之大数处理,有简单方法不用是sb
    ACM之素数环(DFS)
  • 原文地址:https://www.cnblogs.com/dakewei/p/5931163.html
Copyright © 2020-2023  润新知