[原创]Linux 2.6.27 for ARM9/S3C2410 内核移植笔记

2.6.27是Linux内核的最新版本。昨天中午下载的,用了半天的时间完成了针对ARM CPU的基本配置,第一次做Linux移植就出乎意料的顺利,其实这主要得益于Linux内核优良的设计和该版本对ARM处理器近乎完美的支持!


关键词: Linux 2.6.27 内核 移植 ARM S3C2410

再写一遍:
  下面把我的整个配置过程与大家分享一下:

第一部分 准备工作
1. 下载Linux内核:
    从 http://www.kernel.org/pub/linux/kernel/v2.6/ 下载最新版的,tar.gz和tar.bz2 均可,我下载的是linux-2.6.27.tar.bz2这个,使用 tar -jxvf linux-2.6.27.tar.bz2 解压缩,cd linux-2.6.27 转到内核代码根目录;

2. 下载安装并配置 arm-linux-gcc 工具链:
    以前配置过的话,该步可以忽略。我用的是3.4.1版本,建议安装到/usr/local/arm/3.4.1目录下,记得要设置一下工具链程序的搜索目录, export PATH=$PATH:/usr/local/arm/3.4.1/bin 即可

第二部分 代码配置
3. 修改Makefile:
    # gedit Makefile
ARCH    ?=  arm
CROSS_COMPILE  ?= /usr/local/arm/3.4.1/bin/arm-linux-

4. 修改C程序文件,指明Flash分区信息,添加NAND Flash驱动支持:
  总共只有两个文件需要修改:
    /arch/arm/plat-s3c24xx/common-smdk.c
    /arch/arm/plat-s3c24xx/devs.c
  (1) 指明分区信息:
    common-smdk.c 中找到 static struct mtd_partition smdk_default_nand_part[],根据自己板子的分区结构修改,例如我的vivi下的分区信息为:
name              offset        size        flag
------------------------------------------------
vivi            : 0x00000000    0x00020000     0  128k
param           : 0x00020000    0x00010000     0   64k
kernel          : 0x00040000    0x002c0000     0    2M+768k
root            : 0x00300000    0x01d00000    16   29M
rootfs          : 0x02000000    0x01f00000     0   31M

我的Flash分了4个区,这个变量就应设置为:
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "vivi",
        .offset    = 0x00000000,
        .size    = 0x00020000,
    },
    [1] = {
        .name    = "param",
        .offset = 0x00020000,
        .size    = 0x00010000,
    },
    [2] = {
        .name    = "kernel",
        .offset = 0x00040000,
        .size    = 0x002c0000,
    },
    [3] = {
        .name    = "root",
        .offset    = 0x00300000,
        .size    = 0x01d00000,
    },
    [4] = {
        .name    = "rootfs",
        .offset    = 0x02000000,
        .size    = 0x01f00000,
    },
};
与上面的信息一一对应,很容易理解;

  (2) 建立NAND Flash芯片支持:
    common-smdk.c 中找到 static struct s3c2410_platform_nand smdk_nand_info,修改为:
/*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,
};
这个变量是与NAND Flash时序有关的设置,talcs, twrph0, twrph1 的含义见S3C2410手册的6-3,随着板子的Flash芯片不同这里的值可能会有些差别,我的是K9S1208型号的;另外注意,一定要将变量前面的static修饰词删除或者注释掉,原因在后面;

  (3) 加入NAND Flash芯片支持到NAND Flash驱动:
    devs.c 中找到 struct platform_device s3c_device_nand,在前面加上前面 smdk_nand_info 变量的 extern,后面加上smdk_nand_info的指针引用,具体代码如下:
extern struct s3c2410_platform_nand smdk_nand_info;
struct platform_device s3c_device_nand = {
    .name          = "s3c2410-nand",
    .id          = -1,
    .num_resources      = ARRAY_SIZE(s3c_nand_resource),
    .resource      = s3c_nand_resource,
    /* Add the NAND Flash device */
    .dev=
    {
        .platform_data = &smdk_nand_info,
    }
};
  (4)  指定启动时初始化:
    找到这一段代码:
static struct platform_device __initdata *smdk_devs[] = {
    &s3c_device_nand,
    &smdk_led4,
    &smdk_led5,
    &smdk_led6,
    &smdk_led7,
};
这段代码指定了内核启动时初始化的设备,其中s3c_device_nand是必须有的,因为我们需要NAND Flash驱动来挂载根文件系统,其余的根据需可自行添加,这里我们使用默认设置,不做修改

5. 禁止Flash ECC校验:据说vivi或uboot通过软件算法产生的ecc校验码于S3C2410 NAND Flash 控制器产生的ecc校验码不一致,所以我们在这里选择禁止内核ECC校验,具体做法如下:
  在drivers/mtd/nand/s3c2410.c文件中找到s3c2410_nand_init_chip()函数,在函数体最后加上 chip->ecc.mode  = NAND_ECC_NONE; 保存,退出。

以下为内核配置部分

6. 支持启动时挂载devfs:
  由于2.6内核去掉了对devfs的支持,这里我们需要手动将其加上,并在/sbin/init运行之前能自动挂上/dev为devfs文件系统,修改fs/Kconfig文件:
找到menu "Pseudo filesystem",在其后添加如下语句:
config DEVFS_FS
    bool "/dev file system support (OBSOLETE)"
    default y
config DEVFS_MOUNT
    bool "Automatically mount at boot"
    default y
    depend on DEVFS_FS

7. 配置内核产生.config文件
  # cp arch/arm/configs/s3c2410_defconfig ./.config
  # make menuconfig
  绝大部分选项都先采用默认设置,待移植成功后我们再进一步裁减,这里只设置一项:
Boot Options ---> Default kernel command string:  noinitrd root=/dev/mtdblock4 console=ttySAC0,115200
注:因为我的Flash分了5个区,标识符分别为mtdblock0、mtdblock1... mtdblock4,第五个分区(也就是mtdblock4)是我们存放cramfs根文件系统的分区,故设置 root=/dev/mtdblock4。

到此,内核配置完成

第三部分 编译测试
8. 编译内核
  # make zImage

9. 载入内核映像,试运行: 可以先用tftp将zImage映像下载到RAM某个地址(通常是0x30008000),然后用vivi命令 go 0x30008000 0 193 跳到这个地址执行(0和193是传递给内核的参数,用寄存器r0, r1存放),之后如果在终端中打印出设备初始化信息,那恭喜你,你已经成功一大半了!否则,回过头去检查是否有遗漏或错误的地方。

第四部分 应用程序的移植
  包括busybox的移植、启动脚本的编写、cramfs映像的创建等,请参见《Linux系统移植》文档的《应用程序移植》章节

再写一遍关键词: S3C2410 ARM 内核移植 Linux 2.6.27


参考资料:
  刘勇等. Linux系统移植. ---, ---  http://www.gd-emb.com/bbs/data/uploads/linux_mig_release_G4oyxcsIVyIZ.pdf
所用设备:
  阳初S3C2410开发板V2.3版  http://www.yangchu.com/

  (原创文章,转载时请注明本文网址)

你可能感兴趣的:(Linux,嵌入式系统,/,ARM)