振奋人心纯音乐:4. Linux2.6.14内核编译、移植 (含LCD移植)

来源:百度文库 编辑:中财网 时间:2024/04/29 21:26:07
Linux2.6.14内核编译、移植 (含LCD移植)2008-04-02 13:33

-----------------------------------------------------------------------------------      
    Linux2.6.14移植
-----------------------------------------------------------------------------------      
4. Linux2.6.14内核编译、移植
一、准备必要的文件
    我们首先去官方网站下载最新的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. l.tar.bz2
注:这个编译器已经包含在光盘的\DISK4\linux才I I关\linuxtool目录下.
二、安装文件
(1)安装交叉编译器
     (a)在/usr/local/目录下建立文件夹arm
     (b)将arm-linux-gcc-3.4. l.tar.bz2拷贝到arm文件夹下
     (c)# tar jxvf arm-linux-gcc-3.4. l.tar.bz2   
//解压缩编译器,其中:jxvf中的j表示用bzip2来压缩/解压缩文件      
     (d)vi ~/.bash_profile //设置系统环境变量
        //把arm-linux-gcc的路径/usr/local/arm/3.4.1/bin添加到PATH中:
【原来】 :PATH=$PATH:$HOME/bin
        【修改为】:PATH=$PATH:/usr/local/arm/3.4.1/bin       
(2)解压缩内核代码并配置内核
     (a)# tar jxvf linux2.6.14.tar.gz    //解压缩内核,其中:zxvf中的z表示用gzip来压缩/解压缩文件
     (b)# ls
     (c)# cd linux2.6.14
三、修改makefile文件
    内核的编译是根据makefile文件的指T进行的,Makefile文件来组织内核的各模块之间的
关系,记录了各个模块之间的相互联系和依赖关系。
    我们首先修改linux-2.6.14的根目录下的makfile文件,我们须改的卞要内容是目标代码的
类型和为编译内核指定一个编译器。
    我们注释掉以下内容:
    #ARCH?=$(SUBARCH)
      #CROSS COMPILE?=
    增加如下内容:
    ARCH:= arm
    CROSS COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-

四、修改相关的文件。
    4.1 设置flash分区
    4.1.1 指明分区信息
在arch/arm/mach-s3c2410/devs.c文件中:
[arm@localhost linux-2.6.14]$ vi arch/arm/mach-s3c2410/devs.c
     (1)增加头文件定义:
        /***********add here***********/
        #include
        #include
        #include
        /**************end add********/
     (2)增加nand flash分区信息定义(分区信息和bootloader一致就可以)
/***********add here***********/
static struct mtd_partition partition_ info[]={
[0]={    //128K
name: "boot",   //name:代表分区名字
size: 0x20000,   //size:代表flash分区大小(单位:字节)
offset: 0,   //offset:代表flash分区的起始地址(相对干0x0的偏移)
},
[1]={    //3M
name: "kernel",
size: 0x300000,
offset: 0x20000,
},
[2]={    //5M
name: "rootfs",
size: 0x500000,
offset: 0x320000,
},
[3]={    //1M
name: "etc",
size: Ox 100000,
offset: 0x820000.
},
[4]=    //11M
name: user
size: Oxb00000,
offset: Ox920000,
}
[5]={
name: "qt",
size: Ox2b00000,
offset: Ox 1420000,
}
};
/**************end add********/
     (3)加入Nand Flash分区
/***********add here***********/
struct s3c2410_ nand_ set nandset={
         nr_partitions: 6,/*the number of partitions*/
        partitions: partition_ info,/*partition table*/
};
/**************end add********/
nr_partitions:指明partition_ info中定义的分区数目
partitions:分区信息表
     (4).建立Nand Flash芯片支持
/***********add here***********/
struct s3c2410_platform_nand superlpplatform={
        tacls:0, //tads, twrph0, twrphl的意思见S3C2410手册的6-3
        twrph0:30,
       twrph 1:0,
        sets: &nandset, //支持的分区信息集
         nr_sets: 1, //分区集的个数
   };
/**************end add********/
    (5).加入Nand Flash芯片支持至Nand Flash驱动
