1. 全志T153 NAND调试实战指南
作为一名嵌入式开发工程师,最近在调试全志T153平台的NAND Flash时踩了不少坑。这里将完整记录从芯片选型到系统烧录的全过程,特别是针对F35SQA512M-WWT这款512Mbit SPI NAND的适配细节。不同于官方文档的泛泛而谈,本文会重点分享实际工程中那些容易忽略的关键参数设置和问题排查技巧。
2. NAND芯片参数解析
2.1 芯片基础参数
我们使用的F35SQA512M-WWT是典型的SPI NAND Flash,其物理结构参数直接影响后续的驱动配置:
- 容量组织:单Die设计,每Die包含512个Block
- 页结构:每页2KB(2048字节)+64字节OOB
- 块大小:64页/块 → 128KB/块
- 操作模式:支持Quad/Dual读写(需硬件连线配合)
特别注意:OOB区域用于存放ECC校验数据和坏块标记,64字节的配置决定了后续ECC方案的选择空间。
2.2 关键时序参数
在uboot和kernel驱动中需要准确配置的硬件参数:
c复制.NandID = {0xcd, 0x70, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff}, // 厂商识别码
.spi-max-frequency=<100000000>; // SPI时钟最高100MHz
.OperationOpt = SPINAND_QUAD_READ | SPINAND_DUAL_READ | SPINAND_QUAD_PROGRAM
实际布线时,若走线质量不佳,建议降低时钟频率至50MHz以下以避免信号完整性问题。
3. Uboot适配详解
3.1 驱动注册流程
在brandy/brandy-2.0/u-boot-bsp/drivers/mtd/awnand/spinand/physic/id.c中添加设备描述:
c复制{
.Model = "F35SQA512M-WWT",
.DieCntPerChip = 1, // 单Die设计
.SectCntPerPage = 4, // 每页4个扇区(512B/sector)
.PageCntPerBlk = 64,
.BlkCntPerDie = 512,
.OobSizePerPage = 64,
.BadBlockFlag = BAD_BLK_FLAG_FRIST_1_PAGE // 坏块标记在首页OOB
}
3.2 设备树配置
在uboot-board.dts中需要正确声明SPI控制器参数:
dts复制spi-nand@0 {
compatible = "spi-nand";
reg = <0x0>; // CS0片选
spi-rx-bus-width = <0x04>; // Quad模式接收
spi-tx-bus-width = <0x04>; // Quad模式发送
spi-max-frequency = <100000000>;
};
实测发现,全志平台的SPI控制器在Quad模式下需要确保CLK线阻抗匹配,否则会出现数据校验错误。
4. Kernel层适配要点
4.1 MTD子系统配置
内核驱动位于bsp/drivers/mtd/awnand/spinand/physic/id.c,参数需与uboot保持一致:
c复制.EccType = BIT2_LIMIT1_ERR2, // 每512字节最多纠正2bit错误
.EccProtectedType = SIZE16_OFF0_LEN16 // ECC保护16字节@偏移0
建议在menuconfig中启用:
code复制CONFIG_MTD_SPI_NAND=y
CONFIG_MTD_UBI=y
CONFIG_UBI_FS=y
4.2 坏块管理策略
该芯片使用首页OOB第一个字节作为坏块标记(非0xFF表示坏块)。在驱动中需配置:
c复制.BadBlockFlag = BAD_BLK_FLAG_FRIST_1_PAGE
实际测试中发现,部分批次芯片会在擦除后残留标记位,建议在首次烧录前全片擦除。
5. 分区表设计与优化
5.1 sys_partition.fex配置示例
ini复制[mbr]
size = 248
[partition]
name = boot-resource
size = 20480 # 20MB
[partition]
name = env
size = 400 # 预留环境变量区
[partition]
name = boot
size = 40960 # 40MB
[partition]
name = rootfs
size = 40960 # 40MB
容量计算要点:
- 总可用空间:512Mbit = 64MB
- 需预留5%空间用于坏块替换(约3MB)
- 实际可用约61MB,上述配置总和为102MB → 明显超标
5.2 空间优化方案
通过实测得出:
- 压缩后的boot.img实际大小约28MB
- rootfs.ubifs约26MB
调整后分区:
ini复制[boot]
size = 30720 # 30MB
[rootfs]
size = 30720 # 30MB
保留6MB余量用于UBI开销和坏块替换。
6. UBIFS文件系统构建
6.1 mkfs.ubifs参数详解
关键参数计算公式:
bash复制mkfs.ubifs
-m 2048 # 页大小2KB
-e 126976 # LEB = PEB(128KB) - UBI头(4KB)
-c 242 # rootfs分区30MB / LEB大小 ≈ 242
-x zlib # 使用zlib压缩
6.2 空间不足问题排查
典型错误日志:
code复制ubi volume total size is larger than mtd size.
ubi_vol_total_bytes : 0x3ada000, mtd_bytes: 0x38e0000
解决方法:
- 检查
-c参数是否超过分区容量/LEB大小 - 确认
sys_partition.fex中分区总和不超过Flash物理容量 - 考虑启用LZO压缩(比zlib节省约5%空间)
7. 烧录问题实录
7.1 典型错误处理
现象:烧录时报错write mbr sectors fail
排查步骤:
- 通过
sunxi_flash工具读取芯片ID确认通信正常 - 检查uboot阶段是否成功识别NAND
- 最终发现是分区表超出Flash容量导致
7.2 性能优化技巧
- 在
board.dts中增加:
dts复制nand-flash@0 {
nand-ecc-mode = "hw";
nand-ecc-strength = <2>;
nand-ecc-step-size = <512>;
};
- 使用Quad模式时,CLK线需加33Ω串联电阻匹配阻抗
- 批量烧录前建议先执行全片擦除(
nand scrub)
8. 稳定性验证方案
完成烧录后需要重点检查:
- 坏块管理:人为制造坏块后验证系统能否自动屏蔽
- ECC纠错:使用
nandflipbits工具注入bit错误测试纠错能力 - 长期写入:通过
iozone工具进行72小时持续写入测试
经过上述步骤,我们的T153平台最终实现了:
- 平均读写速度:Quad模式达32MB/s
- ECC纠错成功率:2bit错误100%纠正
- 系统启动时间:从NAND冷启动约3.2秒
这个过程中最大的教训就是:NAND分区一定要预留至少10%的冗余空间,特别是小容量Flash。我曾经因为只留了5%导致产线批量出现坏块替换不足的问题,不得不重新调整分区布局。
