首页 > 代码库 > 移植linux-2.6.32.2到qq2440

移植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/中

 

移植linux-2.6.32.2到qq2440