Linux-2.6.24移植到FL2440开发板

软硬件环境:

开发板:FL2440

交叉编译器:arm-linux-gcc-3.4.1

移植内核:linux-2.6.24
文件系统: yaffs2

清理工作

清理以前的配置并删除配置文件,在linux-2.6.24内核压缩包解压后的顶层目录下执行:

#make distclean

可能会出错,解决方法如下:

make报错:

Makefile:1503: *** 混和的隐含和普通规则。 停止。

解决方案:

  这个原因可能是Make工具对低版本内核的Makefile一些旧的规则兼容不好,我们只需要修改对应的Makefile。

当前使用的Make工具对Makefile里面的有些规则不兼容造成了这个错误,要修改Makefile中不兼容的部分。

大概在 1503行,把:

 / %/: prepare scripts FORCE
               
 $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
               
 $(build)=$(build-dir)
修改为:

<pre name="code" class="plain">/: prepare scripts FORCE
                $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
                $(build)=$(build-dir)
%/: prepare scripts FORCE
                $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
                $(build)=$(build-dir)
 
 

 
  
 

大概在 435行,把:

config %config: scripts_basic outputmakefile FORCE                $(Q)mkdir -p include/linux include/config                $(Q)$(MAKE) $(build)=scripts/kconfig $@

修改为:

<span style="font-size:14px;">config: scripts_basic outputmakefile FORCE
                $(Q)mkdir -p include/linux include/config
                $(Q)$(MAKE) $(build)=scripts/kconfig $@
%config:scripts_basic outputmakefile FORCE
                $(Q)mkdir -p include/linux include/config
                $(Q)$(MAKE) $(build)=scripts/kconfig $@</span></span>

指定编译环境

在顶层Makefile中修改:

第193行改为:

ARCH               = arm

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

其中,ARCH指定了要编译的CPU架构在arm目录下面,CROSS_COMPILE则指定了交叉编译器所在的目录,可以是arm-linux-,此时交叉编译器为系统环境变量中指定的交叉编译器。

NAND_FLASH分区

这里分区要跟bootloader对NAND_FLASH的分区一致!

修改文件:arch/arm/plat-s3c24xx/common-smdk.c

修改结构体:static struct mtd_partitionsmdk_default_nand_part[]

<span style="font-size:14px;">/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name   = "Boot",
                .size   = 0x00100000,
                .offset = 0
        },
        [1] = {
                .name   = "MyApp",
                .size   = 0x003c0000,
                .offset = 0x00140000,
        },
        [2] = {
                .name   = "Kernel",
                .size   = 0x00300000,
                .offset = 0x00500000,
        },
        [3] = {
                .name   = "fs_yaffs",
                .size   = 0x03c00000,    //30M
                .offset = 0x00800000,
        },
        [4] = {
                .name   = "WINCE",
                .size   = 0x03c00000,
                .offset = 0x04400000,
        }
};

</span>

修改结构体:smdk_nand_info

<span style="font-size:14px;">static struct s3c2410_platform_nand smdk_nand_info = {
        .tacls          = 0,
        .twrph0         = 30,
        .twrph1         = 0,
        .nr_sets        = ARRAY_SIZE(smdk_nand_sets),
        .sets           = smdk_nand_sets,
};

</span>

时钟修改

修改文件:arch/arm/mach-s3c2440/mach-smdk2440.c

<span style="font-size:14px;">static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//外部的晶振的频率是12MHz,打印信息乱码可能是这里的问题
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

</span>

修改机器码

1.如果使用FL2440默认的bootloader引导,则:

修改文件:arch/arm/tools/mach-types
删除:
<span style="font-size:14px;">s3c2410                 ARCH_S3C2410            S3C2410                 182</span></span>
把:
<span style="font-size:14px;">s3c2440                 ARCH_S3C2440            S3C2440                 362</span></span>
修改为:
<span style="font-size:14px;">s3c2440                 ARCH_S3C2440            S3C2440                 193</span>

2.如果使用uboot引导,则:

(1)首先确认arch/arm/tools/mach-types有:

<span style="font-size:14px;">smdk2440                MACH_SMDK2440           SMDK2440                1008</span>

如果没有则添加。

然后,

(2)修改文件:arch/arm/mach-s3c2440/mach-smdk2440.c

把:

<span style="font-size:14px;">MACHINE_START(s3c2440, "SMDK2440")</span>
改为: 
<span style="font-size:14px;">MACHINE_START(SMDK2440, "SMDK2440")</span>

(3)修改文件:arch/arm/kernel/head.S

在:

ENTRY(stext)

后面添加:

<span style="font-size:14px;">mov r0,#0
mov r1,#0x3f0
ldr r2,=0x30000100
</span>

去掉Nand_Flash的ECC校验

修改文件:drivers/mtd/nand/s3c2410.c

在drivers/mtd/nand/s3c2410.c的第669行

在第669行

将:

chip->ecc.mode= NAND_ECC_SOFT;

修改为:

<span style="font-size:14px;">chip->ecc.mode = NAND_ECC_NONE;</span>

支持devfs文件管理器

修改文件:fs/Kconfig

找到:
menu "Pseudo filesystems"
在这一行行后面增加:
<span style="font-size:14px;">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
</span>

支持开发板上K9F1G08的nandflash

修改文件:drivers/mtd/nand/nand_bbt.c

修改下面两个结构体:
<span style="font-size:14px;">static struct nand_bbt_descr largepage_memorybased = {
        .options = 0,
        .offs = 0,
        .len = 1,  // 2表示256M,K9F1G08为128M修改为1
        .pattern = scan_ff_pattern
};
static struct nand_bbt_descr largepage_flashbased = {
        .options = NAND_BBT_SCAN2NDPAGE,
        .offs = 0,
        .len = 1, //原始值为2,支持128M的K9F1G08修改为1
        .pattern = scan_ff_pattern
};
</span>

