通信に関しての決まり事を作ろうと思います。
・転送データは全てCRC32でチェック。
・GBA割り込みのSerial関数を以下のように固定する。
IWRAM_CODE void IrqHandlerSerial(void) { REG_SIODATA32 = DumpIntr(); REG_SIOCNT = SIO_IRQ | SIO_32BIT | SIO_START; }
DumpIntr関数内は、state(状態遷移)変数で戻り値をコントロールします。
・GBA側の転送するデータはあらかじめCRC計算も含めて転送前に全て行う。
転送の間に計算を入れるとウェイト処理が必要で、コードが複雑になります。
・エラーデータはわかりやすく0xdeadbeef。
■BIOSを吸い出す
今更ネタを投下。
通常だとアクセスできないようですが、BIOSのMidiKey2Freqを使うと
拾ってくれるそうです。詳しくはMidiKey2Freqでぐぐってみてください。
吸い出したらmbed側にu32単位で
sizeCRC、size、dataCRC、dataの順番で送ります。
sizeCRCは、size(4バイト)のCRC。
dataCRCは、data(0x4000バイト(BIOSサイズ))のCRCとなっています。
・結果(mbedのログ)とGBA画面
MulitBoot done GBA MBED 0x00000000 0x00000000 ; empty 0x51de52dc 0x00000000 ; sizeCRC 0x00004000 0x00000000 ; size 0x81977335 0x00000000 ; dataCRC sizeCRC OK! data sending...(NoDebug) dataCRC OK! All done!
呼び出しはMBEDですが、何も値を乗っけていません。
GBA側からは予め決めた順番で送りつけています。
この後の発展としてはカードリッジの吸出しがあります。
ただ、mbed側の容量は2MBまでしかないので
SDスロットを拡張する必要があり・・・
秋月電子さんなどでブレットボード用のSDカードスロットを
買わなくてはいけません。