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

移植新的(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” 命令将坏块清除掉然后重新编译

你可能感兴趣的:(嵌入式开发实验笔记(六))