一. 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 是要写入的数据大小。
注意:首先,保证开发板设备可以 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上。
0x000000000000-0x0000003FFFFF : "boot"
0x000000400000-0x00000041FFFF : "env"
0x000000420000-0x00000051FFFF : "logo"
0x000000520000-0x00000061FFFF : "dtb"
0x000000620000-0x000000E1FFFF : "kernel"
0x000000E20000-0x000020000000 : "rootfs"
=> 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 addr 0x83000000
=> 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" 命令可以查看设备树文件的内容。