spi flash jffs2异常解决

文章讲述了在替换spiflash过程中遇到的两个问题:一是扫描eraseblock时找不到预期的Magicbitmask,通过添加case解决;二是usr分区读写问题,涉及Flash保护和锁操作。最终在驱动中找到并修复了导致异常的lock函数调用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在替换spi flash时出现了两个问题:

1.没有业务的时候在挂载app和usr分区时出现了如下的打印:


jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9004: 0x14f2 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9008: 0x8b8b instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d900c: 0x1553 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9010: 0x6c14 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9014: 0x0c0d instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9018: 0x1474 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d901c: 0x2a53 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001d9020: 0xf352 instead

这个问题在set_4byte添加了一个case,恢复了正常

第二个问题排查得比较久,需要教长篇幅来说明一下过程:

在解决了第一个问题的后,我们想把完整的业务烧录进去,进行长拷测试。在启动后,发现仍然有挂载不上去的问题,最终将问题定位到nor flash的能力集的参数上面:

在这个"0"的位置上,本身是SECT_4K,把它改成0之后,app分区挂载正常了,可以正常读取启动业务脚本;

之后便出来了第二个问题:

在业务启动后,不停地出现这些打印:

jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x000000c0)
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00859000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00857000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00854000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00852000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00851000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x0084f000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x0084e000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x0084c000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x0084b000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00849000
jffs2: Newly-erased block contained word 0x20031985 at offset 0x00846000
jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x00000048)
jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x00000048)
jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x00000048)
jffs2: Node totlen on flash (0xffffffff) != totlen from node ref (0x00000048)

1)猜测可能是芯片本身问题

在测试中在关闭业务后,发现无法删除usr下地某一个文件;

在替换芯片之后仍然出现这个问题,排除单颗芯片问题;

2)spi flash引脚信号不对

与fae沟通后,会不会是硬件配置不对,因为fae有同样的demo板,换上同样的芯片后,使用正常,想验证一下spi 的 wp 和 hold引脚是否功能正常;

经过测量也没有任何异常,时钟频率也一致,但是在boot下时钟频率是10M左右,内核下时钟频率为20M,因为在boot下读写flash正常,因为app和ios分区功能正常;

但是修改频率的方式仍然出问题:1.在驱动中强制配置成9.75M,仍然会出现问题;2.spi20M时钟频率下,在app分区读写文件仍然可以;

3)确认无法读写位置

发现app分区读写位置可以,想排除一下usr是哪里开始不能读写,最后排查到是usr分区最后4M,
0x000001700000-0x000002000000 : "usr"

可以看到usr分区也是在flash的最后,也就是说flash的最后4M区域出现问题;

读到status register(sr)数据为0x1c,根据器件手册可以看到,对应的block protect位是bp0 bp1 bp2为1,导致的异常;

我们在spi flash初始化的时候,把这个寄存器给设置0,flash被保护的区域可以正常读写了;

4)最终解决

在发现是操作了sr之后,于是我在flash的驱动中查找操作sr寄存器的操作,在lock函数中找到了对sr进行操作,于是我在想是不是这个地方会导致sr的异常操作:

于是在probe函数里发现了lock和unlock的注册,我尝试将此处屏蔽,

没想到真起了作用,没有报错了,问题解决了;

5)查找问题原因

既然知道了调用了lock,我查找到了mtd_lock函数会调用到这个接口,我便在mtd_lock中加入debug,查看如何调用到这个位置,添加的debug函数和调用栈信息打印如下:

从堆栈信息的跟踪发现,传入了MEMLOCK这个参数,最终定位到了我们调用的接口,问题原因已经查明;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值