HP 39gs折腾记(一)
2021-03-28 00:46:03
  • 0
  • 0
  • 6

  好几年前我买了一个廉价的HP 39gs计算器,实际上放在那很少使用。最近看了cncalc论坛上一些关于此计算器刷固件升级的帖子,决定折腾它一下。这也不是为了需要这样的计算器功能,而为了体验(学习)这个产品的设计。升级办法就是换更大容量的Flash以装下其它型号的固件,还可以换SRAM来支持更高级型号,可以加SD卡槽。其实怎么换这些都是小容量的片子,存储能力和现在的手机差远了。

  我这个计算器还没拆过,第一次拆找不到下手的地方,遂翻帖子看线索。本人下手粗,就不在乎把它外观弄破了一点。屏幕前的盖板被我暴力撬起,为了被盖住的螺丝孔。然后抠壳,螺丝刀磕痕、掰坏塑料卡子在所难免。前后壳分离之后,要动烙铁来拆线了。

  HP 39gs外观很好,但里面这个电池线接得有山寨机的味道了。主板背面贴了屏蔽用的金属箔、纸(其实前面也有),把胶布逐个揭开然后把屏蔽层挪走。

  主板露出面目:CPU是三星S3C2410A (BGA封装,ARM920T),1MB NOR Flash, 256kB SRAM. 这个CPU其实是可以SDRAM的,不过计算器用不着。

  LCD用了两颗软封的控制器芯片,连同数据传输口做在一个模块上了。主板下方明显是空着的SD卡插槽位。注意旁边的型号那里用记号笔涂了。

  这说明有几个型号都用这块PCB,所以才能软升级嘛。

  然后就是换我买来的SRAM和Flash芯片了。由于家中没有热风枪,也担心热风枪把PCB后面的键盘烫坏,就使用堆锡+双烙铁技了。不料双烙铁下SRAM芯片纹丝不动,最后又加了镊子从下面撬,才拆下它来。我用IS62WV51216来替换,而不是同品牌容量更大的产品。SRAM地址线要增加一条,按照网上帖子说的要挪几个电阻,据我分析了下板子觉得没有必要,直接飞一条线更简单。

  换了SRAM就需要先验证一下了。接上电,居然屏幕不显示?!测电池电流,在18mA左右,比较稳定。不至于买到坏的片子吧(便宜货,可能是翻新的,脚有氧化现象)。我再用万用表检查了下每个引脚和下面焊盘的通断,没发现问题。没办法了,请出示波器检查信号,似乎也是正常的,WR有写的低脉冲。SRAM和Flash公用许多信号,然而没有逻辑分析工具,查信号是否正确就太困难了。时间也晚了,得收工。最后不死心,重新把引脚补锡再过了一遍,终于电流变化了,计算器启动,运行正常。

  第二天,借者光线好来换Flash. 还是同样的办法才拆下来,却不幸把一个焊盘撕开了。这焊盘还是向芯片中间一个过孔连过去的,飞线都没法飞。一查,这是A2地址线,不可不接。我只好小心地把那段走线上的绿油刮开,上锡,靠锡和焊盘连起来。用万用表检查的确连上了之后再焊芯片,焊时这个地方温度不可过高。

  我买的Flash芯片是已经烧入了HP40gs固件的。然而替换之后计算器启动却没有如期进入主界面。屏幕提示需要重新刷固件。

  正规刷固件有USB和SD卡方式,不动硬件的话就是USB连机方便了。我也没有加装SD卡槽的计划,暂时就用USB刷吧。找了HP的软件,装驱动,发现不能识别计算器…… 这软件也很早了,还支持Win98呢。也不知道是否是驱动有问题,装驱动还不能自己结束。HP40gs的软件自己有非法操作提示,HP48的正常些,但也连不到计算器。

  后来我换另一台电脑,驱动问题好象解决了,但是软件连接计算器后就断开了。计算器上提示“BAD FILE FORMAT”,可能是通信的问题。我试过很多次都如此,没有办法。

  更直接的刷机就是连JTAG刷Flash了,迟早都要玩这一步。根据大神的帖子,板子上JTAG就在边上很好引出,而且还是100mil间距的。我想了想,做成这样的接口比较好:

  现在的一个问题是,我没有J-Link,只能用OpenOCD来搞。我平时都不用JTAG……除了USB-Blaster是JTAG的。按说usb-blaster也被OpenOCD支持的,我曾经试过,没有成功。这次又试了一下,openocd认了,但是看起来有问题。那还是用FT232R来弄,这个容易获得,也试成功过一次了。还是ESP32工具里面的那个OpenOCD版本支持FT232R, 老早的0.9.0 win32版本没有支持。

  我先用STM32 nucleo验证了一下FT232R当JTAG适配器可以工作,再试连HP39gs. OpenOCD自带了s3c2410的配置文件,正好直接用了。顺利检测到了CPU. halt指令也起作用了。

  需要找到Flash的烧写方法。先要知道SRAM和Flash的内存地址。从S3C2410的手册上推断,Flash就从0x0开始,而且 0x40000000 还有 4kB 的片上SRAM可以用。我用 mww 命令测试了一下这两处是否能写入,的确一个是 ROM 一个是 RAM.

  在烧写之前先用 dump_image 把 Flash 内容保存出来。这个速度真心慢啊,FT232R bit bang本来就不快,没别的工具就得忍。

  我查了 OpenOCD 的资料,烧写这种 NOR Flash 并不复杂,OpenOCD 有CFI驱动支持,需要配置一下。这里就是在配置文件里面加上

flash bank $_CHIPNAME.nor cfi 0x0 0x200000 2 2 $_TARGETNAME jedec_probe

  配置之后可以用flash命令查看了

> flash list
{name cfi base 0 size 2097152 bus_width 2 chip_width 2}
> flash banks
#0 : s3c2410.nor (cfi) at 0x00000000, size 0x00200000, buswidth 2, chipwidth 2
> flash probe 0
Flash Manufacturer/Device: 0x00bf 0x234b
flash 'cfi' found at 0x00000000

  但是我用 flash write_bank 操作就不顺利,等了一会儿OpenOCD报错。可能是文件太大,JTAG速度太慢,超时了?但检查Flash内容,发现已经写进去东西了。

  于是试了几种命令,都不行,也不能用verify命令,因为会使OpenOCD无响应。4kB的片上SRAM作work-area不够?我发现了外部的SRAM在0x8000000, 那就设了256kB的来用。

$_TARGETNAME configure -work-area-phys 0x8000000 -work-area-size 0x40000

  但还是不能完成烧写。我发现一次操作0x20000后没有被写入,如果是某种限制造成,那么分段来写也有可能。这样我就写个程序,把2MB的固件文件分成128kB的小文件,一个一个烧试试。这样好在一个命令能执行完。

  烧完前120kB, 我再dump出来比对一下,发现有问题:0x8000之后出现了不一致。那就再改小,一次烧写32kB.

  在烧写前三个32kB之后,我发现第四个32kB已经有内容了。这怎么对呢?内容是和已经烧写的某块重复的。又测试了0x20000以上的部分,也发现相似的问题。一推算,就是16-bit总线的A15, A14地址线有问题。

  检查PCB. 测量Flash的A15, A14脚旁边测试点——它们是短路的。拆焊过程的遗留问题。排除短路故障后,在OpenOCD里面查看几个地址,内容已经独立了。

  然后,按照32kB为单位逐个擦除、烧写。64个文件,使用自动生成的命令来处理,也不是麻烦事。时间长,这样还能看到中间状态呢。十多分钟烧写好,然后断电重启,出现了正常计算器的界面。这样就被刷成HP 48GII成功了:


 
最新文章
相关阅读