IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> linux2.6.14内核移植到2410
猫猫草
post 2007-09-11 22:34:47, Tue
Post #1


猫猫猫
***

Group: Power Cat
Posts: 626
Joined: 2006-12-8
Member No.: 2



代码
linux2.6.14内核移植到2410
       我这里主要是按<<基于S3C2410的Linux全线移植文档.pdf>>文档来做的。
    在 arch/arm/mach­s3c2410/devs.c 文件中:

[arm@localhost linux­2.6.14]$ vi arch/arm/mach­s3c2410/devs.c
添加如下内容:
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
...
/* NAND Controller */
1.建立 Nand Flash 分区表
/* 一个 Nand Flash 总共 64MB, 按如下大小进行分区 */
static struct mtd_partition partition_info[] ={
    { /* 128k */
        name: "vivi",
        size: 0x00100000,
        offset: 0x0,
    },{ /* 64K */
        name: "param",
        size: 0x00010000,
        offset: 0x00020000,
    }, { /* 2MB */
        name: "kernel",
        size: 0x00220000,
        offset: 0x00030000,
    }, { /* 2M+128k */
        name: "root",
        size: 0x00200000,
        offset: 0x00200000,
    },  { /* 58M */
        name: "user",
        size: 0x03a00000,
        offset: 0x00400000,
    }
}
name: 代表分区名字
size: 代表 flash 分区大小(单位:字节)
offset: 代表 flash 分区的起始地址(相对于 0x0 的偏移)
目标板计划分 4 个区,分别存放 bootloader, kernel, rootfs 以及以便以后扩展使用的用户文件系统空间。
各分区在 Nand flash 中起始地址. 分区大小. 记录如下:
mtdpart info. (5 partitions)
name              offset        size        flag
------------------------------------------------
vivi            : 0x00000000    0x00020000     0  128k
param           : 0x00020000    0x00010000     0   64k
root            : 0x00200000    0x00200000     0    2M
kernel          : 0x00030000    0x00220000     0    2M+128k
user            : 0x00400000    0x03a00000     0   58M

2. 加入 Nand Flash 分区
struct s3c2410_nand_set nandset ={
           nr_partitions: 5,                    /* the number of partitions */
           partitions: partition_info, /* partition table                 */
};
nr_partitions: 指明 partition_info 中定义的分区数目
partitions: 分区信息表
3. 建立 Nand Flash 芯片支持
struct s3c2410_platform_nand superlpplatform={
           tacls:0,
           twrph0:30,
           twrph1:0,
           sets: &nandset,
           nr_sets: 1,
};
tacls, twrph0, twrph1 的意思见 S3C2410 手册的 6­3, 这 3 个值最后会被设置到 NFCONF 中,见 S3C2410 手册 6­6.
sets: 支持的分区集
nr_set:分区集的个数
4. 加入 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 the Nand Flash device */
           .dev = {
                       .platform_data = &superlpplatform
            }
};
name:  设备名称
id: 有效设备编号,如果只有唯一的一个设备为­1, 有多个设备从 0 开始计数.
num_resource: 有几个寄存器区
resource: 寄存器区数组首地址
dev: 支持的 Nand Flash 设备

5. 为了我们的内核支持 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
6.        配置内核产生.config 文件
[arm@localhost linux­2.6.14]$ cp arch/arm/configs/s3c2410_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/mtdblock3 init=/linuxrc console=ttySAC0,115200    
         #说明:mtdblock2 代表我的第 4 个 flash 分区,它是我的 rootfs
         #     console=ttySAC0,115200 使 kernel 启动期间的信息全部输出到串口 0 上.
         #     2.6 内核对于串口的命名改为 ttySAC0,但这不影响用户空间的串口编程。
         #     用户空间的串口编程针对的仍是/dev/ttyS0 等
         #     如果你的bootLoader可以向内核传递启动参数,则这一项可以不设置,如果我的就是在VIVI中设置上面的参数的
Floating 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 non­CFI AMD/JEDEC­compatible 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  ­­­>
                           [*] Non­standard serial port support
                           [*] S3C2410 RTC 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
                            
保存退出,产生.config 文件.
7. 这里还有一个方面要注意的,就是ECC问题,如果不把
    Device Drivers  --->
     Memory Technology Devices (MTD)  --->
        NAND Flash Device Drivers  --->
            [*]   S3C2410 NAND Hardware ECC
    去掉会出现如下的问题:
