移植Linux内核到mini2440常见问题

来源:互联网 发布:黄金分析软件 编辑:程序博客网 时间:2024/05/17 09:29

具体方法参考移植手册,常见问题如下。

错误一:

NOW, Booting Linux......
Uncompressing Linux...................................................................................... done, booting the kernel.
 

停止的情况

下面的是tools/mach-types中关于体系的参数定义

s3c2440            ARCH_S3C2440        S3C2440           362

mini2440        MACH_MINI2440        MINI2440        1999

解决方法:linux机器码要与bootloader一致,否则出现这个错误!

2.内核的配置

1..[*] Enable loadable module support --->

       [*]   Module unloading

 2. System Type ---->
       [*] S3C2410 DMA support       [*] Support ARM920T processor
            S3C2440 Machines --->
               [*] SMDK2440
               [*] SMDK2440 with S3C2440 CPU moduleq

其他的比如2410,2443相关的全部去掉

3.Boot options   --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string

改成    (noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 )
其中 mtdblock2 表示 MTD 分区的第二个分区存文件系统; Linuxrc 为启动的首个脚本。

4关掉nand ecc .因为bootload中已经有ecc校验算法

Device Drivers --->
       <*> Memory Technology Device (MTD) support --->
               [*]   MTD partitioning support
               <*> NAND Device Support --->
                       <*>   NAND Flash support for S3C2410/S3C2440 SoC
                       [ ]     S3C2410 NAND Hardware ECC     // 这个要去掉

3.添加nand flash驱动(可参考arm/plat-s3c24xx/common-smdk.c)

  在arm/mach-mini2440.c

错误二:

//注意结构和函数的顺序

中添加static struct mtd_partition mini2440_default_nand_part[] = {
    [0] = {
        .name    = "supervivi",
        .size    =  0x00040000,//dev/mdkbloack0
        .offset    = 0,
    },
    [1] = {
        .name    = "param",
        .offset = 0x00040000,
        .size    = 0x00020000,
    },
    [2] = {
        .name    = "Kernel",
        .offset = 0x00560000,
        .size    =1024 * 1024 * 1024,
    },
    [3] = {
        .name    = "nand",
        .offset    = 0x00000000,
        .size    = 1024 * 1024 * 1024,
    },
   
   
};


static struct s3c2410_nand_set mini2440_nand_sets[] = {
    [0] = {
        .name        = "NAND",
        .nr_chips    = 1,
        .nr_partitions    = ARRAY_SIZE(mini2440_default_nand_part),
        .partitions    =mini2440_default_nand_part,
    },
};

static struct s3c2410_platform_nand mini2440_nand_info = {
    .tacls        = 20,
    .twrph0        = 60,
    .twrph1        = 20,
    .nr_sets    = ARRAY_SIZE(mini2440_nand_sets),
    .sets        = mini2440_nand_sets,
    .ignore_unset_ecc = 1,
};

错误三:
Unable to handle kernel NULL pointer dereference at virtual address 00000018
pgd = c0004000
[00000018] *pgd=00000000
Internal error: Oops: 5 [#1]

make zIamge下载后报错
 

解决办法:

static void __init mini2440_machine_init(void)
{
    s3c24xx_fb_set_platdata(&mini2440_fb_info);
    s3c_i2c0_set_platdata(NULL);
   s3c_device_nand.dev.platform_data = &mini2440_nand_info;  //这个函数手册上没有,但得加

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
   //smdk_machine_init();
}

static struct platform_device *mini2440_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_nand,   // 把 nand flash 设备添加到开发板的设备列表结构

};

更改drivers/mtd/nand/s3c2410.c关闭ecc校验

    chip->ecc.mode        = NAND_ECC_SOFT;

 改为:chip->ecc.mode        = NAND_ECC_NONE;


错误四:

arch/arm/mach-s3c2440/mach-mini2440.c:84: error: array type has incomplete element type
arch/arm/mach-s3c2440/mach-mini2440.c:85: error: array index in non-array initializer
arch/arm/mach-s3c2440/mach-mini2440.c:85: error: (near initialization for 'mini2440_nand_sets')
arch/arm/mach-s3c2440/mach-mini2440.c:86: error: field name not in record or union initializer
arch/arm/mach-s3c2440/mach-mini2440.c:86: error: (near initialization for 'mini2440_nand_sets')
arch/arm/mach-s3c2440/mach-mini2440.c:87: error: field name not in record or union initializer

在macn-mini2440中添加头文件

#include <plat/common-smdk.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>//这个也不能少的哦 

编译后下载:

affs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs: auto selecting yaffs2
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 128K

错误五:
Kernel panic - not syncing: Attempted to kill init

解决办法: 这个时候懵了,哪里错呢~ 没办法,只能对照着友善的配置一个个大模块对着来改
当改到Kernel Features的时候错误消失了,原来需要选上
Use the ARM EABI to compile the kernel
Allow old ABI binaries to run with thie Kernel
为什么呢?~ Google了一下,原来友善的根文件系统在编译的时候也启用了EABI特性,内核和文件系统需要对上
文件系统用了EABI 内核也要用EABI 内核不用EABI 也只能读取不用EABI的文件系统

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33805p2.htm

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玉米地和娘的民儿 慢点 民儿和娘玉米地的故事 第2段 民儿和娘在玉米地热逼 玉米地民儿与娘故事全文下载 玉米地娘和儿怀子小说 娘亲祖母共夫全集 小说下载 奶奶王珍珠怀孕txt 红高粱九儿玉米地视频 娘亲怀了我的种 民儿和娘玉米地故事 快抽出去外婆会怀孕的 民儿玉米地妈全给你 民儿和娘玉米地的小说 第章母亲播种危险期怀孕 儿子今晚后妈随便你怎么弄说说 同学说要看我骑他妈我说可以 荒村野性全文阅读目录 小成和后妈全文免费阅读文章 小诚和后妈全文免费阅读 娘亲在玉米地河边 我和娘亲玉米 娘亲给儿生个娃大结局 在玉米地插娘亲短文 在玉米地插娘亲电影 王来地里与娘激战2 在玉米地插娘亲播放 孩子别谢了我是你妈 臭小子 别急妈咪又不是不给你 粉嫩娘亲全文阅读全文 你的好粗妈v好痛 乡村孽缘上了王雪琴101一0 乡村小神医之情缠玉米地 乡村孽缘长篇小说全文免费阅读 乡村孽缘王雪琴怀孕是第几章 桃花村傻牛李大根 拨出来你爸要来 一个山村全家小说全集 乡村孽缘胡秀`小说全集 儿子小点声别让你爸听见长篇小说 胡秀英全文费阅读全文 儿子小声点别让你爸听见小说