主题 : mini2440学习之(一)-------移植linux内核 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3870
精华: 2
发帖: 20
金钱: 240 两
威望: 240 点
贡献值: 20 点
综合积分: 80 分
注册时间: 2009-02-13
最后登录: 2009-07-31
楼主  发表于: 2009-03-26 00:25

 mini2440学习之(一)-------移植linux内核

管理提醒: 本帖被 qq2440 执行取消置顶操作(2009-08-07)
此内核移植参考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
[ 此帖被hongshaoone在2009-04-01 15:57重新编辑 ]
级别: 新手上路
UID: 4670
精华: 0
发帖: 18
金钱: 180 两
威望: 180 点
贡献值: 0 点
综合积分: 36 分
注册时间: 2009-03-24
最后登录: 2009-04-19
1楼  发表于: 2009-03-26 22:33
学习
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-03-27 21:13
写的很好, 支持这种实践精神。希望你写出更多mini2440学习系列, 我会把它们都加入精华区
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2009-03-27 21:41
写的比较详细了, 基本包括了内核移植几个最重要的步骤, 但有些东西还是需要重新考虑的, 我列在下面, 如果你觉得有什么不对的, 欢迎来反驳我:)

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内核的人犯的错误。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3870
精华: 2
发帖: 20
金钱: 240 两
威望: 240 点
贡献值: 20 点
综合积分: 80 分
注册时间: 2009-02-13
最后登录: 2009-07-31
4楼  发表于: 2009-03-28 11:41
offset = SZ_16K*20,   //SZ_16K*20开始为SZ_32K*10,不过make时出错

错误信息确实是没有定义, 不知道这个是在哪里定义的,可以的话自己去定义不就方便多了!
---------------------------------------------------------------------------------------------------------------------------

name            :       offset          size            flag
------------------------------------------------------------
vivi            :       0x00000000      0x00028000      0
eboot           :       0x00028000      0x00018000      0
param           :       0x00040000      0x00010000      0
kernel          :       0x00050000      0x00200000      0
root            :       0x00250000      0x03dac000      0

这是在superviv下用part命令可以看到相关参数和信息。  
好像我修改之后,关电源再开又变成这样了!
--------------------------------------------------------------------------------------------------------------------------------
我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。

更正错误  这是引用别人的   我只是按其步骤去掉了ECC校验    
我的内核是用NOR FLASH的VIVI 启动的  呵呵!!!!  
好多不明白的地方,继续学习~~~~~~~~~
级别: 新手上路
UID: 3743
精华: 0
发帖: 28
金钱: 240 两
威望: 208 点
贡献值: 0 点
综合积分: 56 分
注册时间: 2009-02-05
最后登录: 2017-09-13
5楼  发表于: 2009-03-29 19:10
“解压Yaffs2并将其加入Linux内核(打补丁的方式) ”
请问Yaffs2文件从哪里来啊?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
6楼  发表于: 2009-03-29 21:12
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3743
精华: 0
发帖: 28
金钱: 240 两
威望: 208 点
贡献值: 0 点
综合积分: 56 分
注册时间: 2009-02-05
最后登录: 2017-09-13
7楼  发表于: 2009-03-29 22:36
yaffs2和内核的版本、板的型号等都无关的吗?
是不是任何版本的yaffs2都行呢?
级别: 新手上路
UID: 3743
精华: 0
发帖: 28
金钱: 240 两
威望: 208 点
贡献值: 0 点
综合积分: 56 分
注册时间: 2009-02-05
最后登录: 2017-09-13
8楼  发表于: 2009-03-29 23:57
我按照上面做
# make menuconfig 时出现了一下错误:
Makefile:491: /home/xuquanrui/kernel/linux-2.6.22.2/arch//Makefile:没有那个文件或者目录
make:***No rule to make target
这是为什么呢?
求救,谢谢
级别: 新手上路
UID: 3870
精华: 2
发帖: 20
金钱: 240 两
威望: 240 点
贡献值: 20 点
综合积分: 80 分
注册时间: 2009-02-13
最后登录: 2009-07-31
9楼  发表于: 2009-03-30 09:36
引用第8楼xuquanrui于2009-03-29 23:57发表的  :
我按照上面做
# make menuconfig 时出现了一下错误:
Makefile:491: /home/xuquanrui/kernel/linux-2.6.22.2/arch//Makefile:没有那个文件或者目录
make:***No rule to make target
这是为什么呢?
.......



你可以看到,本文并没有修改kernel/linux-2.6.22.2/arch//Makefile文件,所以这里出错了说明你的内核是存在错误的
你去http://www.kernel.org/pub/linux/kernel/v2.6/下载源码再试试!(最好不要在别的地方下,不能保证是否被人改动过)