end_request: I/O error, dev mtdblock3, sector 2
EXT3-fs: unable to read superblock
end_request: I/O error, dev mtdblock3, sector 0
Buffer I/O error on device mtdblock3, logical block 0
end_request: I/O error, dev mtdblock3, sector 0
Buffer I/O error on device mtdblock3, logical block 0
end_request: I/O error, dev mtdblock3, sector 8
Buffer I/O error on device mtdblock3, logical block 1
end_request: I/O error, dev mtdblock3, sector 8
Buffer I/O error on device mtdblock3, logical block 1
end_request: I/O error, dev mtdblock3, sector 16
Buffer I/O error on device mtdblock3, logical block 2
end_request: I/O error, dev mtdblock3, sector 16
Buffer I/O error on device mtdblock3, logical block 2
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 0
FAT: unable to read boot sector
VFS: Cannot open root device "mtdblock3" or unknown-block(31,3)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
另外,还要在在/linux-2.6.14.1/drivers/mtd/nand/s3c_2410.c中将
chip->eccmode = NAND_ECC_SOFT 改为 chip->eccmode = NAND_ECC_NONE;

8.  关于initrd及RamDisk的问题
       在做2.6.14内核移植之前,我本来是想移植2.6.15的,但是出现了如是的一些问题:就是无法打开根文件系统,        终端显示的信息如下:
        VFS: Cannot open root device "mtdblock3" or unknown-block(31,3)
        Please append a correct "root=" boot option
        Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
       后来改成2.6.14,同样的配置,却不会出现如上的问题。但是在这个过程中我却对RamDisk有了较好的掌握,        包括它也initrd的关系。
                Ramdisk是用来挂载根文件系统而在内存中开辟的地块区域,如果你需要你的内核支持Ramdisk,那么你需要作以下的更改:
   1). 首先,设置vivi的linux_cmd_line为:
    param set linux_cmd_line  "initrd=0x30800000,0x400000 root=/dev/ram0 init=/linuxrc         console=ttySAC0  max=00:0e:3a:aa:bb:cc"
    如果你的bootloader不可以设置启动参数,也可以在
    Boot options  --->   中的第三个选项中按回车进行设置。      
    我通过多次的测试,发现initrd=0x30800000,0x400000的作用就是在RAM中开辟一块始起地址为0x30800000,大小为    4MB的Ramdisk.
   2). 其次还要在配置内核的时候注意以下的选项:
     Device Drivers  --->
         Block devices  --->
            <*> RAM disk support                                     │ │
  │ │            (16)  Default number of RAM disks (NEW)                  │ │
  │ │            (4096) Default RAM disk size (kbytes) (NEW)              │ │
  │ │            [*]   Initial RAM disk (initrd) support
    这样内核就可以支持从Ramdisk启动了。其中4096KB要与上面设置的Ramdisk大小一致,这里为4MB。
    编译内核之后,这样子启动:
    net tftp 192.168.1.100 30008000 zImage
    net tftp 192.168.1.100 30800000 root_china.cramfs
    boot ram 30008000 0x12fee8      
    如果你不想用Ramdisk来挂载文件系统,直接从Flash中打开文件系统,那么在配置内核的时候,可以将RAM     disk support支持去掉。
Go to the top of the page
 
+Quote Post
猫猫草
post 2007-09-13 00:25:12, Thu
Post #2


猫猫猫
***

Group: Power Cat
Posts: 626
Joined: 2006-12-8
Member No.: 2



代码
基于2.6.19内核小型Linux系统制作与移植

