最近一些日子,一直都在搞关于GBA的东西。起先是按照原来的计划,在模拟器上来调试操作系统,但由于VisualBoyAdvance这个模拟器有不少 的bug,程序经常会莫名其妙地出问题,所以这个计划就失败了。当然现在想想或许是我的程序也有问题,但不是在硬件上直接执行,总是觉得并不是很放心,不 知道会如何。
因此,为了能够在GBA上直接调试程序,我开始看GDB的远程调试功能。看了一下之后,发现只要能够做一个远程客户端跟 GDB通信并完成协议规定的功能就可以了。如果替换指令没有问题的话,实现这样一个调试远程调试工具也并不是非常困难。剩下的唯一一个问题就是如何让PC 与GBA之间可以通信。关于这一部分,不少人做了很多的工作,可以说只要有时间去做硬件,很快就可以完成了。在各种方案中,我曾经仔细看过的有以下几种:
xboo: 这是最简单的一个方案,它直接用PC机的并口和GBA的通信口相连,通过控制并口的信号直接给GBA发送命令。这种方案最直接的用处就是把一个程序上传到 GBA的内存中,但要想做其它的事情,就比较困难了。原因是必须直接用PC机控制串口的信号,不仅要掌握硬件的通信协议,还要控制好时序,这在编程上是有 很大的困难的。xboo的作者提供了一个DOS下的程序,也有人写了Windows下的程序,但这些程序都没有源代码,并且运行的时候占用大量CPU,可 以想象,在Linux这样的系统下想完全正确地运行所有这些程序是比较困难的。
Smart Cable: 这是一个用PIC单片机来和GBA通信的方案,PC通过并口连接到一个PIC的单片机,然后单片机再连接到GBA。这种方案中PC和单片机之间采用EPP 的方式通信,而PIC单片机中的程序则实现了GBA所必须的时序控制。这个方案不仅有所有的硬件原理图,还有PIC单片机的源代码和一部分PC机上的源代 码,相信想要写自己的通信程序是没有问题的。但是这个方案必须要自己制作一个单片机的电路,更麻烦的是如果要对单片机编程还必须得有一个简单的编程器。对 于有很多单片机经验和设备的人来说,这恐怕并不是很难,但对于我这样的从来没有接触过单片机的人来说实在是太麻烦了。等以后有时间了,可以慢慢研究这个方 案。
USB to GBA: 这是一个通过PC的USB接口和GBA通信的方案。在方案中,原作者使用了EZUSB开发版以及Linux和libusb。EZUSB开发版是 Cypress公司的一款USB开发版,上面的USB芯片具有51单片机的功能,可以想象成接驳了USB的51单片机。在通信时依然是PC和这个51单片 机通过USB接口通信,而单片机再和GBA通信。在这个方案中所有的东西都有原程序,并且是用C语言写成的,因此,如果要做Multiboot的设备,具 有很大的参考价值。这个方案中,EZUSB开发版是最大的障碍,国内比较正规且比较便宜的EZUSB开发版大概600到800元,还有一些贵得离谱的。由 于我没有设备,也不想因为这个问题作太大的投入,因此没有考虑这个方案。等以后有钱又有时间可以试着用其他的比如D12开发版来做同样的事情,成本可以低 很多。
UART cable:GBA 有5种通信模式,前面的方案基本上都是利用其Normal/Multiplay模式来和GBA通信的。GBA还有一个UART模式,其工作原理和串口基本 相同。UART cable就是把PC机的串口和GBA连接起来的方案。在连接的过程中,比较重要的就是进行电压的转换,将PC机串口的电压(12V?)转换成GBA的 3V。这可以通过一个现成的芯片MAX3232或MAX3222来完成。这两款芯片的功能是基本上一样的,但后者有一个shutdown功能,似乎可以更 省电。由于我在市场里转了几个小时都没有找到直插的MAX3222CPN,因此就买了一个MAX3232CPE(18元)。看着芯片的说明和原理图,自己 做了一个。由于我的笔记本电脑没有串口,因此我买了一跟PL2303的USB转串口连线,将我的笔记本和GBA连了起来。硬件是一次成功的,首先在 Windows上完成了通信,但把那个程序移植到Linux上却始终不能工作,这耽误了我好几天的时间,甚至让我怀疑Linux上PL2303的驱动程序 是不是不能支持GBA。之后,我在网上进行了大量的查询,最终找到了一个在Linux上通过串口连接GBA的程序(连接)。 仔细检查之后,发现问题出在CTS Flow Control上,在Windows上,打开这个选项可以正常通信,但在Linux上,打开这个选项就没法正常通信了。我不知道这是什么原因,但至少找到 了一种解决的方法。利用串口通信,最大的问题是要首先在GBA上运行一个程序,这个程序将GBA设定成为串口通信模式,让后再把要执行的程序上载到GBA 中,并通过先前的程序运行它。那么要运行第一个程序就必须要通过multiboot或者将该程序烧录到卡带上。我是通过后一种方式来完成的,而烧录卡带则 用的火线,这在稍后会提到。
MBV2:这是一个很多人都认为不错的方案原因在于它不仅提供了硬件还提供了完整的通过PC操作硬件的方法, 也就是说可以自己写程序来使用硬件的功能。这个硬件基本上就是具有smart cable + uart的功能,因此对于要做GBA开发的人来说是很不错的。但由于这个东西在国内好像并不卖且其价格要$20,俺也放弃了。
火线: 这是国内高手开发的PC和GBA之间的连线,其功能和上面所说的smart cable基本上一样,但内部采用了51系列的单片机,并且其开发者提供了一个可以用来烧录各种D卡的程序,因此在国内好评不断。我也花95元买了一条, 并且搞了两个D卡改了一下(改坏了一盘)。不知是火线本身的质量问题,还是我把它的壳给拆开了,曾经有一段时间我的火线工作及其不稳定,经常会连不上,偶 尔又能连上。经过一番仔细地检查,我发现它的GBA连线中有两条都不通,而问题应该是出在GBA接头一端(跟我私拆火线没什么关系)。后来买了一条通信线 换掉了原先的,一切OK啦。火线最大的问题在于它的协议保密,也就是我们无法自己写程序来控制火线和GBA通信,对于想做一些开发工作的人来说,这是美中 不足。有个网站http://www.axio.ms/projects/GBA/我没有仔细看,但上面的MSMCcable应当和火线有些相似之处。
总 结一下,如果只是普通的玩家,买个火线就够了,如果是想做开发有可以买到国外的产品,MBV2相当好。如果想省钱,且有不少单片机的经验,自己做个 smart cable什么都解决了。如果没什么太多经验,最好像我做个UART cable再买一条火线,自己改一盘D卡或者买个火线卡,就可以开始后面的开发啦。要了解更多的GBA硬件,可以参考http://www.ziegler.desaign.de/GBA/gba.htm。
上 面说了不少关于硬件的东西,下面说一些零散的关于软件的东西。首先,对GBA的VRAM的访问必须是16位的,不管是什么模式中。今天在编写显示英文字符 的程序时,就是因为以8位为单位来访问VRAM内存而造成了错误。当进行中断的处理时,好像并不需要去恢复CPSR中的中断位,只要修改各种寄存器就可以 了。
今天总算搞定了最基本的各种工作,明天就开始写GDB的调试客户端,另外还需要重新编译一下GCC为multithread模式,否则函数应该是不能重入的,这会导致在多任务系统中的错误。