返回
Author

lee

# 嵌入式

T系列 Nor Flash任意块写保护(Individual Block Locks)使用方法

1 简介任意块写保护(Individual Block Locks)简称IBL,可以实现flash 64KiB对齐单块写保护,其中首尾两个块可以做到4KiB对齐,使用起来更加灵活。Flash 使用 IBL 保护方案,需要SR3 WPS=1 ,Flash 上电或复位时,整片 Flash 默认全片写保护;系统启动时需要解锁允许读写的分区,未解锁区域继续保持保护。被保护区域执行 Page Program, Erase时,flash会自动忽略这些指令。2 使用前提内核启用了 Ingenic SFC v2 NOR 驱动。Flash 型号的 JEDEC ID 已加入驱动参数表。Flash 支持以下命令:   0x36  Individual Block Lock    0x39  Individual Block Unlock    0x3d  Read Block Lock Status    0x7e  Global Block Lock    0x98  Global Block UnlockFlash 的 WPS 位已按芯片手册要求打开。Flash 的 WP# 硬件保护脚没有被拉低。当前没有其它程序同时执行升级、写入或擦除3 工具语法./sfc_ioctl [-D device]  [arguments]地址、长度和寄存器值均使用十六进制,可以带或不带 `0x` 前缀。3.1 读取状态寄存器./sfc_ioctl -D /dev/ingenic_sfc0 read sr示例输出:sr1 = 0x00, sr2 = 0x00, sr3 = 0x003.2 配置 WPS驱动默认SR3 bit2 作为 WPS 位,有些厂商配置特殊,需要根据厂商手册确认。应先读取原值,再只置位 bit2,例如原值为:sr3 = 0x00,直接写0x04,置位WPS就开启IBL了。./sfc_ioctl -D /dev/ingenic_sfc0 write sr3 0x043.3 锁定指定区域例如锁定从 0x100000开始的 64 KiB:./sfc_ioctl -D /dev/ingenic_sfc0 lock 0x100000 0x10000保护范围为:[0x100000, 0x110000)3.4 查询保护状态./sfc_ioctl -D /dev/ingenic_sfc0 read lock_status 0x100000通常返回值含义为:1:已保护 0:未保护3.5 解除指定区域保护./sfc_ioctl -D /dev/ingenic_sfc0 unlock 0x100000 0x10000解除后再次查询:./sfc_ioctl -D /dev/ingenic_sfc0 read lock_status 0x1000003.6 整片锁定或解锁当len等于 Flash 总容量时,驱动会使用 Global Lock/Unlock。以 16 MiB Flash 为例:# 整片锁定 ./sfc_ioctl -D /dev/ingenic_sfc0 lock 0x0 0x1000000 # 整片解锁 ./sfc_ioctl -D /dev/ingenic_sfc0 unlock 0x0 0x10000004 注意事项SR2 WPS bit是Volatile/Non-Volatile Writable,掉电不丢失,当flash上电时WPS=1,就会默认开启全片写保护,需要在读写flash之前就把对应的区域解保护了,针对直接挂载可读写的文件系统分区时,驱动中有预留ingenic_sfc_nor_lock函数,可以在sfc驱动probe完成时调用解除相应区域的写保护,多个分区地址不连续的时候,可以调用多次地址和长度限 64 KiB 对齐,同时要保证addr + len <= Flash 总容量,不要传入 `len=0`、超出 Flash 容量的范围,或可能导致地址加法溢出的超大数值。# 正确示例 addr = 0x000000, len = 0x10000 addr = 0x200000, len = 0x20000# 错误示例 addr = 0x1234,   len = 0x10000 addr = 0x100000, len = 0x30005 常见问题5.1 lock 返回失败重点检查:地址是否 64 KiB 对齐;长度是否 64 KiB 对齐;地址范围是否超过 Flash 容量;Flash 是否支持 Individual Block Lock;JEDEC ID 是否已加入驱动参数表;WPS 是否已经打开;WP# 是否处于硬件保护状态。5.2 命令成功,但仍然可以写入不要只看 ioctl 返回值,应同时执行:./sfc_ioctl -D /dev/ingenic_sfc0 read lock_status并实际执行一次写入或擦除测试。如果状态没有变化,通常是 WPS、Flash 命令集或状态寄存器定义不匹配。5.3 写状态寄存器失败可能原因包括:WP# 引脚被拉低;flash状态寄存器写保护了;Flash 仍处于 Busy 状态;芯片的状态寄存器写法与当前驱动不一致。6 flash IBL区域分布图