Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251750
  • 博文数量: 89
  • 博客积分: 4246
  • 博客等级: 上校
  • 技术积分: 2184
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-16 09:55
文章分类

全部博文(89)

文章存档

2013年(1)

2012年(17)

2010年(10)

2009年(58)

2008年(3)

我的朋友

分类: LINUX

2009-01-12 11:47:22

所用的是kernel是2.6.14.2, 这个内核直接支持S3C2410的板子,不必打任何补丁。从下载了内核。然后找来了3.4.1的GCC交叉编译器(经典的2.95.3编译2.6内核会出错)。解开内核开始修改。
1. 增加nand分区信息
     打开arch/arm/mach-s3c2410/devs.c
     增加头文件
     #include
     #include
     #include
     增加分区数据
     /*****************************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 = 0xec,
     .num_resources = ARRAY_SIZE(s3c_nand_resource),
     .resource = s3c_nand_resource,
     .dev = {
     .platform_data = &superlpplatform //***********add here*****
     }
     };
     (分区部分根据实际情况修改)
2. 打开arch/arm/mach-s3c2410/mach-smdk2410.c
    把"&s3c_device_nand"添加到__initdata
3. 打开drivers/mtd/nand/s3c2410.c
    把chip->eccmode = NAND_ECC_SOFT;改成chip->eccmode = NAND_ECC_NONE;
4. 修改Makefile, 把设定SUBARCH := arm CROSS_COMPILE ?= arm-linux-(事先得安装交叉
    编译器)
接着开始make menuconfig,并且载入arch/arm/configs/def_s3c2410config,保存后就make,如果编译器没有问题得话,应该一次就能编译成功。
     接下来编译bootload, 我用vivi, 从下 载vivi的源代码包,解开后make menuconfig, 载入arch/def-configs/smdk2410, 保存退出后修改arch/s3c2410/smdk.c,修改里面的分区信息和启动参数。分区信息根据实际情况设置,启动参数设置成“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mac=00:0e:3a:aa:bb:cc”. 保存退出后make, 得到vivi的BIN.
     把vivi和kernel的BIN文件烧录到FLASH后给板子上电,发现一个问题,vivi并没有使用我设置好的分区信息和启动参数,而是使用一个默认 的值,要使用命令param reset和part reset才可以重置我设置的值。vivi默认的kernel分区大小是1M,而我的kernel的BIN文件有1.2M,开始尝试了好多次都失败。重置 了参数以后kernel可以执行起来, 但是找不到根文件系统,那是当然的,因为我还没有烧录文件系统。
   

一. 准备必要的文件

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

     

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

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

二. 安装文件

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

cd /

tar     jxvf arm-linux-gcc-3.4.1.tar.bz2

vi ~/.bash_profile

把arm-linux-gcc的路径/usr/local/arm/3.4.1/bin添加到PATH中)


接下来需要解压 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

              #include

              #include

               /**************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 目录下,输入命令:

# make smdk2410_defconfig

#make menuconfig /*选择nand flash模块*/

# make

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

如果出现field `list' has incomplete type

那是因为partitions.h中没有定义head_list,在partitions.h的头加上#include

就ok了,哈哈

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1529788

在华恒2410平台上移植2.6内核

allbone 发表于 2006-4-7 16:57:00      第一次做linux的移植,走了很多弯路,也学到很多知识,仅把过程
记录下来,以备日后之用。

     手里这块板是华恒的一个学习平台,配置比较低:
     s3c2410, 8M Nor Flash(Intel 28F640), 16M SDRAM

     配套安装的是2.4的内核,根文件系统安装在ramdisk上。我的想
法很简单,就是将2.6的内核跑起来,挂上原来的文件系统。就是说
只要系统启动到shell提示符,我的目的就达到了,至于周边设备的
驱动移植则不在此行计划内。很自然的,整个过程大致分为两个阶段。

     一、内核移植
   
     由于2.6内核已经正式支持2410这款cpu以及smdk2410这块公板,
只要配置得当,在不修改一行内核代码的情况下,内核就可以运行起来。
所以我觉得这里再提移植就不恰当了,而仅仅是个配置、交叉编译内
核的过程。

make ARCH=arm CROSS_COMPILE=arm-linux- smdk2410_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- zImage

     为了接下来方便,可以直接在top level的Makefile中设置ARCH
和CROSS_COMPILE变量。在2.6内核中,console的名称发生了变化,
需要在bootloader或者内核的配置中修改启动参数,例如

     2.4中启动参数为 …… console=ttyS0,115200,
     在2.6中则应改为 …… console=ttySAC0,115200

     现在用新内核启动,可以在串口接收到启动信息,但由于还没有
安装根文件系统,所以中途会panic,这是我们在下一阶段需要解决
的问题,而第一阶段工作结束。

     非常简单的过程,我却没那么幸运。开始用的是最新的2.6.16的
kernel,经过上述配置,启动后收不到任何消息。折腾无数次后,抱
着有病乱投医的想法,尝试了一下2.6.14,竟然顺利启动。翻了一遍
2.6.16的changelog,也没发现个所以然,等待高手解惑……

     二、安装根文件系统
   
     首先对flash进行分区。网上的经典文章《Linux 2.6.10 以后版
本对S3C2410的支持》仅提到了对Nand flash分区的方法,对Nor
flash不适用。对Nor flash的分区,是通过在
linux/drivers/mtd/maps下增加特定mapping驱动程序来实现。该目
录下的驱动程序结构相似,可以找一个来修改成自己的。我用的是
cfi_flagadm.c这个。
   
     cp cfi_flagadm.c s3c2410.c

     将FLASH_PHYS_ADDR和FLASH_SIZE这两个宏分别修改成自己板子
的flash起始地址和大小。然后修改结构体数组flagadm_parts添加自
己的分区信息。

     接下来告诉内核使用该驱动程序。修改maps目录下的Kconfig文
件,该文件决定出现在menuconfig中的项目,在config
MTD_CDB89712之后添加

     config MTD_S3C2410
            tristate "HuaHeng 2410 board"

     修改该目录下的Makefile,添加如下内容:

     obj-$(CONFIG_MTD_S3C2410)        += s3c2410.o

     现在make menuconfig时,在MTD项目中将出现HuaHneng 2410
board选项,选中它并重新编译内核就完成了分区工作,启动时将看
到分区信息。

     现在,内核可以检测到分区,并找到了压缩的RAMDISK,并试图
解压缩。如果你使用smdk2410的默认配置,这时会报错,类似
RAMDISK:incomplete 云云。解决办法很简单,将内核配置中的
BLK_DEV_RAM_SIZE的值从默认的4096改为8192即可。

     原2.4内核中对设备文件的管理是通过devfs完成的,所有设备文
件均在启动后检测到设备时动态建立,所以我的RAMDISK中/dev目录
是空的。而2.6内核从某个版本号后移除了devfs,取而代之的是udev。
我一没有启用udev,二没有手动建立任何设备文件,所以内核警告无
法初始化控制台。手工添加设备文件即可:

     mknod /dev/console c 5 1

     为了避免再出现类似错误,我用原2.4内核启动,把devfs建立好
的设备文件全部拷了出来,添加到RAMDISK当中。

     到此为止内核已经启动到VFS:freeing xxxK memory。但出现一
行reboot(magic=000000)的信息,就没有下文了。搜了一下,发现在
配置内核时必须选中Floating Point Emulator,否则就会导致这个
错误。再次重新编译内核,重启,终于出现了期待已久的#提示符。
阅读(939) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~