Linux内核移植

2019-07-12 23:37发布

本文是基于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               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