DevkitProで使われているdswifiについて(2)
前回に引き続き、ソースを見て行きたいと思います。どうも、dswifiのfifo通信の方法はSond関連とは違うようです。ARM7とARM9を橋渡しする構造体が存在するところは同じです。
Wifi_MainStruct構造体
wifi_shared.hにあるWifi_MainStruct構造体のようです。
typedef struct WIFI_MAINSTRUCT { unsigned long dummy1[8]; // wifi status u16 curChannel, reqChannel; u16 curMode, reqMode; u16 authlevel,authctr; vu32 flags9, flags7; u32 reqPacketFlags; u16 curReqFlags, reqReqFlags; u32 counter7,bootcounter7; u16 MacAddr[3]; u16 authtype; u16 iptype,ipflags; u32 ip,snmask,gateway; // current AP data char ssid7[34],ssid9[34]; u16 bssid7[3], bssid9[3]; u8 apmac7[6], apmac9[6]; char wepmode7, wepmode9; char wepkeyid7, wepkeyid9; u8 wepkey7[20],wepkey9[20]; u8 baserates7[16], baserates9[16]; u8 apchannel7, apchannel9; u8 maxrate7; u16 ap_rssi; u16 pspoll_period; // AP data Wifi_AccessPoint aplist[WIFI_MAX_AP]; // probe stuff u8 probe9_numprobe; u8 probe9_ssidlen[WIFI_MAX_PROBE]; char probe9_ssid[WIFI_MAX_PROBE][32]; // WFC data u8 wfc_enable[4]; // wep mode, or 0x80 for "enabled" Wifi_AccessPoint wfc_ap[3]; unsigned long wfc_config[3][5]; // ip, snmask, gateway, primarydns, 2nddns u8 wfc_wepkey[3][16]; // wifi data u32 rxbufIn, rxbufOut; // bufIn/bufOut have 2-byte granularity. u16 rxbufData[WIFI_RXBUFFER_SIZE/2]; // send raw 802.11 data through! rxbuffer is for rx'd data, arm7->arm9 transfer u32 txbufIn, txbufOut; u16 txbufData[WIFI_TXBUFFER_SIZE/2]; // tx buffer is for data to tx, arm9->arm7 transfer // stats data u32 stats[NUM_WIFI_STATS]; u16 debug[30]; u32 random; // semirandom number updated at the convenience of the arm7. use for initial seeds & such. unsigned long dummy2[8]; } Wifi_MainStruct;
この構造体に値をセットしてfifo通信を行うわけではなく、最初の初期化のときに、構造体の設定を行い、その後はfifo割り込みで、呼び出すことはほとんど無く、それぞれ、Wifi_MainStruct構造体をウォッチしていて、Wifi_MainStructにセットされる値によって、それぞれが処理を行っているようです。
ARM9からARM7への通信
初期化の割り込み設定とか、追いかけたのですが、余り意味が無かったです。とりあえず、書いておきます。
ARM7において下記が設定されています。
fifoSetValue32Handler(FIFO_DSWIFI, wifiValue32Handler, 0); fifoSetAddressHandler(FIFO_DSWIFI, wifiAddressHandler, 0);
これより、
- (ARM9側) fifoSendValue32()実行 → (ARM7) wifiValue32Handler()実行
- (ARM9側) fifoSendAddress()実行 → (ARM7) wifiAddressHandler()実行
となることがわかります。
(ARM7) wifiAddressHandler
wifiAddressHandlerは、
static void wifiAddressHandler( void * address, void * userdata ) { irqEnable(IRQ_WIFI); Wifi_Init((u32)address); }
となっており、Wifi_Init()のソースをみると、初期化しているだけのようです。
ARM9側のソースを見てみても、確かに、Wifi_InitDefault()において、fifoSendAddress()が一度、呼ばれているだけでした。
(ARM7) wifiValue32Handler
ARM7側のwifiValue32Handlerは、下記のように、wifi用のirqの開始と停止、そしてWifi_Sync()を呼び出すように作られています。
static void wifiValue32Handler(u32 value, void* data) { switch (value) { case WIFI_DISABLE: irqDisable(IRQ_WIFI); break; case WIFI_ENABLE: irqEnable(IRQ_WIFI); break; case WIFI_SYNC: Wifi_Sync(); break; default: break; } }
Wifi_Sync()は、Wifi_Update()を呼び出すように作られており、
void Wifi_Sync() {
Wifi_Update();
}
Wifi_Update()は、ARM9から送られたメッセージ構造体(Wifi_MainStructとして宣言されたWifiData構造体)によって、いろいろな処理を行うように設定されています。
しかし、この呼び出しも、ARM9の初期化時に一度呼ばれるだけです。
ARM9側でのwifi制御について
dswifiは、ndsのゲームから起動できる「Wi-Fiコネクション設定」を設定すれば、特に自作プログラム上で設定をする必要はありません。
中途半端ですが、実際のプログラムは次回に書こうと思います。いろいろ調べていたら、時間が掛かってしまった・・・・。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム