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

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

DevkitProで使われているdswifiについて(1)

DevkitProに使われているdswifiについて、私も余り詳しくは無いですが通信のソースを読んで、何をしているのか調べてみたいと思います。
今日は、紀伊半島から新幹線で東京出張日帰りというヘビーな1日だったので、何やかんやしていたら、こんな時間になってしまいました。久しぶりの東京は暖かかったのでびっくりです。

ARM9とARM7の通信部

dswifiのプロセッサー間通信は、fifoチャネル"FIFO_DSWIFI"を使うことにより行っています。そこで、dswifiのソースから、このFIFO_DSWIFIを使っているところを検索してみます。
結果は以下の6ヶ所でした。(ソースはdswifi-src-0.3.11使用)

 ソースwifi_wrm9.cより、3ヶ所。

// notification function to send fifo message to arm7
//---------------------------------------------------------------------------------
void arm9_synctoarm7() { 
//---------------------------------------------------------------------------------
  fifoSendValue32(FIFO_DSWIFI, WIFI_SYNC);
}

//---------------------------------------------------------------------------------
bool Wifi_InitDefault(bool useFirmwareSettings) {
//---------------------------------------------------------------------------------
  fifoSetValue32Handler(FIFO_DSWIFI,  wifiValue32Handler, 0);
  u32 wifi_pass = Wifi_Init(WIFIINIT_OPTION_USELED);
  if(!wifi_pass) return false;

  irqSet(IRQ_TIMER3, Timer_50ms); // setup timer IRQ
  irqEnable(IRQ_TIMER3);

  Wifi_SetSyncHandler(arm9_synctoarm7); // tell wifi lib to use our handler to notify arm7

  // set timer3
  TIMER3_DATA = -6553; // 6553.1 * 256 cycles = ~50ms;
  TIMER3_CR = 0x00C2; // enable, irq, 1/256 clock

  fifoSendAddress(FIFO_DSWIFI, (void *)wifi_pass);

  while(Wifi_CheckInit()==0) {
    swiWaitForVBlank();
  }
  if(useFirmwareSettings) {  
    int wifiStatus = ASSOCSTATUS_DISCONNECTED;
    Wifi_AutoConnect(); // request connect
    while(wifiStatus != ASSOCSTATUS_ASSOCIATED) {
      wifiStatus = Wifi_AssocStatus(); // check status
      if(wifiStatus == ASSOCSTATUS_CANNOTCONNECT) return false;
      swiWaitForVBlank();
    }  
  }
  return true;
}

void arm9_synctoarm7() の fifoSendValue32(FIFO_DSWIFI, WIFI_SYNC);と、
bool Wifi_InitDefault(bool useFirmwareSettings) の1行目の
fifoSetValue32Handler(FIFO_DSWIFI, wifiValue32Handler, 0);と、14行目のfifoSendAddress(FIFO_DSWIFI, (void *)wifi_pass);

 ソースwifi_wrm7.cより、3ヶ所。

// callback to allow wifi library to notify arm9
static void arm7_synctoarm9() { 
  fifoSendValue32(FIFO_DSWIFI, WIFI_SYNC);
}

void installWifiFIFO() {
  irqSet(IRQ_WIFI, Wifi_Interrupt); // set up wifi interrupt
  Wifi_SetSyncHandler(arm7_synctoarm9); // allow wifi lib to notify arm9
  fifoSetValue32Handler(FIFO_DSWIFI, wifiValue32Handler, 0);
  fifoSetAddressHandler(FIFO_DSWIFI, wifiAddressHandler, 0);
}

static void arm7_synctoarm9() の fifoSendValue32(FIFO_DSWIFI, WIFI_SYNC);と、
void installWifiFIFO() の
fifoSetValue32Handler(FIFO_DSWIFI, wifiValue32Handler, 0);と、fifoSetAddressHandler(FIFO_DSWIFI, wifiAddressHandler, 0);

ARM7のvoid installWifiFIFO()は、お決まりの2行ですね。

とりあえず、今日はこの辺で・・・。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム