工作背景:
目标板:imx6ul SOC+底板 u-boot:uboot2016.03
nand flash: Micron MT29F8G08ABABAWP 1G
kernel启动过程中关于nand flash的打印信息如下:
===============================
nand: device found, Manufacturer ID: 0x2c, Chip ID: 0x38
nand: Micron MT29F8G08ABABAWP
nand: 1024 MiB, SLC, erase size: 512 KiB, page size: 4096, OOB size: 224
gpmi-nand 1806000.gpmi-nand: enable the asynchronous EDO mode 4
Scanning device for bad blocks
8 ofpart partitions found on MTD device gpmi-nand
Creating 8 MTD partitions on "gpmi-nand":
0x000000000000-0x000000800000 : "boot"
0x000000800000-0x000000a00000 : "logo"
0x000000a00000-0x000000b00000 : "ENV"
0x000000b00000-0x000000e00000 : "DTB"
0x000000e00000-0x000001600000 : "kernel"
0x000001600000-0x000001700000 : "DTBbak"
0x000001700000-0x000001f00000 : "kernelbak"
0x000001f00000-0x000040000000 : "rootfs"
gpmi-nand 1806000.gpmi-nand: driver registered.
===================================
但是u-boot 2016.03在引导OS启动过程中关于nand flash 会有如下报错:
NAND read from offset 600000 failed -74
*** Warning - readenv() failed, using default environment
NAND read from offset 800000 failed -74
0 bytes read: ERROR
NAND read from offset e00000 failed -74
0 bytes read: ERROR
NAND read from offset b00000 failed -74
0 bytes read: ERROR
从打印信息的read error 来看,是我们从nand flash的 每个偏移位置都没有读到有效数据,
但是执行md 0x80800000 0x100 会发现已经从flash(这样测试的是0xb00000偏移位置读)读出数据到ram了,部分读出数据如下:
跟踪到这步我依然不确定问题出现在那了,
接下来,我将整个uboot擦除:
=> nand erase.chip
之后在uboot中就可以正确读取nand flash 中的数据。
擦除过程就是写入全ff,所以读取均是ff。
当我将u-boot 2016.03源码根目录下的文件include/configs/mx6ul_14x14_evk.h 做如下修改后:
第一条报错问题解决。
事实上我在kernel中(dts中)对nand flash进行了分区,我在u-boot的env中将flash分区规划同kernel中对mtd 分区规划保持一致。
但是u-boot对nand 的每一个物理偏移的读 都不正确。
----------------------------------------------------------------------------------------------------------
事实上,以上我所描述的问题,对于我来说是个必然,原因是我没有搞清楚 nand 控制器 hw ecc/soft ecc的原理。我是SD卡引导烧写的:ramdisk(而且我是用的linux 3.14.18版SDK中的ramdisk) 中通过linuxrc 脚本进行的flash erase/nand write,reset/reboot后进行的nand read,也即是写入的ecc和我读出的ecc不一致。上来饶了一大圈,瞎搞,无知者要命。
继续我以下正确的调试步骤:
1. 将要烧写到nand flash上的image loading to SD card, 在u-boot 2016.03中进行如下操作:
2.
3.
4.
5.
发现在u-boot中对裸设备(不带任何fs)nand进行write/read是没有failed -74的问题的,证明了NXP提供的u-boot 2016.03中的nand flash驱动是没问题,ecc逻辑也是没问题的,不用在扎到源代码中出不来了!!!
在u-boot中更新dtb和kernel,事先我将rootfs已经解压到nand flash的第7的分区:
update kernel:
update dtb:
=> run nandargs
=> run bootnand
本篇到此结束哈哈!
给自己的关键提示:核心原理不明确,以及工作习惯有时会给自己带来灾难,老妈子我歇了三年,快把自己歇菜了,必须得加快进步速度!
并且时刻想着分析代码时、运行时问题。