存档八月, 2004

Debug & FlashRom

今天我主要做了两个方面的事情,一是仔细看了一下GBA是否具备写Debugger的条件,二是看了一下关于识别和擦写flash的问题。

首 先说debugger,在debugger中,最重要的一部分就是如何为程序加断点,因为调试一般都是要让程序单步执行。在什么位置加断点的问题是由 GDB来负责的,但具体把断点设置好以及在后面恢复则是stub必须做的。通常情况下,加断点最简单的方式就是使用无效指令来替换需要中断的程序,当 CPU执行到无效指令的时候,会进入一种特殊的状态,从而中断程序并进入stub。要使用这种方式,首先就要知道什么是无效指令,接着就要看当前的硬件是 如何处理无效指令的。在ARM7芯片上,所有的指令的长度都是4个字节或者2个字节,这对替换很方便,而无效指令则可以用0c100000h或者 4400h。在GBA上,其无效指令的处理首先是由ROM进行的,因此就必须要知道ROM中的程序如何执行。关于如何获得GBA的ROM,我稍后介绍。在 ROM中,遇到无效指令时,它首先会保存4个寄存器的状态,接着会根据卡带的两个位置的数值来判断卡带中是否有无效指令的处理程序以及无效指令处理程序的 位置。当卡带拥有无效指令处理程序时,它被放在第一个32Mbit的末尾,因此,stub程序也必须在相应的位置存在一些处理命令。到此为止,我可以肯定 地认为要在GBA上不借助额外的硬件实现GDB的stub是没有问题的,下一步就是做了。

再次,说一下关于flash的擦写。以前我有个 错误的观点认为D卡中用的是SRAM,其实多数D卡使用的都是flash芯片。因此,当程序运行在卡带上时,我们是不能随意修改flash的内容的,即便 是当程序运行在内存中,要修改flash的内容也是比较麻烦的。我看了不少关于擦写flash的资料,基本上大家针对的都是目前比较流行的芯片,基本上没 有介绍经常用在D卡中的三菱芯片的擦写方法的。相信还是有不少人掌握了这个方法了,但由于我还是这个方面的新手,也不太知道应该去什么地方搜索资料,也没 有经验,因此基本上没搞清楚该如何擦写flash。好在这不是一个严重的问题,反正最核心的代码在RAM中调好了就好了,一些不太重要的东西也完全可以在 模拟器上进行调试。

第三,今天我第一次把flash的ROM dump出来了,用的是DumpRom.zip, 它的程序可以把ROM中的内容写到卡带的用于记录游戏备份的sram中,因此只要找一盘普通的卡带,用火线把dumprom.mb.gba程序上传到 GBA上,再用火线备份游戏进度,就可以得到实际的GBA ROM了。拿到这个ROM,可以参考其中的中断以及未定义指令的处理方法,以便自己对其进行处理。

评论(1)

CRT Flow Control

关于GBA的CRT Flow Control,今天我又有了新的发现。在http://www.fivemouse.com/gba/上有一个关于uart的demo,其中的代码表明,如果要使用CTS Flow Control,还要手工的判断和设置RCNT中的SC和SD标志位。然后我又参考了AGB Developer Toolkit中的描述,似乎的确RCNT在UART模式中也是有它的作用的。以后有时间再试试吧。

留言

GBA Debug 调查

最近一些日子,一直都在搞关于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模式,否则函数应该是不能重入的,这会导致在多任务系统中的错误。

留言

POPFile

今天花了点时间装了一下POPFile,虽然这个东东对中文的支持还不是特别的好,但整体上真的是很不错,而且现在也可以正确分类我的大部分邮件。用这个东西很重要的一点是要把它的界面等都设成中文,否则没法正确工作的。

POPFile本身是按照一个过滤器的方式工作的,当收取E-mail时通过重设服务器为POPFile的服务器,就可以对邮件进行分类了。分类后的信息可以加入到邮件的标题中,也可以作为Header的一个字段。

用POPFile 的时候需要对其进行训练,它大概就是通过单词出现的次数来判断是属于哪个类别的。当对POPFile进行训练时,需要注意那些编码为base64或者 quoted printable的multipart邮件,不要对这些邮件进行重新分类,否则POPFile并不把邮件的内容展开而是直接使用编码后的字符进行统计, 这样会得到很多垃圾信息,影响邮件的正常分类。

留言

scim

今天我安装了新的输入法SCIM,以前也看到过这个动些很多次了,不过由于那是它还不是GPL的,没有智能拼音,所以我也就一直都没有装,现在这个东西已经有了deb的package,装起来方便多啦。

另外昨天我自己编译了一个arm-elf-insight,遇到一些比较大的程序要调试用它就比较好了。但如果还是小程序的话,可能用Emacs或者gdbgui还是最方便的。

留言

stack check

现在才发现没有glibc写程序变得很不爽,因为连最基本的C函数都已经没有了,能用的只有一些最基本的宏。

另外困扰我很久的stack check问题似乎已经有了答案,在gcc的参数中有几个是关于stack-check的,应该加上这些参数编译程序就可以自动进行栈指针的检查了。在ARM中r10也有另一个名字sl,其实就是stack limit啦。

另外感觉Visual Boy Advance工作一直都不是很稳定,在debug和console print方面真是毛病挺多的,看来做模拟器还真是一件挺困难的事情。

留言

link script

花了两天的时间,终于找到了一些做GBA程序的感觉。这两天的时间主要还是花在了对体系结构和工具的了解上。关于寄存器、汇编和binutils花了我很 多的时间。不过终于我现在已经知道如何编写自己的link script,这样就可以很灵活地进行操作了。关于这方面的东西,现在我的感觉还是挺零碎的,等有了时间仔细写出来。

留言