美文网首页嵌入式 Linux C ARM
嵌入式开发实验笔记(六)

嵌入式开发实验笔记(六)

作者: 信则无 | 来源:发表于2018-03-21 12:31 被阅读4次

    移植新的(3.4.2)内核至开发板中

    date: 2018年1月25日

    1.下载并初步编译

    1. 解压并修改Makefile
    vim Makefile + 195
    - ARCH ?= $(SUBARCH)
    - CROSS_COMPILE = $(CONFIG_CROSS_COMPILE: "%" = %)
    
    + ARCH ?= arm
    + CROSS_COMPILE = arm-linux-
    
    1. 使用默认配置进行初次编译
    make s3c2410_defconfig (可以在 arch/arm/configs 中查看相关配置文件)
    make uImage
    
    # 期间报错Can't use 'defined(@array)' (Maybe you should just omit the 
    # defined()?) at kernel/timeconst.pl line 373
    # 解决方案:进入 kernel/timeconst.pl line 373
    - if (!defined(@val)) {
    + if (!(@val)) {
    
    1. 修改代码支持 JZ2440
    /* arch/arm/mach-s3c24xx/mach-s3c2440.c line 165 */
    -   s3c24xx_init_clocks(16934400);
    +   s3c24xx_init_clocks(12000000);
    
    1. 修改分区表
    /* arch/arm/mach-s3c24xx/common-smdk.c line 111:(static struct mtd_partition smdk_default_nand_part[] ) */
    // 更改为:
    static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
            .name   = "bootloader",
            .size   = SZ_256K,
            .offset = 0,
        },
        [1] = {
            .name   = "params",
            .offset = MTDPART_OFS_APPEND,
            .size   = SZ_128K,
        },
        [2] = {
            .name   = "kernel",
            .offset = MTDPART_OFS_APPEND,
            .size   = SZ_1M * 3,
        },
        [3] = {
            .name   = "rootfs",
            .offset = MTDPART_OFS_APPEND,
            .size   = MTDPART_SIZ_FULL,
        },
    };
    
    1. nfs 下载文件时出现如下错误:
    T T *** ERROR: Cannot umount
    

    解决方法: 在主机的 /etc/hosts 中加入如下内容:

    # 开发板IP      nfs文件目录
    192.168.1.17  /path/to/nfs_root/
    
    1. 文件系统启动之后出现如下报错:
    Attempted to kill init! exitcode=0x00000004
    

    原因及解决方法:

    报错码 0x00000004 即为 SIGILL --- 非法指令;而产生非法指令的原因是,我们在编译时用的是
    arm-none-linux-guneabi。 其中eabi的意思是指可执行层应用程序二进制接口,所以内核也需要
    支持这种接口

    make menuconfig  # search EABI
    Kernel Features
        [*]USE the ARM EABI to compile the kernel # y to select
    make uImage
    

    编译支持yaffs2

    1. 下载yaffs2 源码
    2. 依据yaffs2 提供的README 来将yaffs2 拷到内核之中:
    ./patch_ker.sh c m /path/to/kernel
    
    1. 配置添加yaffs2支持
    make menuconfig
    #  如果提示类似fs/yaffs2/Kconfig:131: unknown option "If"的错误,可以把
    # fs/yaffs2/Kconfig文件中的help选项后的说明文字的空行删除。
    # 配置选项的路径如下: 
    # File systems/Miscellaneous file systems/ yaffs2
    make uImage
    
    1. 挂载无法运行的错误(我没有遇到)
    /* u-boot: drivers/mtd/nand/nand_util.c line 518 */
    - if (!need_skip && !(flags & WITH_DROP_FFS))
    + if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB))
    
    

    裁剪

    make menuconfig
    System Type
        Samsung S3C24xx Supports
            # 去掉无关的soc
    
    

    PS: 自己改变分区大小,无法启动,报错信息如下

    NAND read: device 0 offset 0xa0000, size 0x200000
    
     2097152 bytes read: error
    ## Booting kernel from Legacy Image at 72000000 ...
       Image Name:   Linux-2.6.30
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1939156 Bytes =  1.8 MB
       Load Address: 70008000
       Entry Point:  70008000
       Verifying Checksum ... Bad CRC or data
    Error: Can't get kernel image!
    

    解决方案

    1. 问题出现的原因是因为,烧写内核和文件系统的地方出现了坏块,导致无法正确识别到 kernel
      文件
    2. 解决方法:就是利用 “ nand scrub” 命令将坏块清除掉然后重新编译

    相关文章

      网友评论

        本文标题:嵌入式开发实验笔记(六)

        本文链接:https://www.haomeiwen.com/subject/kzawqftx.html