uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)

项目开源地址:https://github.com/Mculover666/uboot-jz2440

0. 教程完整目录

  • 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理
  • 01 - 下载uboot源码并使用VSCode远程查看源码、编译uboot(2012.04.01版本)
  • 02 - 详细探索uboot启动过程(基于S3C2410处理器)
  • 03 - 初步移植uboot 2012.04到JZ2440(修改时钟,配置串口)
  • 04 - 移植uboot 2012.04到JZ2440(支持Nor Flash读写)
  • 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
  • 06 - 移植uboot 2012.04到JZ2440(支持DM9000C网卡)
  • 07 - 移植uboot 2012.04到JZ2440(裁剪uboot大小)
  • 08 - 移植uboot 2012.04到JZ2440(设置mtd分区表)
  • 09 - 移植uboot 2012.04到JZ2440(设置默认环境变量参数)
  • 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)
  • 11 - 移植uboot 2012.04到JZ2440(移植完成,制作uboot补丁)

1. 烧写Linux内核

在上一篇文章中设置了默认内核启动参数和命令,如图:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第1张图片

启动时内核先会进行倒数计时,如果没有操作,就会执行图中的命令,从nand flash中的kernel 分区处读取内核到内存中的0x30000000处,也就是SDRAM起始地址,然后从0x30000000处启动内核。

所以,我们只需要将JZ2440官方提供的内核文件复制到TFTP服务器目录,然后将该内核文件提前烧写到nand flash的kernel分区即可,烧写方法如下:

tftp 30000000 uImage_4.3
nand erase.part kernel
nand write 30000000 kernel

uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第2张图片

然后重启开发板即可看到内核成功启动:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第3张图片

但是因为nand flash中还没有烧写文件系统,所以系统会停止在挂载文件系统的地方,接下来烧写文件系统。

2. 烧写 yaffs2 文件系统

2.1. 烧写测试

将JZ2440官方提供的 yaffs2 文件系统文件拷贝到TFTP服务器目录,按照下面的过程进行烧写:

tftp 30000000 fs_mini_mdev.yaffs2

然后擦除nand flash文件系统分区:

nand erase.part filesystem

烧写yaffs 文件系统:

nand write.yaffs 30000000 260000 889bc0

特别注意:烧写大小要填写十六进制具体大小(可以从tftp 命令的执行结果看到),不能直接填写mtd分区名称filesystem。
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第4张图片

烧写时出现了yaffs命令不支持的问题:

2.2. 开启nand.yaffs命令支持

接下来定位这个问题,在 common/cmd_nand.c 文件中查看该命令的代码,可以看到,只有开启了宏定义 CONFIG_CMD_NAND_YAFFS,这段代码才会加入工程中编译:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第5张图片

在单板配置文件 include/configs/smdk2440.h 中开启该宏定义:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第6张图片

接下来编译uoot,烧写到开发板中,再次进行yaffs烧写测试,烧写成功后重启开发板:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第7张图片

2.3. 解决uboot的小bug

经过对比原始文件系统文件内容和烧写到nand flash中的内容,发现烧写的 nand flash 第一页的oob数据不一致,导致往后全部没有烧写进去,根据 nand write.yaffs 命令执行过程,进入在文件drivers/mtd/nand/nand_util.c中的nand_write_skip_bad 函数,改正uboot中的bug:

第一个bug:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第8张图片
第二个bug:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第9张图片
重新编译,烧写uboot到开发板中,进行yaffs烧写测试,重启之后了可以看到文件系统成功挂载,进入到linux系统:
uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)_第10张图片
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

你可能感兴趣的:(#,uboot研读笔记)