IMX6ULL移植篇-Nand-Flash操作命令二

 一.   Nand-Flash 命令

本文承接上一篇文章,即关于 Nand-Flash 相关命令的学习。

文章如下:

IMX6ULL移植篇-Nand-Flash操作命令一_凌肖战的博客-CSDN博客

本文来学习 nand erase,nand write,nand read 命令,来学习这个命令的使用。

二.  Nand-Flash 操作命令

(1)  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”。

(2)  nand write 命令

此命令用于向 NAND-Flash 中 指定地址写入指定的数据。

"nand write" 命令 一般 与nand erase命令配置使用,更新 NAND-Flash 中的 uboot、linux kernel 或设备树等文件。

命令格式如下:

nand write addr off size

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

注意:
由于 I.MX6ULL 要求 NAND 对应的 uboot 可执行文件还需要另外包含 BCB DBBT ,因
此直接编译出来的 uboot.imx 不能直接烧写到 NAND 里面。除非大家去研究一下 I.MX6ULL BCB DBBT ,然后在 u-boot.imx 前面加上相应的信息。否则,即使将 uboot 烧进去了也不能运行。我们 使用 mfgtool 烧写系统到 NAND 里面的时候, mfgtool 会使用一个叫做“ kogs-ng ”的工具完成 BCB DBBT 的添加。
不能更新 uboot文件,但是,我们可以在 uboot 里,通过 "nand write" 命令 烧写 kernel 和 dtb。

注意:首先,保证开发板设备可以 ping的通 ubuntu虚拟机。

更新设备中的内核文件,即 zImage文件。方法如下:

(1)  编译正点原子提供的内核工程,生成内核文件 zImage

关于内核的编译,到kernel章节再说明编译过程。

(2) 通过网络将 zImage传至开发板上, 使用 tftp服务传输。

首先,保证开发板可以 ping通 ubuntu系统。进入开发板的uboot命令模式,(我的ubuntu系统的ip地址是 192.168.1.66)验证如下:

=> ping 192.168.1.66
Using FEC1 device
host 192.168.1.66 is alive

将 zImage文件传输到开发板的 DRAM中,操作如下:

=> tftp 0x87800000 zImage 
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
TFTP from server 192.168.1.66; our IP address is 192.168.1.50
Filename 'zImage'.
Load address: 0x87800000
Loading: #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #
	 860.4 KiB/s
done
Bytes transferred = 6680336 (65ef10 hex)

可以看出,zImage已经成功传输到开发板的DRAM中。

(3) 使用"nand write"命令,将zImage DRAM 传输到 nand-Flash上。

在烧写之前要先对 NAND 进行分区,也就是规划好 ubootlinux-kernel、设备树和根文件系统的存储区域,I.MX6U-ALPHA 开发板出厂系统 NAND 分区如下:

0x000000000000-0x0000003FFFFF : "boot"
0x000000400000-0x00000041FFFF : "env"
0x000000420000-0x00000051FFFF : "logo"
0x000000520000-0x00000061FFFF : "dtb"
0x000000620000-0x000000E1FFFF : "kernel"
0x000000E20000-0x000020000000 : "rootfs"
以上是nand-flash的分区,分别存放是boot,环境变量env,日志信息logo,设备树文件dtb,内核文件zImage,文件系统文件rootfs。
接下来将 zImage文件写到 nand-flash的内核存放地址。操作如下:
首先,擦除nand-flash中存放 zImage的地址。操作如下:
=> nand erase 0x620000 0x700000

NAND erase: device 0 offset 0x620000, size 0x700000
Skipping bad block at  0x00c80000                                          
Skipping bad block at  0x00ca0000                                          
Erasing at 0xd00000 -- 100% complete.
OK
=>

其次,将 zImage(即DRAM中的)写入 nand-flash存放 zImage的地址,操作如下:

=> nand write 0x87800000 0x620000 0x700000

NAND write: device 0 offset 0x620000, size 0x700000
Skip bad block 0x00c80000
Skip bad block 0x00ca0000
NAND write to offset d40000 failed -5
 7077888 bytes written: ERROR
=> 

设备关闭电源,重启后。查看打印信息如下:

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 4.1.15 (wangtian@wangtian-virtual-machine) (gcc version 4.9.4 (Linaro GCC 4.9-2017.01) ) #1 SMP PREEMPT Sat Sep 2 22:29:18 CST 2023

从上面logo信息可以看出,内核编译时间是 2023年9月02号 22:29:18分,说明内核文件 zImage已经成功更新。

(3)  nand read 命令

举例读取设备树文件来说明 nand read命令的使用。

首先,将编译好的 设备树文件 imx6ull-alientek-nand.dtb传输到开发板上。输入如下命令(进入设备的boot命令模式下):

tftp 87800000 imx6ull-alientek-nand.dtb  //将文件传输到设备的DRAM中
nand erase 0x520000 0x100000             //擦除nand-flash存放设备树文件的地方//从地址 0x520000开始擦除 1MB的空间
nand write 0x87800000 0x520000 0x100000  将接收到的设备树文件写到 nand-flash中

操作如下:

=> tftp 0x87800000 imx6ull-alientek-nand.dtb
Using FEC1 device
TFTP from server 192.168.1.66; our IP address is 192.168.1.50
Filename 'imx6ull-alientek-nand.dtb'.
Load address: 0x87800000
Loading: ###
	 2.5 MiB/s
done
Bytes transferred = 39666 (9af2 hex)
=> nand erase 0x520000 0x100000

NAND erase: device 0 offset 0x520000, size 0x100000
Erasing at 0x600000 -- 100% complete.
OK
=> nand write 0x87800000 0x520000 0x100000

NAND write: device 0 offset 0x520000, size 0x100000
 1048576 bytes written: OK
=> nand read 0x83000000 0x520000 0x10000

其次,将 nand-flash上的imx6ull-alientek-nand.dtb读取到设备的 DRAM中。

例如,读取设备树(dtb)文件到 0x83000000 地址处, 输入如下命令:

=> nand read 0x83000000 0x520000 0x10000

NAND read: device 0 offset 0x520000, size 0x10000
 65536 bytes read: OK

最后,就可以读取设备树文件的信息了。
首先使用 fdt 命令设置 fdt 的地址, fdt 地址就是 DRAM 中设备树的首地址。命令如下:
=> fdt addr 0x83000000

设置好地址以后,可以 查看设备树的头信息,输入"fdt header" 命令即可查看。操作如下:
=> fdt header
magic:			0xd00dfeed
totalsize:		0x9af2 (39666)
off_dt_struct:		0x38
off_dt_strings:		0x90e8
off_mem_rsvmap:		0x28
version:		17
last_comp_version:	16
boot_cpuid_phys:	0x0
size_dt_strings:	0xa0a
size_dt_struct:		0x90b0
number mem_rsv:		0x0

=> 

输入 "fdt print" 命令可以查看设备树文件的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值