免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1336 | 回复: 0
打印 上一主题 下一主题

移植linux-2.6.14到S3C2410 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-31 21:24 |只看该作者 |倒序浏览

               移植linux2.6.14内核
硬件环境:基于Vmware5.0上的RedHat9.0 ;Windows XP
阳初S3c2410开发板
软件资源:linux2.6.14.1内核 下载地址:
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.1.tar.bz2
交叉工具:(如果不能连接,请用迅雷新建任务下载)
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
如果已经完成上面的内容就可以开始编译内核了:
以$前缀表示命令
一:安装linux-2.6.14.1.tar.bz2:
$tar  jxf  linux-2.6.14.1.tar.bz2  –C  /usr/src/
安装arm-linux-gcc-3.4.1.tar.bz2:
$tar  jxf  arm-linux-gcc-3.4.1.tar.bz2  –C  /
注意上面的 / 代表根目录
$export PATH=/usr/local/arm/3.4.1/bin:$PATH
输出交叉编译路径
二:对NAND FLASH 分区进行配置
$cd  /usr/src/linux-2.6.14.1
$ vi  arch/arm/mach-s3c2410/devs.c 添加下面内容
#include
#include
#include
...
#NAND需要的头文件

1.建立Nand Flash分区表
/* 一个Nand Flash总共64MB, 按如下大小进行分区 */
static struct mtd_partition partition_info[] ={
              {
              name: "vivi",
              size: 0x00020000,
              offset: 0,
              }, {
              name: "param",
              size: 0x00010000,
              offset: 0x00020000,
              }, {
              name: "kernel",
              size: 0x001c0000,
              offset: 0x00040000,
              }, {
              name: "root",
              size: 0x03cf8000,
              offset: 0x00200000,
              mask_flags: MTD_WRITEABLE,
              }, {
              name: "usr",
              size: 0x03a00000,
              offset: 0x00600000,
              }
              };
这里请注意:上面的分区需要跟bootloader分区对应起来
本人bootloader用的是MIZI的VIVI 用命令part show可以看到分区信息;否则出现
kernel panic: VFS: Unable to mount root fs on Unkonw-block (31,2)
诸如此类的错误
2. 加入Nand Flash分区
struct s3c2410_nand_set nandset ={
nr_partitions: 5, /* the number of partitions */
partitions: partition_info, /* partition table */
};
# partition_info是上面的分区信息;nr_partitions: 5 为分区数目
3. 建立Nand Flash芯片支持
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
# tacls, twrph0, twrph1是nand flash的时序控制,
这3个值最后会被设置到NFCONF中
sets: 支持的分区集
nr_set:分区集的个数
4. 加入Nand Flash芯片支持到Nand Flash驱动
另外,还要修改此文件中的s3c_device_nand结构体变量,添加对dev成员的赋值
struct platform_device s3c_device_nand = {
.name = "s3c2410nand",
/* 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设备
下面添加arch/arm/machs3c2410/machsmdk2410.c
$vi arch/arm/machs3c2410/machsmdk2410.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
/* 添加如下语句即可 */
&s3c_device_nand,
};
#对NAND的支持
$vi drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
Chip->eccmode = NAND_ECC_NONE;
把chip->eccmode = NAND_ECC_SOFT注释或删掉
替代为Chip->eccmode = NAND_ECC_NONE;(取消ecc校验)
上面的修改是对NAND FLASH 进行分区配置
三:为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs/Kconfig文件
$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
上面的意思是当执行make menuconfig时产生DEVFS_FS DEVFS_MOUNT这两项,默认是编译进内核
四:开始编译内核
你可以对内核的配置选项手动选择,也可以使用S3C2410的默认配置,然后进行修改;
$cp /arch/arm/configs/smdk2410_defconfig .config
$make menuconfig(make xconfig;make gconfig)
上面的意思是,当运行make menuconfig,如果当前目录存在.config就调用它,否则创建它.
根据需要添加选项:
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
    #说明:mtdblock3代表我的第4个flash分区,它是我的rootfs
    # console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上.
    # 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
    # 用户空间的串口编程针对的仍是/dev/ttyS0等
    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>
  • Nonstandard 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文件.
    接下来就可以产生内核了
    $make zImage (zImage 是vmlinux经过objcopy ->gzip-> asm 产生的压缩内核镜像,在加载内核是调用misc进行解压)
    如果编译成功的话,在arch/arm/boot目录看到zImage
    然后下载zImage到开发板验证。
    本人用的bootloader是vivi,在上面提到vivi 的分区与nand flash 要一样,不然的话将不能加载文件系统。
    因为开发板默认的root分区的flag是16为yaff文件系统。如果用cramfs
    要将flag设为0
    关键的vivi 的命令行解析命令要与上面设置

    Default kernel command string:
    noinitrd root=/dev/mtdblock3 init=/linuxrcconsole=ttySAC0,115200
    保持一致.在vivi命令下
    vivi>param show 可以看到默认设置,要进行修改
    vivi>param set linux_cmd_line “noinitrd root=/dev/mtdblock/3 (init=/linuxrc console=ttySAC0,115200”
    noinitrd表示告诉内核不要把安装器影像装载到内存,root=/dev/mtdblock/3表示flash的root分区。init=/linuxrc表示根文件系统初始化文件位linuxrc,制作根文件系统是创建的初始化文件。
    console=ttySAC0,115200表示使用串口0波特率为115200)
    vivi>net tftp 192.168.18.8 0x30008000 zImage
    vivi>net flash kernel
    vivi>net tftp 192.168.18.8 0x30008000 root_china.cramfs
    vivi>net flash root
    按复位键启动,就可以进入linux了
    到此,移植过程已经结束。由于每个人开发板和CPU的不同,移植过程会碰到各种问题,针对自己的开发板和错误信息进行排除是最重要的,不要希望一次就成功,学会根据错误来提高自己的理解,在解决错误的时候是收获最多的。


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73974/showart_1160725.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP