在嵌入式系统和Linux环境中,nand
命令通常用于管理NAND闪存设备(尤其在U-Boot引导加载程序中)。以下是详细配置和使用指南:
命令 | 说明 |
---|---|
nand info | 显示所有NAND设备信息 |
nand device [num] | 显示或切换当前操作的NAND设备 |
nand bad | 列出所有坏块 |
nand dump[.oob] <addr> | 转储NAND数据(包含OOB区) |
# 擦除整个芯片nand erase.chip# 擦除指定范围(起始地址+大小)nand erase <offset> <size># 擦除分区(需预先定义mtdparts)nand erase.part <partition-name>
参数说明:
offset
:十六进制起始地址(如 0x0
)
size
:十六进制大小(如 0x100000
)
# 读取数据到内存nand read <mem-addr> <nand-offset> <size># 写入数据到NANDnand write <mem-addr> <nand-offset> <size># 带OOB操作(如JFFS2文件系统)nand write.jffs2 <mem-addr> <nand-offset> <size>
示例:
将内存 0x82000000
处的2MB数据写入NAND偏移 0x600000
:
nand write 0x82000000 0x600000 0x200000
# 标记坏块nand markbad <offset># 强制跳过坏块写入(谨慎使用)nand write.spread <mem-addr> <nand-offset> <size>
在Linux用户空间,使用 mtd-utils
工具包:
# 安装工具sudo apt install mtd-utils
命令 | 功能 |
---|---|
flash_erase /dev/mtd0 0x0 0x100 | 擦除MTD设备 |
nanddump -f /tmp/dump.bin /dev/mtd0 | 转储NAND数据 |
nandwrite /dev/mtd0 image.bin | 烧录镜像到NAND |
mtd_debug info /dev/mtd0 | 显示MTD设备信息 |
# 擦除分区flash_erase /dev/mtd1 0 0# 烧录内核镜像nandwrite -p /dev/mtd1 uImage# 烧录UBI文件系统ubiformat /dev/mtd2 -f rootfs.ubi
定义MTD分区(在U-Boot中):
setenv mtdparts 'mtdparts=nand0:1M(uboot),3M(kernel),12M(rootfs),-(user)'saveenv
在Linux内核中指定分区(/boot/cmdline.txt
或设备树):
partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; partition@0 { label = "uboot"; reg = <0x0 0x100000>; }; partition@100000 { label = "kernel"; reg = <0x100000 0x300000>; }; };
对齐要求:
擦除/写入地址必须按 块大小(通常128KB/256KB)对齐。
大小需为块大小的整数倍。
坏块处理:
生产环境中必须启用ECC校验。
使用 nand write.spread
自动跳过坏块(U-Boot)。
性能优化:
启用硬件ECC(在U-Boot配置中定义 CONFIG_NAND_ECC_HW
)。
在Linux中使用DMA传输(CONFIG_MTD_NAND_DMA
)。
安全操作:
擦除前备份关键数据。
避免直接操作包含引导程序的分区(如 uboot
分区)。
U-Boot中更新内核:
tftp 0x82000000 uImage nand erase.part kernel nand write 0x82000000 0x100000 0x500000 reset
Linux中更新UBI文件系统:
ubiformat /dev/mtd2 -f newfs.ubi ubiattach -m 2mount -t ubifs ubi0:rootfs /mnt
通过以上配置,可高效管理NAND闪存。请根据实际硬件调整参数(块大小、ECC模式等),具体参考芯片手册。