diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index 45a93088..c22ab19f 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -47,7 +47,7 @@ MISC_DIR = ../../misc BG_DIR = ../../data SRCS_LOGO = logoDemo.c logoData.c -SRCS = main.c launcher.c sound.c bannerCounter.c \ +SRCS = main.c launcher.c sound.c bannerCounter.c loadWlanFirm.c \ $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO)) \ $(MISC_DIR)/src/misc.c $(MISC_DIR)/src/cmn.c \ $(BG_DIR)/BGData_Launcher.c diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c new file mode 100644 index 00000000..fd99ec9b --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------* + Project: TWL_RED_IPL - + File: loadWlanFirm.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: + $Rev: + $Author: + *---------------------------------------------------------------------------*/ +#include +#include +#include +#include "loadWlanFirm.h" + + +static int isNwmActive; +static u32 nwmBuf[NWM_SYSTEM_BUF_SIZE/sizeof(u32)] ATTRIBUTE_ALIGN(32); +static u32 fwBuffer[256*1024/sizeof(u32)] ATTRIBUTE_ALIGN(32); + + + +static void nwmcallback(void* arg) +{ + NWMCallback *cb = (NWMCallback*)arg; + switch (cb->apiid) + { + case NWM_APIID_LOAD_DEVICE: + if (cb->retcode == NWM_RETCODE_SUCCESS) { + isNwmActive = 1; + /* osSendMessage */ + OS_TPrintf("Wlan firm:Load Device success!\n"); + } else { + OS_TPrintf("Wlan firm:Load Device Timeout Error!\n"); + } + break; + case NWM_APIID_UNLOAD_DEVICE: + OS_TPrintf("Wlan firm:Unload Device success!\n"); + break; + defalut: + OS_TPrintf("Wlan firm:Error(apiid=default)!\n"); + break; + } + +} + + +BOOL WirelessFirmwareDownloadStart(void) +{ + char path[256]; + FSFile file[1]; + + char *title = "WFW0"; + + u32 titleID_hi; + u32 titleID_lo; + + u64 titleID = 0; + s32 flen = 0; + NWMRetCode err; + + titleID_hi = (( 3 /* Nintendo */ << 16) | 4 /* */ | 1 /* */); + + titleID_lo = ((u32)( *title++ ) & 0xff) << 24; + titleID_lo |= ((u32)( *title++ )& 0xff) << 16; + titleID_lo |= ((u32)( *title++ )& 0xff) << 8; + titleID_lo |= (u32)( *title++ ) & 0xff; + + titleID = ((u64)(titleID_hi) << 32) | (u64)titleID_lo; + + // OS_TPrintf( "titleID = 0x%08x%08x\n", titleID_hi, titleID_lo); + + isNwmActive = 0; + + if( NAM_OK == NAM_GetTitleBootContentPathFast(path, titleID) ) { + OS_TPrintf( "File = %s\n", path); + } + else { + OS_TPrintf( "Error: NAM_GetTitleBootContentPathFast titleID = 0x%08x0x%08x\n",titleID_hi, titleID_lo); + return FALSE; + } + + if (!FS_OpenFileEx(file, path, FS_FILEMODE_R)) { + OS_TWarning("FS_OpenFileEx(%s) failed.\n", path); + return FALSE; + } + + if( FALSE == FS_SeekFile(file, sizeof(ROM_Header), FS_SEEK_SET) ) { + OS_TWarning("FS_SeekFile failed.\n"); + return FALSE; + } + + flen = FS_ReadFile(file, fwBuffer, sizeof(fwBuffer)); + if( flen == -1 ) { + OS_TWarning("FS_ReadFile failed.\n"); + return FALSE; + } + + (void)FS_CloseFile(file); + + + /*************************************************************/ + + NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ + + (void)NWMi_InstallFirmware(fwBuffer, (u32)flen); + + err = NWM_LoadDevice(nwmcallback); + + /* osRecvMessage */ + + return TRUE; +} diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h new file mode 100644 index 00000000..128aee8d --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h @@ -0,0 +1,2 @@ + +BOOL WirelessFirmwareDownloadStart(void); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 5a030ebf..e1ac4ef3 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -24,6 +24,11 @@ // extern data----------------------------------------------------------------- // define data----------------------------------------------------------------- +#define WIRELESS_FIRM_LOADING 1 + +#if( WIRELESS_FIRM_LOADING == 1 ) +#include "loadWlanFirm.h" +#endif // function's prototype------------------------------------------------------- static void INTR_VBlank( void ); @@ -117,6 +122,8 @@ void TwlMain( void ) // システムの初期化---------------- InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に // Alloc, Freeで登録したメモリアロケータを初期化してください。 + + // 各種パラメータの取得------------ pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータ、 // 初回起動シーケンス判定、 @@ -177,6 +184,15 @@ void TwlMain( void ) THREAD_STACK_SIZE, STREAM_THREAD_PRIO); OS_WakeupThreadDirect(&strmThread); + + // 無線ファームウェアを無線モジュールにダウンロードする。 +#if( WIRELESS_FIRM_LOADING == 1 ) + if( FALSE == WirelessFirmwareDownloadStart() ) { + OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); + } +#endif + + // メインループ-------------------- while( 1 ) { OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち