您的位置:首页 > 运维架构 > Linux

Linux内核移植

2016-05-20 22:40 357 查看
本文是基于JZ2440板进行内核移植,结合了《嵌入式Linux应用开发完全手册》内核移植和其他文章的总结出的。

一、利用打补丁的方式实现内核移植

$ tar xjf linux-2.6.22.6.tar.bz2 –C ./

$ cd inux-2.6.22

$ patch -p1 <.../linux-2.6.22.6_jz2440.patch

$ mv …/4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c
$ cp config_ok .config

$ make uImage

将在arch/arm/boot目录生成zImage文件。后面只要将uImage烧写到板子就完成移植了。

二、移植前准备

$ tar xjf linux-2.6.22.6.tar.bz2 –C ./

$ cd linux-2.6.22

三、内核的移植

1.修改顶层Makefile

在185行

  ARCH              ?=   $(SUBARCH)

  CROSS_COMPILE     ?=

   改成:

  ARCH              ?=   arm

           CROSS_COMPILE     ?=  arm-linux-

2.修改平台时钟

平台时钟要看你的开发板上外接的晶振是多少。

        $ gedit arch/arm/mach-s3c2440/mach-smdk2440.c

在327行

static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
    //s3c24xx_init_clocks(16934400); //注释这句,加入下一句

    s3c24xx_init_clocks(12000000);

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

3.修改机器码

在arch/arm/tools/mach-type 中s3c2440的机器码一定要与u-boot中的一致,

linux内核的机器码在:arch/arm/tools/mach-types

u-boot的机器码是在:include/asm-arm/mach-types.h

$ gedit arch/arm/tools/mach-types

s3c2410               ARCH_S3C2410              S3C2410                    182

smdk2410           ARCH_SMDK2410         SMDK2410            193

s3c2440          
a193
     ARCH_S3C2440              S3C2440                    362

$ gedit include/asm-arm/mach-types.h

#define MACH_TYPE_S3C2410              182

#define MACH_TYPE_SMDK2410            193

#define MACH_TYPE_S3C2440              362

4.移植nandflash驱动(修改NAND Flash分区)

 $ gedit arch/arm/plat-s3c24xx/common-smdk.c

 根据bootlorder 里面的分区情况进行更改。会涉及到如下结构:

static struct platform_device __initdata *smdk_devs[]= {};

static struct mtd_partition smdk_default_nand_part[] ={};

$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c

static struct platform_device *smdk2440_devices[]__initdata = {

           &s3c_device_usb,

           &s3c_device_lcd,

           &s3c_device_wdt,

           &s3c_device_i2c,

           &s3c_device_iis,

   &s3c2440_device_sdi,

};

5.修改MTD分区

$ gedit arch/arm/plat-s3c24xx/common-smdk.c

static struct mtd_partition smdk_default_nand_part[] ={

[0] = {

           .name    = "kernel",

           .size    = SZ_2M,

           .offset    = 0,

},

[1] = {

           .name    = "jffs2",

           .offset= MTDPART_OFS_APPEND,

           .size    = SZ_8M,

},

[2] = {

           .name    = "yaffs",

           .offset= MTDPART_OFS_APPEND,

           .size    = MTDPART_SIZ_FULL,

           }

};

其中MTDPART_OFS_APPEND表示当前分区紧接着上一个分区,MTDPART_SIZ_FULL表示当前分区的大小为剩余flash空间。

6.配置内核

$ cp arch/arm/configs/s3c2410_defconfig .config

$ make menuconfig

7.移植YAFFS文件系统

一般而言,在NOR Flash上使用JFFS2文件系统,在NANDFlash上使用YAFFS文件系统。

$ cd /.../Development/yaffs2

$ ./patch-ker.shc /…/linux-2.6.22.6

8.编译内核

$mv .../4.3寸LCD_mach-smdk2440.c    arch/arm/mach-s3c2440/mach-smdk2440.c(这一步是为了把4.3寸LCD的源码覆盖原来的3.5寸源码)
$ cp config_ok .config

$ make uImage

将在arch/arm/boot目录生成zImage文件

9.烧写内核

将文件拷到tftp文件夹。

$ tftp 0x32000000 zImage

或$ nfs 0x30000000192.168.1.106:/home/ubuntu/nfs/zImage

$ nand erase 00x200000

$ nand write.jffs2 0x32000000 0 $ (filesize)

10.启动内核

可以使用以下命令启动NAND Flash上的内核

$ nboot 0x32000000 0 0

$ bootm 0x3200000

要想开发板上电后内核自动启动,可以设置bootcmd环境变量。

$ set bootcmd ‘nboot0x32000000 0 0; bootm 0x32000000’

$saveenv
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: