经过本人对Sigmatel固件将近一年分析修改, 总结出以下6点修改方法,给各位对DIY固件感兴趣的朋友共享一下

1.改LCD初始化参数

   如果LCD没有显示或显示对比度很高,那就需要换LCD控制芯片初始化参数。
LCDLCD控制芯片初始化参数一般如下形式,00000C 00002F 000042 0000A6 0000A4 000021 0000A1 000081 00001A 0000AF 0000E0 0000C8 0000A1,这组参数位于resource.bin文件内,没有查找改数据的好办法,只能死找,看到相似的就是, 用上面这段参数替换(适合V128的LCD)。

此主题相关图片如下: 


如果显示上下相反,把0000C8改成0000C0
如果显示左右相反,把0000A1改成0000A0
特殊情况可能还要换LCD控制线。
三星YEPP55固件就发现这个问题,经过如下修改LCD才有显示
BSET #$0A,X:$00F40M  换成  BSET #$09,X:$00F40M  M=(0,1,3,9)
BSET #$09,X:$00F40M  换成  BSET #$0A,X:$00F40M

2.改对比度

如果还发现对比度过高,那就需要改对比度数据,用RESEDIT查找000081(LCD对比度设置命令),找到如下形式的程序段,将后一个参数改小。
MOVE #$000081,A //设置命令
JSR $lcdcmd
...
MOV #$00001D,A  //对比度参数  
...
JSR $lcdcmd

例如:YP55可以找到如下程序段:
MOVE #$000081,A //设置命令
JSR $XXXX
...
...
MOV #$00001D,B  //对比度参数  
ADD B,A
JSR $XXXX


3. 替换字库

   修改字库一般采用替换法,就是从其他固件里导出字库,再导入目标固件。
第一步,先确定字库数据段位置。用RESEDIT打开固件,列表中间的数字是数据类型,字库数据由类型为2和9的几个数据段组成,
一般为2 9 9 9 2 9
图中315~31A的数据就是字库数据。

此主题相关图片如下: 


第二步:导出字库。用RESEDIT从源固件内一一导出这些数据。
第三步:导入字库。用RESEDIT打开目标固件,一一对应导入这些数据。注意:导入时一定要用我写的那个RESEDIT,RESEDIT会对数据段重新分配大小,而其他软件可能会丢失部分数据。

4.背光

如遇到背光常亮,先查找2f700a11f400(BSET #$0F,X:$00F411) 替换成000000000000(NOP),将其屏蔽,然后用排除法,排除LCD,FM控制等位指令,将余下的位指令逐一替换成2f700a11f400测试。
例如 YEPP55的背光
BSET #$09,X:$00F401  换成  Bclr #$0f,X:$00F411
Bclr #$09,X:$00F401  换成  BSET #$0f,X:$00F411


5.图位置修改方法:

这是固件里最难的一步,因为LCD显示屏大小不同,可能需要对大量图片做大小转换并改变显示位置,往往有个别图片很难找到。
显示程序一般形式:
MOVE B,X   (X坐标)
MOVE A0,ID  (图片的ID,就是用资源分析软件打开看到的图片序号)
MOVE A1,Y  (Y坐标)
MOVE Y0,#$03000X
MOVE A0,Y:(R7)++
MOVE B,Y:(R7)++
MOVE A,Y:(R7)++
....
....
JSR $00XXXX
先找到图片ID,如图 (注意这个数字是10进制)


此主题相关图片如下: 


10进制的490转成16进制为1EA,就能找到下面程序段。
更改 MOVE #$000024,A 就可以改变X坐标,
#$000010,B可以改变Y坐标。

此主题相关图片如下:



固件里语句的顺序及所使用的寄存器都不一定和例子相同,所以查找方法只能根据图片ID,然后再更改坐标值试验,
用RESEDIT查找方便点,还有对于一些连续的图片,固件中可能只出现第一张图片的ID。

6.按键

按键改法比较烦琐,方法是反复更换按键定义数据,总结出规律。
按键数据区查找方法:
用SRDBIN反汇编,打开StmpSys.sb.txt,找到如下形式的数据段,括号内的区域即为按键数据区,其中80开头的是功能数据。
10 XXXX: 000000 000000 000000 000003 00F420 00F422 000002 00F410 00F412 080000
10 XXXX: 00F420 00F422 000004 000003 00F420 00F421 00F423 000001 00F410 00F411
10 XXXX: 00F413 800000 00F410 00F411 00F413 400000 000002 00F410 00F412 000400
10 XXXX: 00F410 00F412 000800 000000(000080 000001 000008 000020 000000 000002
10 XXXX: 000010 000000 000100 000200 000010 000002 800002 000008 800008 000100
10 XXXX: 800100 000000 800200 000010 800010 000080 800080 000020 800020 000200
10 XXXX: 800001)000000 000000 000000 000000 000100 000000 000000 000000 000100
然后再用SBEDIT打开stmpsys.sb,找到上述数据区后,更换试验。


此主题相关图片如下:


看完相信大家可以体会到修改固件很烦,不是一时半会就能改成的,所以改固件最重要的一点是不能轻易放弃。以上是我这近一年来修改固件得出的经验。