另外,还要修改此文件中的s3c_device_nand结构体变量,添加对dev成员的赋值
struct platform_device s3c_device_nand={
   .name="s3c2410-nand", /*Device name*/
   .id=-1,               /*Device ID*/
   .num resources=ARRAY_ SIZE(s3c_nand_resource), //有几个寄存器区
   .resource=s3c_nand_resource, /*Nand Flash Controller Registers*/寄存器区首地址
/***********add here***********//*Add the Nand Flash device*/
   .dev={
   .platform_data=&superlpplatform
   }
/**************end add********/
   };
    4.1.2 指定启动时初始化
kernel启动时依据我们对分区的设置进行初始配置
修改arch/arm/mach-s3c2410/mach-smdk2410.c文件
[arm@localhost linux-2.6.14]$ vi arch/arm/mach-s3c2410/mach-smd1Q410.c
修改smdk2410_devices[].指明初始化时包括我们在前面所设置的flash分区信息
static struct platform- device *smd1Q410_ devices[]_   initdata={
           &s3c_ device_ usb,
           &s3c_ device_ lcd,
           &s3c_ device_ wdt,
           &s3c_ device_ i2c,
           &s3c_ device_ iis,
   /*添加如下语句即可*/
   &s3c_ device_ nand,
   };
保存,退出。

    4.2 添加LCD驱动程序,对LCD进行初始化
    linux2.6.14已经包含了lcd的驱动程序,驱动程序位于/linux-2.6.14/drivers/video/目录下,文件名   是s3c24101b.c,头文件是s3c24101b.h. 我们在这里可以不研究这个文件。只要我们对lcd进行以下初   始化就可以了。
打开linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c,在这个文件里增加包含文
件:
然后增加LCD初始化的代码,
#include 修改为#include "devs.h"
#include 修改为#include "cpu.h"

/*********** wpb add start ********/
/* LCD Initialize */
#include
#include
/* LCD Initial code */

/*
发生图象偏移时,可通过对前肩后肩增减来调节
.lcdcon1
CLK_TFT: VCLK=HCLK/[(CLKVAL+1)/2]
FCLK=180MHz, HCLK=90MHz, VCLK=7.5MHz
.lcdcon2
Vertical sync Back Porch
LINEVAL=(Vertical display size)-1=240-1=239
        Vertical sync Front Porch
        Vertical sync Pulse Width
.lcdcon3
Horizontal sync Back Porch
         HOZVAL=(Horizontal display size)-1=320-1=319
         Horizontal sync Front Porch
.lcdcon4
STN used
        Horizontal sysnc Pulse Width
.*/
static struct s3c2410fb_mach_info wpb_lcdcfg __initdata={
.fixed_syncs=0,
.regs={
   .lcdcon1=S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(5),
   .lcdcon2=S3C2410_LCDCON2_VBPD(18) | S3C2410_LCDCON2_LINEVAL(239) | S3C2410_LCDCON2_VFPD(11) |

S3C2410_LCDCON2_VSPW(4),
                .lcdcon3=S3C2410_LCDCON3_HBPD(38) | S3C2410_LCDCON3_HOZVAL(319) | S3C2410_LCDCON3_HFPD(15),     
   .lcdcon4=S3C2410_LCDCON4_MVAL(0) | 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=0x0,

.gpdup=0xffffffff,
.gpdup_mask=0xffffffff,

.width=320, /* TFT Screen Size: 320X240 */
.height=240,

.xres={320,320,320}, /* X direction: 320 */
.yres={240,240,240}, /* Y direction: 240 */
.bpp={16,16,16},     /* 16 bit color     */
};

static void __init smdk2410_init(void)
{
set_s3c2410fb_info(&wpb_lcdcfg);
}

//在系统中增加对LCD的初始化
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
        * to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_ram = S3C2410_SDRAM_PA,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io   = smdk2410_map_io,
.init_irq = smdk2410_init_irq,
/********** wpb add start *************/
.init_machine=smdk2410_init,
/********** wpb add end   *************/
.timer   = &s3c24xx_timer,
MACHINE_END
/*********** wpb add end   *******/

(3) 注释掉drivers\char\vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示.

在编译内核的时候选择224 color,在graphics support中我把所有的选项都选了,除了vga console,选了以后老编译不过去也不

知道有什么用。然后从新启动系统就可以看到企鹅tux了。

