第二章编译移植内核

在以上章节介绍了 2.4 内核的编译过程,因为三星公司的 smdk2410 开发板使用的是 2.4.18 的内核,所以目前国内有相当多的客户都很熟悉 2.4 的使用和配置,我们不再对这个内核作介绍了。我们在这一章中将主要讲述最新的 linux2.6.14 内核的移植过程。由于 2410 已经成为 linux2.6 的标准支持平台,所以移植起来相对并不是很复杂。

第一节在 hfrk2410 开发板上运行 linux2.6

一. 准备必要的文件

       我们首先去官方网站下载最新的 llinux 内核

     http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2

因为 linux2.6.14 内核需要更新版本的编译器,所以我们需要下载交叉编译器

  ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2

注:这个编译器已经包含在光盘的 \DISK4\linux 相关 \linuxtool 目录下面。

二. 安装文件

       我们把 gcc 安装在 /usr/local/arm/3.4.1 目录下,安装方法和安装 gcc2.95.3 gcc3.3.2 是相同的,在此我们不再描述了

接下来需要解压 linux 内核,输入命令:

[root · localhost hfrk]# tar jxvf linux-2.6.14.tar.bz2

内核被解压到 linux-2.6.14 目录下。

三. 修改 makefile 文件

       内核的编译是根据 makefile 文件的指示进行的, Makefile 文件来组织内核的各模块之间的关系,记录了各个模块之间的相互联系和依赖关系。

       我们首先修改 linux-2.6.14 的根目录下的 makfile 文件,我们须改的主要内容是目标代码的类型和为编译内核指定一个编译器。

   我们注释掉以下内容:

    #ARCH   ?= $(SUBARCH)

       #CROSS_COMPILE      ?=

       增加如下内容:

       ARCH     : = arm

       CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-

四. 修改相关的文件。

1.        修改 arch\arm\mach-s3c2410\devs.c 文件

       增加头文件定义

              /***********add here***********/

              #include  <linux/mtd/partitions.h>

              #include  <asm/arch/nand.h>

              #include  <linux/mtd/nand.h>

               /**************end add********/

 

 

 

 

 

              增加 nand flash 分区信息

              /***********add here***********/

              static struct mtd_partition partition_info[] ={

              {

              name: "loader",

              size: 0x00020000,

              offset: 0,

              }, {

              name: "param",

              size: 0x00010000,

              offset: 0x00020000,

              }, {

              name: "kernel",

              size: 0x001c0000,

              offset: 0x00030000,

              }, {

              name: "root",

              size: 0x00200000,

              offset: 0x00200000,

              mask_flags: MTD_WRITEABLE,

              }, {

              name: "user",

              size: 0x03af8000,

              offset: 0x00400000,

              }

              };

 

              struct s3c2410_nand_set nandset ={

              nr_partitions: 5 ,

              partitions: partition_info ,

              };

 

              struct s3c2410_platform_nand superlpplatform={

              tacls:0,

              twrph0:30,

              twrph1:0,

              sets: &nandset,

              nr_sets: 1,

              };

              /**************end add********/

 

              struct platform_device s3c_device_nand = {

              .name               = "s3c2410-nand",

              .id             = -1,

              .num_resources       = ARRAY_SIZE(s3c_nand_resource),

              .resource  = s3c_nand_resource,

 

              /***********add here****************/

              .dev = {

              .platform_data = &superlpplatform

              }

              /**************end here************/

              };

2. 修改 arch\arm\mach-s3c2410\mach-smdk2410.c 文件

              Startic struct platform_device *smdk2410_devices[] __initdata={

                     &s3c_device_usb,

                     &s3c_device_lcd;

                     &s3c_device_wdt,

                     &s3c_device_i2c;

                     &s3c_device_iis,

                     &s3c_device_nand, /*add here*/

              };

五. 我们做完以上修改以后,内核编译以后就可以在 hfrk2410 开发板上运行了。

       打开终端窗口,切换到 linux-2.6.14 目录下,输入命令:

[root · localhost linux-2.6.14]# mak smdk2410_defconfig

[root · localhost linux-2.6.14]# mak

等编译完成以后,会生成镜像文件 arch/arm/boot/zImage ,把这个文件下载到开发板上,就会看到 linux2.6 的内核启动信息,我们迈出了 linux2.6 内核移植的第一步!

 

第二节移植 LCD 驱动程序

       我们通过上面的工作,在串口中已经看到了 linux2.6.14 的启动信息,但是在 LCD 上没有任何显示,这是因为我们还没有对 LCD 进行初始化, linux2.6.14 已经包含了 lcd 的驱动程序,驱动程序位于 /linux-2.6.14/drivers/video/ 目录下,文件名是 s3c2410fb.c, 头文件是 s3c2410fb.h. 。我们在这里可以不研究这个文件。只要我们对 lcd 进行以下初始化就可以了。

       我们打开 /linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c, 在这个文件里增加包含文件:

    #include

    #include

       然后增加 LCD 初始化的代码,

    static struct s3c2410fb_mach_info hfrk_lcdcfg __initdata = {

        .fixed_syncs=       0,

        .regs={

            .lcdcon1=   S3C2410_LCDCON1_TFT16BPP | \

                        S3C2410_LCDCON1_TFT | \

                        S3C2410_LCDCON1_CLKVAL(6),

 

            .lcdcon2=   S3C2410_LCDCON2_VBPD(2) | \

                        S3C2410_LCDCON2_LINEVAL(319) | \

                        S3C2410_LCDCON2_VFPD(0) | \

                        S3C2410_LCDCON2_VSPW(4),

 

            .lcdcon3=   S3C2410_LCDCON3_HBPD(47) | \

                        S3C2410_LCDCON3_HOZVAL(239) | \

                        S3C2410_LCDCON3_HFPD(15),

 

            .lcdcon4=   S3C2410_LCDCON4_MVAL(1) | \

                        S3C2410_LCDCON4_HSPW(31),

 

            .lcdcon5=   S3C2410_LCDCON5_FRM565 | \

                        S3C2410_LCDCON5_INVVLINE | \

                        S3C2410_LCDCON5_HWSWP,

        },

        .lpcsel=    0x0,

        .gpccon=    0xaaaaaaaa,

        .gpccon_mask=   0xffffffff,

        .gpcup=     0xffffffff,

        .gpcup_mask=    0xffffffff,

        .gpdcon=    0xaaaaaaaa,

        .gpdcon_mask=   0x0,

        .gpdup=     0xffffffff,

        .gpdup_mask=    0xffffffff,

        .width=     240,

        .height=    320,

        .xres=      {240,240,240},

        .yres=      {320,320,320},

        .bpp=       {16,16,16},

    };

    static void __init sdmk2410_init(void)

    {

        set_s3c2410fb_info(&hfrk_lcdcfg);

    }

       在系统初始化中增加对 lcd 的初始化。

    MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch

                    * to SMDK2410 */

        /* Maintainer: Jonas Dietsche */

        ……

        .map_io     = smdk2410_map_io,

        .init_irq   = smdk2410_init_irq,

        .init_machine   = sdmk2410_init, /* 这一句是新增加的*/

        .timer      = &s3c24xx_timer,

    MACHINE_END

       现在我们重新保存这个文件,现在需要重新进入配置菜单,检查一下 LCD 的相关选项是否选上, [Device Drivers->Graphics support->] 这个配置菜单下面是相关 LCD 的配置。回到根目录下,输入 make 编译内核,重现烧写内核到开发板,再次启动 linxu2.6.14 以后就可以在 lcd 上看到一个小的企鹅。我们的 lcd 驱动已经移植完成了。