分享

移植2.6.24内核到2410

 定慧图书馆 2012-01-25
移植2.6.24内核到2410
收藏 | 分类: | 查看: 122 | 评论(0)

移植环境:

主机:CentOS 5.1

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

开发板平台:S3C2440YL-2440/YLP-2440开发板)

--------------------------------------------------------------------------------------------

准备工作:

下载Linux内核源代码:http://www./pub/linux/kernel/v2.6/linux-2.6.24.4.tar.bz2 (上去一看,今天2.6.25的内核出来了)

交叉编译工具包:从光盘一般都带,没有到网上找找也有。

解压源码:tar -jxvf linux-2.6.24.4.tar.bz2

安装交叉编译工具:tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 -C /

会将工具安装在/usr/local/arm/3.4.1/中,视各人的环境可能不同,自己修改Makefile中的路径即可。

 

--------------------------------------------------------------------------------------------------------------------

修改配置文件

1.修改Makefile,匹配交叉编译器。

在内核代码根目录下:vim Makefile

193行找到ARCH

修改为

ARCH = arm

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

CORSS_COMPILE视自己的环境定

 

2为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/devdevfs文件系统。编辑fs/Kconfig

906menu "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

 

3

 

 

--------------------------------------------------------------------------------------------------------------------

修改源代码:

1.修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。

arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定要跟bootloader的一致。在我的板子中修改如下:

static struct mtd_partition smdk_default_nand_part[] = {

        [0]={

                .name = "boot",

                .size = SZ_128K + SZ_64K,   //192k 0x00300000

                .offset = 0,

                },

        [1]={

                .name = "kernel",

                .size = SZ_16K * 116,            //2M - 192K    0x01e00000

                .offset = SZ_16K *12,           //192K

                },

        [2]={

                .name = "rootfs",

                .offset = SZ_2M,                 

                .size = SZ_2M * 15,                     //30M

                },

        [3]={

                .name = "User",

                .offset = SZ_32M,

                .size = SZ_32M,

                }

};

 

另外这个文件还要修改smdk_nand_info如下:

static struct s3c2410_platform_nand smdk_nand_info = {

.tacls              =0,        //default is 20

.twrph0          =30,       //default is 60

.twrph1          =0,        //defualt is 20 changed by yangdk

.nr_sets   = ARRAY_SIZE(smdk_nand_sets),

.sets        = smdk_nand_sets,

};

 

 

2修改时钟

      arch/arm/mach-s3c2440/mach-smdk2440.c中修改smdk2440_map_io如下

    static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

s3c24xx_init_clocks(12000000);      //default is 16934400, changed by yangdk

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

 

3.修改nand Flash的校验方式,去掉ECC校验。

      drivers/mtd/nand/s3c2410.c669

      chip->ecc.mode = NAND_ECC_SOFT;

      改为chip->ecc.mode = NAND_ECC_NONE;

      注意:这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测。而我一开始也是编译的时候就去掉了ECC校验的选项,原以为在编译选项中去掉就可以了,结果一直报这样的错:

end_request: I/O error, dev mtdblock2, sector 0

FAT: unable to read boot sector

VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)

Please append a correct "root=" boot option; here are the available partitions:

1f00        192 mtdblock0 (driver?)

1f01       1856 mtdblock1 (driver?)

1f02      30720 mtdblock2 (driver?)

1f03      32768 mtdblock3 (driver?)

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

      郁闷了一个整天。后来发现配置中去掉的这个选项在代码中并没有完全去掉,只是去掉了硬件校验的方式,换成了软件校验。只有在代码中给改成NAND_ECC_NONE,才不会校验,但是这样是不提倡的。可是这有这样最后我的系统才起来,阿弥陀佛!

 

 

配置及编译内核

先把默认配置文件拷贝过来

cp arch/arm/configs/s3c2410_defconfig .config

配置

Make menuconfig

 

[*] Enable loadable module support --->

       [*]   Module unloading

       [*]   Automatic kernel module loading

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

 

System Type ---->

       [*] S3C2410 DMA support

       [*] Support ARM920T processor

       S3C2410 Machines --->

              [*] SMDK2410/A9M2410 

       S3C2440 Machines --->

              [*] SMDK2440

              [*] SMDK2440 with S3C2440 CPU module

 

System Type这部分,只选这些,其他可以全部去掉,我的这个还选上了队Thumb的支持。另外,网上一些帖子都说只选上SMDK2440就可以了,其他的都去掉,事实上是不行的,我试了多次,都在编译时

arch/arm/plat-s3c24xx/s3c24xx.o时,报错:

arch/arm/plat-s3c24xx/s3c244x.c: In function `s3c244x_init_clocks':

arch/arm/plat-s3c24xx/s3c244x.c:121: error: implicit declaration of function `s3c2410_baseclk_add'

make[1]: *** [arch/arm/plat-s3c24xx/s3c244x.o]错误1

make: *** [arch/arm/plat-s3c24xx]错误2

我再选上SMDK2410/A9M2410,问题解决

 

Boot option ----->

      修改启动参数为:

       noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

      可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2是存放我的Linux文件系统的分区。不过,在bootloader可以传递内核参数的情况下这个设置是无效的。

 

Device Drivers --->

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

              [*]   MTD partitioning support

              <*> NAND Device Support --->

                      <*>   NAND Flash support for S3C2410/S3C2440 SoC

                      [ ]    S3C2410 NAND Hardware ECC     //这个要去掉

       [*] Network device support --->

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

                   <*>   DM9000 support

       < > Real Time Clock --->   //这个去掉

 

      去掉红字的两个部分,黑子部分选上,其他的选择默认就可以了。

 

File systems --->

       <*> ROM file system support

      因为我的文件系统用cramfs,选择这个,其他用默认。

 

 

到此为止,基本完成。下面正式编译

make zImage

……

上个厕所,洗把脸,吃个苹果,20分钟后陆续出现这个

 SYSMAP System.map

 SYSMAP .tmp_System.map

 OBJCOPY arch/arm/boot/Image

 Kernel: arch/arm/boot/Image is ready

 AS      arch/arm/boot/compressed/head.o

 GZIP    arch/arm/boot/compressed/piggy.gz

 AS      arch/a

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多