我是靠谱客的博主 寂寞溪流,最近开发中收集的这篇文章主要介绍移植linux内核到mini2440常见问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

错误一:

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内核到mini2440常见问题的全部内容,希望文章能够帮你解决移植linux内核到mini2440常见问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部