今年2月底我购入了FTX-1 Field,使用起来还算可以,但后续我想用这机器听收音机的时候,发现FM广播的98-99MHz无法正确接收信号,具体表现为,一旦右上角频率数字调整到98.0MHz至99.0MHz的区间时,整个频谱会突变,而不是随着大波轮旋转而平移。这时候,对比别的收音机,FTX1收到的信号全是错的。举例:FTX1在98.3MHz收到了电台A,但其余所有收音机都收不到这个信号;或是FTX1在98.5MHz收不到任何东西,但这里实际上有一个可以被别的收音机收到的电台。我的固件已经升级到最新,依旧存在此问题。
我一开始有怀疑过是机器在这个频段没做优化,收到的都是镜像,但随后,我发现了一个规律,98.0处收到的”错误“信号实际上是104.9的,其余频率也有这个规律,也即是,98到99MHz这段整体向上偏大约了6.9MHz。这么规整的偏移很难不让人想到是机内PLL或者别的什么频率合成器的配置有问题,于是我就用AI继续进行了一波分析,对FTX-1_MAIN_V0113.SFL这个MAIN部分的固件文件进行拆解,固件文件来自20260828的固件包。
固件由如下格式组成:240 byte的头部,和剩余的编码后的body。body是一堆循环加法变换处理过的Motorola S-Record,使用一个43 byte的key进行处理:1e 27 1b 12 11 16 19 17 24 25 29 1c 0d 0b 06 04 03 01 02 05 07 0c 0e 0f 18 1d 20 22 2a 2b 08 09 0a 10 13 14 15 1a 1f 21 28 23 26。解码时,使用decoded[i] = (encoded[i] - key[i % 43]) & 0xFF,重新编码时,使用encoded[i] = (decoded[i] + key[i % 43]) & 0xFF。
最终解码得出的MAIN固件对应的是Renesas RX651处理器的二进制,而他家工具链是公开可以下载的,于是就给了继续修改的机会。
后面让AI帮忙定位到了两个位置:0xFFE987F4 附近的 Frequency plan table,以及 0xFFE9514C 附近的 LMX2571 profile table。频率规划表引用的代码位于0xFFF317E3和0xFFF32CC2,98–99 MHz对应频率规划项为98,000,000 <= RF < 99,000,000,该项对应的 LMX2571 profile 位于 0xFFE952EC。
找到这个profile位置以后,解码得出,PLL参数为DEN = 0xA8C000 = 11059200,NUM = 0x806B01 = 8416001,N = 21, CHDIV = 32。PLL计算关系为Fvco = 221.184 MHz × (N + NUM / DEN), Flo = Fvco / CHDIV。
代入N=21:
NUM / DEN
= 8416001 / 11059200
= 0.7609954607928241
Fvco
= 221.184 × (21 + 0.7609954607928241)
= 4813.18402 MHz
Flo
= 4813.18402 / 32
= 150.412000625 MHz
这里就发现问题了:frequency plan的LO和PLL实际得到的LO频率不一致,frequency plan实际写的是143.500000625MHz。Flo-LO=6.912MHz。 接收时,假如信号在98.7MHz,LO和天线信号混频,产生的IF在44.8MHz,而这里错误的PLL配置产生的LO是150.412MHz。由于frequency plan写入的LO和实际PLL产生的LO不一致,机器仍然认为IF在44.8MHz,于是就产生了这个bug。
这里的问题所在,就是N = 21。将N = 21改为20,那么算出的PLL就应该落在正确位置上。
我对这里的值进行了修改,修改后发现还要重算CRC才能正确的封装固件。原始固件的header尾部可以看到MC 3243706 BFE2AB37,这里的3243706是长度,BFE2AB37是CRC。这里的CRC计算对象为encoded_body + 8F 93 C6 35,修补完成,重新计算CRC,得到D272B5C0,填入。由于长度不变,所以不需要修改长度值。
我给机器刷入了我修改的固件,实测98到99MHz接收的问题已经成功修复。
bug展示-97.995正常接收

bug展示-98.000频谱突变

修复效果
