本文介绍了用LPT接口实现SPI编程器的功能,适用于BIOS修复、BIOS调试开发等用途。

先说一下故事背景。

SerialICE项目(http://www.serialice.com/)在系统BIOS启动初期即接管Processor,使用改编的QEMU引擎以模拟方式介入后续指令的执行,从而实现硬件ICE的调试功能。
沿用SerialICE的思路,本人已成功将手上的华硕P5k-e+Intel Q6600改造成(非完美的)硬件调试器。这种的调试器比bochs调时器支持的硬件广泛,bochs需要为每一种外部设备编写代码模拟,bochs至今仍不支持1394接口,bochs的显卡过于老旧,根本无法运行DirectX9/10的代码。另外显示卡、以太网卡等外围部件不需要软件模拟,执行速度比bochs快很多。

为了开发这个项目,需要反复折腾BIOS ROM,官方的刷写工具只能在系统正常的时候使用,调试期间经常把BIOS刷死,因此必须另想办法。现在的PC主机板BIOS ROM芯片一般都采用SPI接口,SPI协议引脚少,实现简单。通常在ROM旁边有一个7针的外部编程接口,如下图所示。


老旧电脑的LPT接口配以合适的程序,能实现诸如SPI、JTAG等很多功能,除了速度稍慢。LPT的DB25插头引脚定义如下图。

捷克的Rayer利用LPT实现了SPI的接口编程(http://rayer.ic.cz/elektro/spipgm.htm)。接线图如下图所示。

找一个IDE硬盘或软驱的接头,砍下一部分并附带接线,与LPT的DB25插头按下表连接。


3.3V电源可取自本机ATX电源(桔黄色就是+3.3V)或另外的备用电源。由于SPI EEPROM数字电路芯片的瞬态电流比较大,需要在3.3V电源Vcc脚与GND之间接不小于1000uF的电容(耐压6V以上),Rayer电路中的150欧姆电阻可有可无。最后制成的电缆类似下图。


Rayer在网站上提供了一个SPI编程工具(SPIPGM),但是这个工具适用的芯片范围很窄。

flashrom项目(http://flashrom.org)提供了对更多芯片的支持。

电缆连接正确,电源接通后
运行flashrom -p rayer_spi即显示侦侧出的SPI EEPROM的型号;
运行flashrom -r bios.rom -p rayer_spi可以dump出EEPROM;
运行flashrom -w bios.rom -p rayer_spi可以写入EEPROM。

有了这个几乎免费的ROM芯片编程器,就可以随心所欲,毫无顾忌的修改BIOS了。预掌握Processor,必先掌握BIOS。