    4.3 配置内核
    4.3.1支持启动时加载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修   改fs/Kconfig文件
[arm@localhost linux-2.6.14]$ vi fs/Kconfig
找到 menu "Pseudo filesystems"
添加如下语句:
config DEVFS_FS
         bool "/dev file system support (OBSOLETE)"
         default y
config DEVFS_MOUNT
      bool "Automatically mount at boot"
default y
depends on DEVFS_ FS
    4.3.2 配置内核产生.config文件
[arm@localhost linux-2.6.14]$ cp arch/arm/configs/smdk2410_defconfig .config
[arm@localhost linux-2.6.14]$ make menuconfig //即可进入内核配置环境,进行内核的裁减
在smdk2410_defconfig基础上,我所增删的内核配置项如下:
Loadable module support >
        [*] Enable loadable module support
        [*] Automatic kernel module loading
System Type -->
        [*] S3C2410 DMA support
Boot options -->
        Default kernel command string:
        noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M
            #说明:mtdblock2代表第3个flash分区,用来作根文件系统rootfs;
            # console=tty0,ttySAC0,115200使kernel启动期间的信息刚开始输出到串口0上,波特率为 115200;

            # 后面的信息输出到LCD屏上。
/* 2410-s中串口设备是在tts目录下(USB转串口的是ttySCA)的,按0、1来选择串口UART0和UART1
ttyS0是早期内核中使用的串口设备名。/dev/tty下的设备的作用是将结果显示在开发板的屏幕上
用一个例子简单介绍一下:echo asdfjaklsfnalsdfsaf >tty0
运行上面的命令会在屏幕上看到上面的字符串。*/
            # 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
            # 用户空间的串口编程针对的仍是/dev/ttyS0等
            # mem=32M表示内存是32M,如果是64则设为64MFloating point emulation -->
        [*] NWFPE math emulation          
            #This is necessary to run most binaries!!!

#接下来要做的是对内核MTD子系统的设置
Device Drivers -->
        Memory Technology Devices (MTD) -->
                [*] MTD partitioning support
                    #支持MTD分区,这样我们在前面设置的分区才有意义
                [*] Command line partition table parsing
                    #支持从命令行设置flash分区信息,灵活
                RAM/ROM/Flash chip drivers -->
                        <*> Detect flash chips by Common Flash Interface (CFI) probe
                        <*> Detect nonCFI AMD/JEDECcompatible flash chips
                        <*> Support for Intel/Sharp flash chips
                        <*> Support for AMD/Fujitsu flash chips
                        <*> Support for ROM chips in bus mapping
                NAND Flash Device Drivers -->
                        <*> NAND Device Support
                        <*> NAND Flash support for S3C2410/S3C2440 SoC
        Character devices -->
                [*] Nonstandard serial port support
                [*] S3C2410 RTC Driver
        USB Support -->
                <*> Support for Host-side USB
        MMC/SD Card Support -->
                <*> MMC Support
                <*> MMC block device driver
              
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是cramfs,故做如下配置
File systems -->
        <> Second extended fs support #去除对ext2的支持
        Pseudo filesystems -->
                [*] /proc file system support
                [*] Virtual memory file system support (former shm fs)
                [*] /dev file system support (OBSOLETE)
                [*] Automatically mount at boot (NEW)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
        Miscellaneous filesystems >
                <*> Compressed ROM file system support (cramfs)
                    #支持cramfs
        Network File Systems >
                <*> NFS file system support
#配置LCD相关的信息
Device Drivers--->Graphics support
                选中: support for frame buffer devices
    S3C2410 LCD framebuffer support
    logo Config--> Standard 224_color
      Bootup logo
    保存退出,产生.config文件。

4.4 编译内核,下载到板子上
#make zImage
   生成zImage在arch/arm/boot/目录下
   要烧写的文件就是该文件:zImage