嵌入式Linux--U-Boot(五)NAND命令使用

NAND Flash操作命令

 uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版本的核心板,并且编译 NAND 核心板对应的 uboot,然后使用 imxdownload 软件将 u-boot.bin 烧写到 SD 卡中,最后通过 SD 卡启动。
 一般情况下 NAND 版本的核心板已经烧写好了 uboot、linux kernel 和 rootfs 这些文件,所以可以将 BOOT 拨到 NAND,然后直接从 NAND Flash 启动即可。

NAND 版核心板启动信息如:

在这里插入图片描述可以看出,当前开发板的 NAND 容量为 512MiB。输入“? nand”即可查看
NAND 相关命令,如下:

在这里插入图片描述可以看出,NAND 相关的操作命令少。

1、nand info命令

此命令用户打印 NAND Flash 信息,输入“nand info”,结果如图 30.4.8.3 所示:

在这里插入图片描述从上面给出了 NAND 的页大小、OOB 域大小,擦除大小等信息。可以对照着所使用的 NAND Flash 数据手册来查看一下这些信息是否正确。

2、nand device命令

 nand device命令用于切换 NAND Flash,如果你的板子支持多片 NAND 的话就可以使用此命令来设置当前所使用的 NAND。这个需要你的 CPU 有两个 NAND 控制器,并且两个 NAND 控制器各接一片 NAND Flash。就跟 I.MX6U 有两个 SDIO 接口,这两个 SDIO 接口可以接两个 MMC设备一样。不过一般情况下 CPU 只有一个 NAND 接口,而且在使用中只接一片 NAND。

3、nand erase命令

 nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性决定了在向 NAND Flash 写数据之前一定要先对要写入的区域进行擦除。“nand erase”命令有三种形式:

nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition  //擦除指定的分区
nand erase.chip [clean] //全篇擦除

 NAND 的擦除命令一般是配合写命令的,后面讲解 NAND 写命令的时候在演示如何使用“nand erase”。

4、nand write命令

 此命令用于向 NAND 指定地址写入指定的数据,一般和“nand erase”命令配置使用来更新NAND 中的 uboot、linux kernel 或设备树等文件,命令格式如下:

nand write addr off size

 addr 是要写入的数据首地址,off 是 NAND 中的目的地址,size 是要写入的数据大小。

 由于 I.MX6ULL 要求 NAND 对应的 uboot 可执行文件还需要另外包含 BCB 和 DBBT,因此直接编译出来的 uboot.imx 不能直接烧写到 NAND 里面。关于 BCB 和 DBBT 的详细介绍请参考《I.MX6ULL 参考手册》的 8.5.2.2 小节,笔者目前没有详细去研究 BCB 和 DBBT,因此我们不能在 NAND 版的 uboot 里面更新 uboot 自身。除非大家去研究一下 I.MX6ULL 的 BCB 和DBBT,然后在 u-boot.imx 前面加上相应的信息,否则即使将 uboot 烧进去了也不能运行。我们使用 mfgtool 烧写系统到 NAND 里面的时候,mfgtool 会使用一个叫做“kogs-ng”的工具完成BCB 和 DBBT 的添加。

 但是我们可以在 uboot 里面使用“nand write”命令烧写 kernel 和 dtb。先编译出来 NAND版本的 kernel 和 dtb 文件,在烧写之前要先对 NAND 进行分区,也就是规划好 uboot、linux kernel、设备树和根文件系统的存储区域。I.MX6U-ALPHA 开发板的 NAND 分区如下:

0x000000000000-0x000004000000 : "boot"
0x000004000000-0x000006000000 : "kernel"
0x000006000000-0x000007000000 : "dtb"
0x000007000000-0x000020000000 : "rootfs"

 一共有四个分区,第一个分区存放 uboot,地址范围为0x0~0x4000000(共 64MB);第二个分区存放 kernel(也就是 linux kernel),地址范围为 0x4000000~0x6000000(共 32MB);第三个分区存放 dtb(设备树),地址范围为 0x6000000~0x7000000(共 16MB);剩下的所有存储空间全部作为最后一个分区,存放 rootfs(根文件系统)。

 可以看出 kernel 是从地址 0x4000000 开始存放的,将 NAND 版本 kernel 对应的 zImage 文件放到 Ubuntu 中的 tftpboot 目录中,然后使用 tftp 命令将其下载到开发板的 0X87800000 地址处,最终使用“nand write”将其烧写到 NAND 中,命令如下:

tftp 0x87800000 zImage //下载 zImage 到 DRAM 中
nand erase 0x4000000 0xA00000 //从地址 0x4000000 开始擦除 10MB 的空间
nand write 0x87800000 0x4000000 0xA00000  //将接收到的 zImage 写到 NAND 中

 这里我们擦除了 10MB 的空间,因为一般 zImage 就是 6,7MB 左右,10MB 肯定够了,如果不够的话就将在多擦除一点就行了。

 同理,最后烧写设备树(dtb)文件文件,命令如下:

tftp 0x87800000 imx6ull-alientek-nand.dtb //下载 dtb 到 DRAM 中
nand erase 0x6000000 0x100000 //从地址 0x6000000 开始擦除 1MB 的空间
nand write 0x87800000 0x6000000 0x100000  //将接收到的 dtb 写到 NAND 中

 dtb 文件一般只有几十 KB,所以擦除 1M 是绰绰有余的了。

 根文件系统(rootfs)就不要在 uboot 中更新了,还是使用 NXP 提供的 Mfgtool 工具来烧写,因为根文件系统太大!很有可能超过开发板 DRAM 的大小,这样连下载都没法下载,更别说更新了。

5、nand read命令

 此命令用于从 NAND 中的指定地址读取指定大小的数据到 DRAM 中,命令格式如下:

nand read addr off size

 addr 是目的地址,off 是要读取的 NAND 中的数据源地址,size 是要读取的数据大小。比如我们读取设备树(dtb)文件到 0x83000000 地址处,命令如下:

nand read 0x83000000 0x6000000 0x19000

在这里插入图片描述
 设备树文件读取到 DRAM 中以后就可以使用 fdt 命令来对设备树进行操作了,首先设置 fdt的地址,fdt 地址就是 DRAM 中设备树的首地址,命令如下:

fdt addr 83000000

设置好以后可以使用“fdt header”来查看设备树的头信息,输入命令:

fdt header

在这里插入图片描述输入命令“fdt print”就可以查看设备树文件的内容,输入命令:

fdt print

在这里插入图片描述 上图中的文件就是我们写到 NAND 中的设备树文件,至于设备树文件的详细内容我们后面会有专门的章节来讲解,这里大家知道这个文件就行了。

 NAND 常用的操作命令就是擦除、读和写,至于其他的命令大家可以自行研究一下,一定不要尝试全片擦除 NAND 的指令!!否则 NAND 就被全部擦除掉了,什么都没有了,又得重头烧整个系统。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值