建立配置文件

因为s3c2410跟s3c2440有诸多相似点,所以把arch/arm/configs/s3c2410_defconfig拷贝到顶层目录,并改名为.config。再进行make menuconfig的时候就会在这个配置文件基础上修改。

支持Yaffs2文件系统

Yaffs2下载: http://download.csdn.net/detail/u013752202/9463804 

解压cvs-root.tar.gz,并执行下面操作给内核打上补丁。

<span style="font-size:14px;">cd yaffs2
./patch-ker.sh c /home/zhw123/linux_source/linux-2.6.24
./patch-ker.sh c /home/zhw123/linux_source/linux-2.6.24
</span>

上面命令完成下面三件事情:

(1)修改内核fs/Kconfig

增加一行:source"fs/yaffs2/Kconfig"

(2)修改内核fs/Makefile

增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/

(3)在内核fs/目录下创建yaffs2目录

将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;

将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下;

将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.

内核配置

执行make menuconfig

1. System Type配置
# make menuconfig ARCH=arm
[*] Enable loadable modulesupport --->

       [*]   Module unloading

       [*]   Automatic kernelmodule loading

       选择这两个,剩下的可以去掉 

System Type ---->

       [*] S3C2410 DMA support

       [*] Support ARM920T processor

       S3C2410 Machines --->

             [*] SMDK2410/A9M2410 

       S3C2440 Machines --->

             [*] SMDK2440

             [*] SMDK2440 with S3C2440 CPUmodule

System Type这部分,只选这些,其他可以全部去掉。 (经过测试,必须SMDK2410的选项)

2. Boot option配置

Boot option ----->

       修改启动参数为:

       noinitrd root=/dev/mtdblock5init=/linuxrc console=ttySAC0,115200

这里要根据开发板来设置,这里设置为从Nand_Flash加载系统,问价系统存放在mtdblock5分区。当bootloader引导内核的时候给内核传递了参数,那么优先bootloader传进来的参数,这个参数失效。

3.Userspacebinary formats配置

Userspace binary formats  --->

    < > Kernel support for a.out andECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,在ARM-Linux下一般都用ELF,所以这两种基本用不上。)

Device Drivers --->

       <*> Memory Technology Device(MTD) support --->

             [*] MTD partitioning support

             <*> NAND Device Support --->

                     <*> NAND Flash support for S3C2410/S3C2440SoC

                     [ ]  S3C2410 NAND Hardware ECC    //去掉

       [*] Network devicesupport --->

              [*]   Ethernet (10 or 100Mbit) ---> 

                 <*>   DM9000 support

       <*> Real TimeClock ---> 

        [ ]   Set system time from RTC onstartup and resume//去掉

其余默认不改。

4. File systems配置

File systems -->

    < > Second extended fs support #去除对ext2的支持

    < > Ext3 journalling file systemsupport #去除对ext3的支持

    <*> Kernel automounter support

    <*> Kernel automounter version 4support (also supports v3)

     <*> Filesystem in Userspace support

    Pseudo filesystems -->

       [*] Virtual memory filesystem support (former shm fs)

       <*>Userspace-driven configuration filesystem (EXPERIMENTAL)

      Miscellaneous filesystems-->

       <*> YAFFS2file system support

        “N”掉[ ]Autoselect yaffs2 format 和

[ ]Cache short names in RAM ,因为这是给每页大于1024B的NAND Flash设计的

<*> Journalling Flash File System v2 (JFFS2)support

    (0)   JFFS2 debuggingverbosity (0 = quiet, 2 = noisy)

    [*]   JFFS2 write-bufferingsupport

    [ ]   JFFS2 summary support(EXPERIMENTAL)

    [ ]   JFFS2 XATTR support(EXPERIMENTAL)

    [*]   Advanced compressionoptions for JFFS2

    [*]   JFFS2 ZLIB compressionsupport

    [*]   JFFS2 RTIMEcompression support

    [*]   JFFS2 RUBINcompression support

    JFFS2 default compression mode(priority)  --->

 Network File Systems -->

          <*> NFS file system support

--下面全部选上,否则挂载NFS时可能出现protocol不支持--

          [*]Provide NFSv3 client support

          [*]Provide client support for the NFSv3 ACL protocol extension

          [*]Provide NFSv4 client support (EXPERIMENTAL)

           [*]Allow direct I/O on NFS files

     <*> NFS serversupport 

       [*]Provide NFSv3server support

       [*]Provide serversupport for the NFSv3 ACL protocol extension    

       [*]Provide NFSv4server support (EXPERIMENTAL)        

       --- Provide NFSserver over TCPsupport                  

       [*] Root file systemon NFS 

编译

1.执行make clean

每次内核配置或改动后都要执行清理步骤,从而保证改正生效。

2.make

这里也可以指定目标文件名称、CPU架构和交叉编译器,如make zImage ARCH=armCROSS_COMPILE=arm-linux-

编译生完成后目标文件zImage存放在arch/arm/boot/。

运行

下面是制作成uImage后由uboot引导运行的过程,文件系统为nfs





后续

以上移植是最简单的linux系统,还有很多驱动模块没有选择。为了调试方便,内核一般会挂载NFS文件系统,最后确定后在写进Nand_Flash,另外为了能够开启的ftp和telnet服务,开发板还需要支持网卡,FL2440开发板为支持DM9000网卡,……



猜你喜欢

转载自blog.csdn.net/u013752202/article/details/50909608