コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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系のプログラム