5529|2

275

帖子

4848

TA的资源

五彩晶圆(初级)

楼主
 

mini2440学习之(一)-------移植linux内核 [复制链接]

此内核移植参考Tekkaman Ninja 的文章 在此向他表示感谢

前提准备:开发板mini2440开发板
          linux内核为linux-2.6.22.2
                    NOR FLASH为superVIVI

注:本人仅仅是从网上搜集的材料然后根据自己的板子情况一点调试修改的
    其中可能有些错误或不必要修改的地方,(本人也是新手所以谅解下吧)

  转载请注明出处-----------------hongshaoone


一、将Linux2.6.22.2内核源码放到工作目录的kernel文件夹下,并解压
二、修改内核源码根目录下的Makefile文件
#ARCH        ?= arm
#CROSS_COMPILE    ?=arm-linux-
三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。
(1)
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
  .name = "vivi",
  .size  = SZ_16K*20,
  .offset = 0,
},
[1] = {
  .name = "kernel",
  .offset = SZ_16K*20,  //SZ_16K*20开始为SZ_32K*10,不过make时出错,换成为SZ_16K*20就OK了  不知道为什么
  .size = SZ_2M,
},  
[2] = {
  .name = "yaffs2",
  .offset = SZ_2M+SZ_16K*20,
  .size = SZ_2M*20,      //  SZ_2M*20  是我随便写的  不想再算了  呵呵
},

此处的分区一定要与supervivi的分区一致  我是用的  [x] bon part 0 320k 2368k    所以只分了三个区
(2)
static struct s3c2410_platform_nand smdk_nand_info = {
    .tacls        = 0,
    .twrph0        = 30,      //这 三个数字要改的 以前是20 60 20
    .twrph1        = 0,
    .nr_sets    = ARRAY_SIZE(smdk_nand_sets),
    .sets        = smdk_nand_sets,
};
四、 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
    我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。 //此段引用别人的  我只是照此修改了
        搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT为NAND_ECC_NONE
五、增加Yaffs2文件系统的支持
        解压Yaffs2并将其加入Linux内核(打补丁的方式)
      #cd yaffs2
          #./patch-ker.sh c /mnt/linux-2.6.22.2/
六、系统初始化时的芯片晶振频率的修改,修改arch/arm/mach-s3c2440/mach-smdk2440.c
......
    static void __init smdk2440_map_io(void)
{
    s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
    s3c24xx_init_clocks(12000000);
    s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
七、配置内核
        先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程
      # cp arch/arm/configs/s3c2410_defconfig .config
      # make menuconfig

1.General setup  --->  
      Configure standard kernel features (for small systems)  --->   
    选上这项,否则文件系统中的一些选项不会出现

2. System Type ---->
      S3C2410 DMA support      Support ARM920T processor
      S3C2410 Machines --->
              SMDK2410/A9M2410
      S3C2440 Machines --->
              SMDK2440
              SMDK2440 with S3C2440 CPU module

3.Boot options  --->
    将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成  (noinitrd root=/dev/mtdblock2  console=ttySAC0,115200 init=/linuxrc )
可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2是存放我的Linux文件系统的分区。

4.Enable loadable module support --->
          Module unloading
          Automatic kernel module loading
      选择这两个,剩下的可以去掉
5.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 --->  //这个去掉
6.File systems----->
        Miscellaneous filesystems --->
            <*>YAFFS2 file system support
我的文件系统为YAFFS2  ,如果不选此,则出现Kernel panic: VFS: Unable to mount root fs on unknown-block(31,2)

八、编译 make zImage

写的比较详细了, 基本包括了内核移植几个最重要的步骤, 但有些东西还是需要重新考虑的, 我列在下面, 如果你觉得有什么不对的, 欢迎来反驳我:)

引用offset = SZ_16K*20,  //SZ_16K*20开始为SZ_32K*10,不过make时出错,换成为SZ_16K*20就OK了  不知道为什么

那多半是因为SZ_32K没有定义把:)
引用此处的分区一定要与supervivi的分区一致  我是用的  [x] bon part 0 320k 2368k    所以只分了三个区

与supervivi分区保持一致是对的, 但supervivi用的并不是bon分区, 而是MTD分区, 在superviv下用part命令可以看到相关参数和信息。
引用.twrph0        = 30,      //这 三个数字要改的 以前是20 60 20

这三个NAND Flash Controller的参数要根据当前使用的NAND Flash芯片手册和CPU芯片手册相关部分来计算, 而且和NAND Flash Controller所用的HCLK频率有关
引用我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。

内核支持通用的软件ECC算法和S3C210 NAND Flash Controller的硬件ECC算法, 这里你应该根据U-boot使用的算法选择内核所用的ECC算法, 不要为了图简单就关掉ECC, 这是网上很多移植S3C2410内核的人犯的错误。

来源:百问网
此帖出自Linux开发论坛

最新回复

成功了吗 发图上来吧  详情 回复 发表于 2009-10-23 22:41
点赞 关注

回复
举报

2131

帖子

0

TA的资源

至上芯片

沙发
 
学习一下!
此帖出自Linux开发论坛
 
个人签名处处留心皆学问!
 

回复

131

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
成功了吗 发图上来吧
此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表