あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

SIO通信2

通信に関しての決まり事を作ろうと思います。

・転送データは全て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!

f:id:akkera102:20141121204725p:plain
呼び出しはMBEDですが、何も値を乗っけていません。
GBA側からは予め決めた順番で送りつけています。


この後の発展としてはカードリッジの吸出しがあります。
ただ、mbed側の容量は2MBまでしかないので
SDスロットを拡張する必要があり・・・
秋月電子さんなどでブレットボード用のSDカードスロットを
買わなくてはいけません。