因调整电压导致Block67读写失败怎么办

最近有一些朋友因为调整电压导致Block67读取失败,sensorstool不能再操作手机,出现错误“Error:Unable to read Eelite BlockID=67 info"而同时手机不能开机 。这种情况,有的朋友没有备份EEP,只能写别人的EEP 。很麻烦!其原因主要是当刚刚连接到手机,所有的数字还是0的时候,有的人按了write phone,导致Block67被全部置0 。
这是我在第一次发表这篇文章时的观点,因为今天看来,这是错误的 。对此我非常惭愧,这是我在没有充分证据的情况下发的,想当然而的观点,所以特地写了一篇修正版,以正视听 。
其实这个问题是因为sensorstool的Bug 。我在《6688经验半月谈》里曾经说过EEPROM的数据结构和存储 。这里再说以下,在EEP里数据是索引存储的,其索引的数据结构如下:
EEPROM Block Directory Record format:
Offset SizeDes cription
------ ----- ----------------------------------------------
00BYTERecord starting marker [00,F0,FC] 记录标志为00,
F0或FC00= Unused block?不用的Block
F0= Deleted block? 删除的Block
FC= Used block? 当前有效的Block
01BYTEVersion. [00..05]
Always zero in LBA_FS & EE_FS blocks.
Only EELITE blocks that has 04 & 05.
02WORDSize
04DWORD Linear address of data 此处为Flash地址
08WORDID 为平常说的BlockXX,如Block67
0ABYTE??? [00,01,02]
Always zero in EEFULL & EELITE blocks.
Always 02 in LBA_FS & EE_FS blocks.
0BBYTERecord ending marker [00,F0,FC,FF]
FF= No more record
在6688中,Block67(43H)是和电压相关的,也就是大家平时所说的电压参数 。同时也是Sensortool所修改的Block 。它的大小是20个字节 。具体含义如下:
Battery status (0043):
- 0000H : BattMin Data1
- 0002H : BattMin Data2
- 0004H : BattMax Data1
- 0006H : BattMax Data2
- 0008H : BattTemp Data1
- 000AH : BattTemp Data2
- 000CH : EnvTemp Data1
- 000EH : EnvTemp Data2
- 0010H : VCXOTemp Data1
- 0012H : VCXOTemp Data2
注:以上资料来自于RizaPN,这个我没有研究过 。
而sensortool所使用的Blk文件就是Block的缩写,因为这些数据是和手机硬件相关的,所以Block67存储在EELITE(C000H-FFFFH)中,大家可以打开看看 。但是Sensortool有个问题,因为他每次写入新的电压参数时都是把原有Block索引的记录标志字节(Record starting marker )由FC改为F0,既又正在使用改为删除,而新建一条索引来把这个Block放在一个新位置 。这样索引(索引表都是放在后面,可参考半月谈)是向上增加,而Block数据是向下增加的 。那么总会有这种情况发生,就是最新的位置已到了索引表的位置,那么就会发生冲突 。我猜测sensortool是先删除记录,再新建索引表,但这时已发现没有空间来建立Block了,但他并不恢复删除的记录,所以所有的Block67的索引表都被标为F0(删除),所以系统中没有Block67的索引表,所有的工具在读写这个Block时都会发生错误,手机也会 。我之前的错误是以为Block的所有字节都被置为0 。
解决的办法是非常的简单的:
如果你备份了自己的EEP,那么只须重新写入就可以了 。所以我一直强调要备份EEP,最好是低版本的原始EEP,所谓不战而屈人之兵 。
如果你没备份自己的EEP,你只需读出EEP,然后找到某一条(因为有很多条)Block67的索引记录,然后把它的头和尾的录标志字节(Record starting marker )由F0为FC即可 。寻找的办法是用HEX编辑器打开,如UltraEdit,然后查找430000F0,会找到很多条记录,你因该修改找到的第一条的纪录,也就是最新的纪录(因为索引表是向上增长的),如F00114003EFBFF00430000F0,其中的3EFBFF是Block的实际地址(Flash地址,对应于文件地址是5FFB3E,FFFB3E-A00000) 。你需要修改头尾的F0为FC,即FC0114003EFBFF00430000FC就可以了 。然后把它写回到手机 。

推荐阅读