ARM9 S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身影。

  S3C2410微处理器是一款由Samsung公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它带有内存管理单元 (MMU),采用0.18mm工艺和AMBA新型总线结构,主频可达203MHz。同时,它支持Thumb 16位压缩指令集,从而能以较小的存储空间获得32位的系统性能。

  在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛[1]。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。

  与Linux2.4内核相比,2.6内核吸收了最新的技术,在性能、可测量性、器件支持和可用性方面有了大幅度提高;支持更多的体系结构、处理器、总线、接口和设备;标准化了内部接口;简化了扩展或添加新设备的步骤等。

  本文着重介绍如何制作一个基于linux-2.6.19内核的小型Linux操作系统,并将它移植到S3C2410开放板上。内容包括交叉编译环境的建立,引导程序、2.6.19内核、根文件系统的修改、配置、编译、移植等。

  系统的制作移植

  建立交叉编译环境

  要移植、开发小型Linux系统,首先要在安装了RedHat9或更高版本Linux操作系统的主机上配置交叉开发环境。交叉开发是指在开发主机上安装开发工具,编辑、编译目标板的引导程序、内核和文件系统,使其能在目标板上运行。

  针对本次开发,需要安装arm-linux-gcc-3.4.1以及armv4l-tools工具链。在安装完毕后,切记要将两者的路径分别添加到系统路径$PATH中。

  引导程序

  对于计算机系统来说,从开机上电到操作系统启动需要一个引导程序。嵌入式linux系统同样离不开引导程序,这个引导程序叫做Bootloader [1]。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统硬件环境,为最终调用操作系统内核做好准备。

  vivi[4]是韩国MIZI公司为其ARM9系列产品而研发的Bootloader,小而灵巧,这里选用它作为小型Linux系统的Bootloader。

  首先要修改vivi源代码中的Flash分区信息,新的分区信息如表1所示。

  根据表1,在vivi源码arch/s3c2410/smdk.c文件中作出相应的修改。

  然后在配置菜单中导入smdk2410的默认配置,编译成功将在vivi源代码目录下生成所需的Bootloader文件,文件名为vivi。

  接着,便可把vivi下载到目标板Flash的相应位置。

  内核

  修改内核
  
  首先,修改内核源码linux-2.6.19下的Makefile文件,指定目标代码类型与编译器:SUBARCH :=arm;CROSS_COMPILE:=/usr/local/arm/3.4.1/bin/arm-linux-。

  然后,在linux-2.6.19/arch/arm/mach-s3c2410/common-smdk.c中根据表1修改内核中的Flash分区信息。这里提醒读者,2.6.16(含)以前内核的源码中没有Flash分区信息,所以需要增加新的分区信息;而在2.6.17(含)以后内核的源码中已含 Flash分区信息,需要的只是修改分区信息。

  内核Flash分区信息必须与vivi的Flash分区信息相一致。因为,vivi的Flash分区中的地址是内核及文件系统下载到Nand flash的真正地址;而内核在启动时读的却是内核Flash分区设定的地址;所以,若两者不同,则很可能导致不能正常启动内核或读取文件系统。

  最后,修改linux-2.6.19/drivers/mtd/nand/s3c2410.c,禁止Nand flash差错检测: chip->eccmode = NAND_ECC_NONE;。

  内核的配置编译

  在配置菜单中导入内核对smdk2410的默认配置,再在此基础上选择所需的功能。如Nand Flash及MTD设备的支持,Cramfs文件系统的支持等。

  配置完毕,在终端输入编译命令“make”进行编译。若内核源码编译成功,将在linux-2.6.19/arch/arm/boot/下生成内核映像文件zImage。

  最后,在vivi命令提示模式下使用下载命令,将内核映像zImage加载到开发板Flash中的适当地址。

  根文件系统

  Linux系统中的文件和设备是通过文件系统来组织的。文件系统的存在使得数据和设备可以被有效而透明地存取访问。一个linux的最简根文件系统应该包括支持linux系统正常运行的基本内容,包括系统使用的软件和库,以及所有用来为用户提供基本支持的架构和指令。

  在根文件目录rootfs下建立bin、dev、etc、lib、proc、sbin、root、tmp等一系列必备的目录,把所需的配置文件、动态函数库放到相应的目录。采用BusyBox是缩小根文件系统的好办法。BusyBox以很小的体积集成了最常用的linux命令和应用程序,大大简化了制作 linux根文件系统的过程。

  有一点必须指出的是,在2.6.12(含)之前的内核通常是用devfs来管理位于/dev下的所有块设备和字符设备;但在2.6.13(含)之后的内核已不支持devfs,而转用udev来管理/dev下的设备,详见[5]。所以,针对2.6.19内核,要使系统启动后进入BusyBox控制台,还需在 /rootfs/dev下添加控制台设备文件:“[root@localhost dev]# mknod -m 600 console c 5 1”。

  目前,linux已经能够支持几十种文件系统格式,如常用的Cramfs、Jfss2、Yaffs等。Cramfs 是一种只读的闪存文件系统,可以保护系统的基本设置不被更改。根文件系统就使用Cramfs格式。

  使用Cramfs制作工具mkcramfs把根文件目录制作成映像文件:rootfs.cramfs。

  根文件系统制作完成,在vivi命令模式下把rootfs.cramfs下载到Flash的合适位置。

  至此,一个基于2.6.19内核的小型Linux系统便成功地制作完毕,并移植到S3C2410开发板上了。

  板子加电后便可看到系统的启动信息,最终进入BusyBox控制台。

  结语

  基于2.6内核的Linux凭借其突出的嵌入式特性与性能优越的ARM9 S3C2410相结合,在嵌入式领域有着广阔的应用天地。文章介绍了如何制作一个基于Linux2.6.19内核的小型Linux系统,并将其移植到 S3C2410开发板上。小型系统的制作与移植是进行嵌入式开发的基础,必须熟练掌握。
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 User(s) are reading this topic (2 Guests and 0 Anonymous Users)
0 Members:

 



Lo-Fi Version Time is now: 2024-10-31 05:32