当拿到一块全新的IMX6ULL开发板时,最令人兴奋的时刻莫过于第一次成功启动自己部署的Linux系统。不同于SD卡版本的即插即用,NAND版本的系统部署需要工程师对存储布局、文件传输和烧写流程有更深入的理解。本文将带你完整走一遍从空白NAND到可启动Linux系统的全流程,涵盖分区规划、文件传输、擦除编程等关键环节。
在开始实际操作前,我们需要确保开发环境准备就绪。首先确认你的开发板是NAND版本,并且已经通过SD卡启动方式进入了U-Boot命令行界面。建议准备以下工具和环境:
NAND Flash的特性决定了它与普通存储设备的操作方式有显著不同:
重要提示:操作NAND时务必确认目标地址范围,错误的擦除操作可能导致系统无法恢复
合理的分区方案是系统稳定运行的基础。对于512MB的NAND Flash,我们建议采用以下分区布局:
| 分区名称 | 起始地址 | 结束地址 | 大小 | 用途说明 |
|---|---|---|---|---|
| boot | 0x00000000 | 0x00400000 | 4MB | U-Boot引导程序 |
| env | 0x00400000 | 0x00500000 | 1MB | 环境变量存储区 |
| kernel | 0x00500000 | 0x01500000 | 16MB | Linux内核镜像 |
| dtb | 0x01500000 | 0x01600000 | 1MB | 设备树二进制文件 |
| rootfs | 0x01600000 | 0x20000000 | 490MB | 根文件系统(YAFFS2格式) |
这个方案相比原始参考有几个优化点:
在U-Boot中可以通过以下命令查看当前NAND信息:
bash复制nand info
nand device
首先将编译好的zImage和dtb文件放入Ubuntu主机的/tftpboot目录,然后在U-Boot中执行:
bash复制# 设置开发板IP和服务器IP
setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.10
saveenv
# 下载内核镜像
tftp 0x80800000 zImage
# 下载设备树文件
tftp 0x83000000 imx6ull-nand.dtb
按照我们的分区方案,执行以下操作:
bash复制# 擦除内核分区(16MB)
nand erase 0x500000 0x1000000
# 写入内核镜像(假设实际大小约7MB)
nand write 0x80800000 0x500000 0x700000
# 擦除设备树分区(1MB)
nand erase 0x1500000 0x100000
# 写入设备树(通常小于100KB)
nand write 0x83000000 0x1500000 0x100000
常见问题排查:
sudo ufw disable)netstat -anu | grep 69)烧写完成后,需要设置正确的启动参数:
bash复制setenv bootargs 'console=ttymxc0,115200 root=/dev/mtdblock4 rootfstype=yaffs2'
setenv bootcmd 'nand read 0x80800000 0x500000 0x700000; nand read 0x83000000 0x1500000 0x100000; bootz 0x80800000 - 0x83000000'
saveenv
参数说明:
root=/dev/mtdblock4 对应rootfs分区rootfstype=yaffs2 指定文件系统类型bootcmd 定义了自动启动时执行的命令序列验证烧写结果:
bash复制# 读取内核前512字节校验
nand read 0x80000000 0x500000 0x200
md 0x80000000
# 启动测试
boot
当需要批量部署多台设备时,可以考虑以下优化方案:
自动化脚本方案:
bash复制echo "tftp 0x80800000 zImage; tftp 0x83000000 imx6ull-nand.dtb; nand erase 0x500000 0x1000000; nand write 0x80800000 0x500000 0x700000; nand erase 0x1500000 0x100000; nand write 0x83000000 0x1500000 0x100000; setenv bootargs 'console=ttymxc0,115200 root=/dev/mtdblock4 rootfstype=yaffs2'; setenv bootcmd 'nand read 0x80800000 0x500000 0x700000; nand read 0x83000000 0x1500000 0x100000; bootz 0x80800000 - 0x83000000'; saveenv" > deploy.scr
mkimage -A arm -O linux -T script -C none -n "Deploy Script" -d deploy.scr deploy.scr.uimg
bash复制tftp 0x80800000 deploy.scr.uimg
source 0x80800000
生产环境建议:
在最近的一个智能家居网关项目中,我们采用这套方法成功部署了300+设备。实际测试表明,相比传统SD卡烧录方式,NAND直接部署的启动速度提升约40%,且稳定性更好。