diff --git a/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher b/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher index 36a1e93f..4cd53508 100644 --- a/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher +++ b/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher @@ -20,7 +20,7 @@ ifneq ($(UPDATER_RELEASE),TRUE) # COMPILE SWITCH ※最終ROM作成時は、全てFALSEにセットする。SUBDIRのビルド時にも影響するようexportで環境変数設定する。 export DO_NOT_SHOW_LAUNCHER = FALSE -export DISABLE_WDS_SCAN = TRUE +export DISABLE_WDS_SCAN = FALSE export DISABLE_WLFIRM_LOAD = FALSE export DISABLE_INITIAL_SETTINGS = TRUE export IGNORE_WLFIRM_SIGNCHECK = FALSE diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c index fe1d9e32..e37ebe69 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -61,6 +61,7 @@ */ static BOOL s_isHotStartWLFirm; static volatile BOOL s_isFinished; +static volatile WLANFirmResult s_result = WLANFIRM_RESULT_UNFINISHED; static u32* pNwmBuf; static u8* pFwBuffer = 0; #if (MEASURE_WIRELESS_INITTIME == 1) @@ -84,6 +85,7 @@ static BOOL CheckHash(const u8* hash, const u8* buffer, u32 length); #if (REPORT_HASH_COMPARISON == 1) static void PrintDigest(u8 *digest); #endif +static BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult); void InstallFirmCallback(void* arg) @@ -633,8 +635,7 @@ instfirm_error: return FALSE; } -BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult); -BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) +static BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) { OSMessage msg; BOOL retval; @@ -647,24 +648,15 @@ BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) } // 無線ファームロード完了? -BOOL PollingInstallWlanFirmware( BOOL isStartScanWDS ) +BOOL PollingInstallWlanFirmware( void ) { -#ifndef ENABLE_WDS_SCAN -#pragma unused(isStartScanWDS) -#endif if ( !s_isFinished ) { WLANFirmResult result; if( GetWlanFirmwareInstallResult( &result ) ) { if( result == WLANFIRM_RESULT_SUCCESS ) { OS_TPrintf( "WLFIRM load finished.\n" ); -#ifndef DISABLE_WDS_SCAN - // WDSスキャンがTRUE かつ 無線フラグがONならば、引き続きWDSビーコン受信開始 - if( isStartScanWDS && - !LCFG_THW_IsForceDisableWireless() && LCFG_TSD_IsAvailableWireless() ) { - StartScanWDS(); - } -#endif // DISABLE_WDS_SCAN s_isFinished = TRUE; // 正常終了 + s_result = result; }else { // ロード失敗 if( !s_isHotStartWLFirm ) { @@ -673,7 +665,8 @@ BOOL PollingInstallWlanFirmware( BOOL isStartScanWDS ) #ifdef SDK_RELEASE PMi_SetWirelessLED( PM_WIRELESS_LED_OFF ); #endif - s_isFinished = TRUE; // 異常終了 + s_isFinished = TRUE; + s_result = result; }else { // そうでない場合は、ColdStartロードで再度実行。 (void)InstallWlanFirmware( FALSE ); @@ -687,3 +680,7 @@ BOOL PollingInstallWlanFirmware( BOOL isStartScanWDS ) } +WLANFirmResult GetWlanFirmwareInstallFinalResult( void ) +{ + return s_result; +} diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h index 7beff702..644d8765 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h @@ -25,6 +25,7 @@ extern "C" { #endif typedef enum { + WLANFIRM_RESULT_UNFINISHED = 0, WLANFIRM_RESULT_SUCCESS = 1, WLANFIRM_RESULT_FAILURE = 2 } WLANFirmResult; @@ -50,7 +51,19 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm ); FALSE … 無線ファームウェアインストール処理が未完了 */ -BOOL PollingInstallWlanFirmware( BOOL isStartScanWDS ); +BOOL PollingInstallWlanFirmware( void ); + + +/* + + GetWlanFirmwareInstallFinalResult + + 引数 :なし + 返り値:WLANFIRM_RESULT_UNFINISHED … 無線ファームウェアインストール処理が未完了 + WLANFIRM_RESULT_SUCCESS … 無線ファームウェアインストール処理が成功 + WLANFIRM_RESULT_FAILURE … 無線ファームウェアインストール処理が失敗 + */ +WLANFirmResult GetWlanFirmwareInstallFinalResult( void ); #ifdef __cplusplus diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index d2c90856..81451c5f 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -26,10 +26,13 @@ #include "loadWlanFirm.h" #include "loadSharedFont.h" #include "loadSysmVersion.h" +#include "scanWDS.h" // extern data----------------------------------------------------------------- // define data----------------------------------------------------------------- +#define WDS_THREAD_PRIO 15 +#define WDS_DMA_NO 3 #define INIT_DEVICES_LIKE_UIG_LAUNCHER @@ -154,7 +157,8 @@ void TwlMain( void ) TitleProperty *pBootTitle = NULL; OSTick allstart, start, end = 0; BOOL direct_boot = FALSE; - + BOOL isStartScanWDS = FALSE; + #ifdef DEBUG_LAUNCHER_DUMP // you should comment out to clear GX/G2/DMA/TM/PAD register in reboot.c to retreive valid boot time STD_TSPrintf((char*)0x02FFCFC0, "\nLauncher Boot Time: %lld usec\n", OS_TicksToMicroSeconds(reg_OS_TM3CNT_L * (1024/64))); @@ -462,8 +466,9 @@ MAIN_LOOP_START: state = LOGODEMO; break; case LOGODEMO: - if( LogoMain() && - IsFinishedLoadSharedFont() ) { // フォントロード終了をここでチェック + if( IsFinishedLoadSharedFont() && // 通常ブート時は、フォントロード終了をここでチェック + LogoMain() + ) { if( !direct_boot ) { state = LAUNCHER_INIT; }else { @@ -482,10 +487,16 @@ MAIN_LOOP_START: } break; case LOAD_START: - if( IsFinishedLoadSharedFont() ) { // ダイレクトブートの時があるので、フォントロード終了をここでチェック + if( IsFinishedLoadSharedFont() // ダイレクトブートの時は、フォントロード終了をここでチェック +#ifndef DISABLE_WLFIRM_LOAD // アプリブート前に無線ファームのロードは完了しておく + && PollingInstallWlanFirmware() +#endif // DISABLE_WLFIRM_LOAD +#ifndef DISABLE_WDS_SCAN // アプリブート前にWDSスキャンは終了しておく必要がある + && ( WDS_WrapperStopScan() != WDSWRAPPER_ERRCODE_OPERATING ) +#endif // DISABLE_WLFIRM_LOAD + ) { SYSM_StartLoadTitle( pBootTitle ); state = LOADING; - start = OS_GetTick(); } break; @@ -520,11 +531,8 @@ MAIN_LOOP_START: break; case AUTHENTICATE: if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && -#ifndef DISABLE_WLFIRM_LOAD - PollingInstallWlanFirmware( FALSE ) && // アプリブート前に無線ファームのロードは完了しておく必要がある -#endif // DISABLE_WLFIRM_LOAD - SYSM_IsAuthenticateTitleFinished() ) - { + SYSM_IsAuthenticateTitleFinished() + ) { // メインループ開始から検証終了までの間に起きたFATALの処理 if( UTL_IsFatalError() ) { // FATALエラー処理 @@ -533,7 +541,25 @@ MAIN_LOOP_START: state = STOP; break; // state を STOP にして break し、 Boot させない } - + +#ifndef DISABLE_WDS_SCAN + // Nintendoスポットブート時は、アプリ間パラメータにビーコン情報をセットする。 + if( STD_CompareNString( (char *)&pBootTitle->titleID + 1, "JNH", 3 ) == 0 ) + { + (void)WDS_WrapperSetArgumentParam(); + } +#endif // DISABLE_WDS_SCAN + + state = BOOT; + } + break; + case BOOT: +#ifndef DISABLE_WDS_SCAN + // アプリブート前にWDSスキャンは終了しておく必要がある + if( ( WDS_WrapperCleanup() != WDSWRAPPER_ERRCODE_OPERATING ) && + IsClearnupWDSWrapper() ) +#endif // DISABLE_WDS_SCAN + { SYSM_TryToBootTitle( pBootTitle ); // never return. } break; @@ -545,7 +571,27 @@ MAIN_LOOP_START: (void)SYSM_GetCardTitleList( s_titleList ); // 無線ファームロードのポーリング - (void)PollingInstallWlanFirmware( pBootTitle ? FALSE : TRUE ); + if( PollingInstallWlanFirmware() && + ( GetWlanFirmwareInstallFinalResult() == WLANFIRM_RESULT_SUCCESS ) // ロード成功 + ) { + // 下記条件を満たすなら、WDSスキャン開始 +#ifndef DISABLE_WDS_SCAN + if( !isStartScanWDS && // WDSスキャン開始済みでない + !direct_boot && // ダイレクトブートでない + !LCFG_THW_IsForceDisableWireless() && // 無線強制OFFでない + LCFG_TSD_IsAvailableWireless() // 無線ON + ) { + WDSWrapperInitializeParam param; + param.threadprio = WDS_THREAD_PRIO; + param.dmano = WDS_DMA_NO; + param.callback = Callback_WDSWrapper; + param.alloc = SYSM_Alloc; + param.free = SYSM_Free; + (void)WDS_WrapperInitialize( param ); // 初期化と動作開始を兼ねている。(失敗しても止まりはしないので、気にしない) + isStartScanWDS = TRUE; + } +#endif // DISABLE_WDS_SCAN + } // コマンドフラッシュ (void)SND_FlushCommand(SND_COMMAND_NOBLOCK); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c index 44375cdd..ec4dc338 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c @@ -15,246 +15,60 @@ $Author$ *---------------------------------------------------------------------------*/ -#include -#include -#include #include "scanWDS.h" -#define WDS_THREAD_PRIO 10 -#define WDS_STACK_SIZE 1024 -#define WDS_MESG_DEPTH 1 -static OSThread s_thread; -u64 s_stack[ WDS_STACK_SIZE / sizeof(u64) ]; -OSMessage s_msgBuffer[ WDS_MESG_DEPTH ]; -OSMessageQueue s_msgQueue; +char *callbackstring[] = { + "WDSWRAPPER_CALLBACK_INITIALIZE", + "WDSWRAPPER_CALLBACK_CLEANUP", + "WDSWRAPPER_CALLBACK_STARTSCAN", + "WDSWRAPPER_CALLBACK_STARTSCAN2", + "WDSWRAPPER_CALLBACK_STOPSCAN", +}; -// WDSスキャンスレッド -static void ScanWDSThread( void *arg ); -// アクセスポイント情報のデバッグ表示用関数 -static void DumpWDSApInfo( WDSApInfo *apinfo ); +static BOOL s_isStarted = FALSE; +static BOOL s_isClearnup = FALSE; -// WDS非同期関数のコールバック関数たち -// コールバック関数内ではアプリケーションのステート変数s_appstateを変更する -void WDS_Initialize_CB(void *arg); -void WDS_StartScan_CB(void *arg); -void WDS_EndScan_CB(void *arg); -void WDS_End_CB(void *arg); - -// アプリケーションを制御するステートの列挙型 -typedef enum AppState { - APP_STATE_WDSINIT, - APP_STATE_WDSWAITINIT, - APP_STATE_WDSSCAN, - APP_STATE_WDSWAITSCAN, - APP_STATE_WDSCOMPLETESCAN, - APP_STATE_WDSENDSCAN, - APP_STATE_WDSWAITENDSCAN, - APP_STATE_WDSCOMPLETEENDSCAN, - APP_STATE_WDSWAITEND, - APP_STATE_WDSCOMPLETEEND -} AppState; - - -// 受け取ったビーコン情報を格納する変数(この配列をランチャー経由でホットスポットチャンネルに渡す) -static WDSBriefApInfo briefapinfo[WDS_APINFO_MAX]; - - - -// WDSスキャンスレッドの起動 -void StartScanWDS( void ) +// WDSWrapper終了? +BOOL IsClearnupWDSWrapper( void ) { - u8 *wdsSysBuf; - - // WDSライブラリが使用するバッファを確保(32バイトアラインメントしている必要がある) - wdsSysBuf = SYSM_Alloc( WDS_GetWorkAreaSize() ); - if( wdsSysBuf == NULL) - { - OS_Panic("OS_Alloc Failed"); + if( s_isStarted ) { + return s_isClearnup; + }else { + return TRUE; } - // WDSスレッドの起動 - OS_InitMessageQueue( &s_msgQueue, &s_msgBuffer[0], WDS_MESG_DEPTH ); - OS_CreateThread( &s_thread, ScanWDSThread, (void *)wdsSysBuf, s_stack + WDS_STACK_SIZE / sizeof(u64), WDS_STACK_SIZE, WDS_THREAD_PRIO ); - OS_WakeupThreadDirect( &s_thread ); - - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSINIT, OS_MESSAGE_BLOCK ); } -// WDSスキャンスレッド -static void ScanWDSThread( void *arg ) +// WDSWrapper用コールバック関数 +void Callback_WDSWrapper( void *ptr ) { -#pragma unused(arg) - OSTick wdsScanBeginTick = 0; - u8 *wdsSysBuf = arg; + WDSWrapperCallbackParam *callback = (WDSWrapperCallbackParam *)ptr; + OS_TPrintf("Callback_WDSWrapper: %s %d ", callbackstring[callback->callback], callback->errcode ); - // メインループ - while( 1 ) { - OSTick now; - int i; - // アプリケーションを制御するステート変数 - AppState appstate; - - (void)OS_ReceiveMessage( &s_msgQueue, (OSMessage)&appstate, OS_MESSAGE_BLOCK ); - - switch( appstate ) - { - case APP_STATE_WDSINIT: - // イニシャルステート - - // WDSライブラリの初期化関数を呼び出し、その非同期処理の完了を待つ - OS_Printf("*** WDS_Initialize\n"); - if( WDS_Initialize( wdsSysBuf, WDS_Initialize_CB, 0 ) == 0 ) - { - OS_Printf("WDS_Initialize successed\n"); - } - else { - OS_Panic("WDS_Initialize failed"); - } - break; - OS_Printf("*** WDS_Initialize waiting asyncronous process\n"); - case APP_STATE_WDSWAITINIT: - case APP_STATE_WDSWAITSCAN: - case APP_STATE_WDSWAITENDSCAN: - case APP_STATE_WDSWAITEND: - // 非同期処理の完了を待つステート群 - - // コールバック関数が呼び出され、ステートが変更されるのを待てばよい - break; - case APP_STATE_WDSSCAN: - // 初期化が完了した直後か、ビーコンスキャン完了時に引き続きスキャンを行う場合に入ってくるステート - - //OS_Printf("*** WDS_StartScan\n"); - // ビーコンスキャン非同期処理を開始する - if( WDS_StartScan( WDS_StartScan_CB ) == 0 ) - { - if( wdsScanBeginTick == 0 ) - wdsScanBeginTick = OS_GetTick(); - } - else { - OS_Panic("WDS_StartScan failed"); - } - break; - case APP_STATE_WDSCOMPLETESCAN: - // スキャン完了後に入ってくるステート - - // 一回のスキャンではビーコンを取れないことが多いので、2秒間ビーコン受信を繰り返す - now = OS_GetTick(); - if( OS_TicksToMilliSeconds(now - wdsScanBeginTick) < 2000 ) - { - // 再スキャンのためにスキャン開始ステートに移行 - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSSCAN, OS_MESSAGE_NOBLOCK ); - } - else { - // スキャン終了ステートに移行 - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSENDSCAN, OS_MESSAGE_NOBLOCK ); - } - break; - case APP_STATE_WDSENDSCAN: - // スキャンを終了させる際に入ってくるステート - OS_Printf("*** WDS_EndScan\n"); - - // スキャンを終了させる非同期処理を開始する - if( WDS_EndScan( WDS_EndScan_CB ) == 0 ) - { - OS_Printf("WDS_EndScan successed\n"); - } - else { - OS_Panic("WDS_EndScan failed"); - } - break; - case APP_STATE_WDSCOMPLETEENDSCAN: - // スキャン終了非同期処理が終わった際に入って来るステート - OS_Printf("*** WDS_GetApInfoAll\n"); - if( WDS_GetApInfoAll( briefapinfo ) != 0 ) - { - OS_Panic("WDS_GetApInfoAll failed\n"); - } - for( i = 0 ; i < WDS_APINFO_MAX ; i++ ) - { - if( briefapinfo[i].isvalid == TRUE ) - { - OS_TPrintf("rssi: %d\n", briefapinfo[i].rssi); - DumpWDSApInfo( &briefapinfo[i].apinfo ); - *(u16 *)0x0500003c = 0x03ff; - } - } - - // WDSライブラリを終了し、無線ハードの電源を落とす非同期処理を開始する - OS_Printf("*** WDS_End\n"); - if( WDS_End( WDS_End_CB ) == 0 ) - { - OS_Printf("WDS_End successed\n"); - } - else { - OS_Panic("WDS_End failed"); - } - break; - case APP_STATE_WDSCOMPLETEEND: - // WDSライブラリの解放処理が完了した際に入って来るステート - SYSM_Free( wdsSysBuf ); - OS_TPrintf("WDS test successfully completed\n"); - return; + switch( callback->callback ) { + case WDSWRAPPER_CALLBACK_INITIALIZE: + s_isStarted = TRUE; + break; + case WDSWRAPPER_CALLBACK_STARTSCAN2: + // n秒間隔のビーコン間欠スキャン一回分が完了 + // ビーコンを受け取っていないという結果が出た場合、強調表示を消します + if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_FAILURE ) + OS_TPrintf( "強調表示を消します" ); + else { + OS_TPrintf( "強調表示をつけます" ); } + break; + case WDSWRAPPER_CALLBACK_STARTSCAN: + // n秒間隔のビーコン間欠スキャン一回分が完了 + // ビーコンを受け取っている場合のみ強調表示を付けます + if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_SUCCESS ) + OS_TPrintf( "強調表示をつけます" ); + break; + case WDSWRAPPER_CALLBACK_CLEANUP: + s_isClearnup = TRUE; + break; } -} - -// アクセスポイント情報のデバッグ表示用関数 -static void DumpWDSApInfo( WDSApInfo *apinfo ) -{ - int i; - char buf[256]; - OS_TPrintf( "================================\n" ); - // SSID - MI_CpuCopy8( apinfo->ssid, buf, WDS_SSID_BUF_SIZE) ; - buf[WDS_SSID_BUF_SIZE] = 0x00; - OS_TPrintf( "SSID: %s\n", buf ); - - // APNUM - MI_CpuCopy8( apinfo->apnum, buf, WDS_APNUM_BUF_SIZE) ; - buf[WDS_APNUM_BUF_SIZE] = 0x00; - OS_TPrintf( "APNUM: %s\n", buf ); - - // CHANNEL - OS_TPrintf( "channel: %d\n", apinfo->channel ); - - // ENCRYPTFLAG - OS_TPrintf( "encryptmethod: %d\n", apinfo->encryptflag); - - // WEPKEY - OS_TPrintf( "WEPKEY: " ); - for( i = 0 ; i < WDS_WEPKEY_BUF_SIZE ; i++ ) - { - OS_TPrintf( "%02x", apinfo->wepkey[i] ); - } OS_TPrintf( "\n" ); - OS_TPrintf( "================================\n" ); } -static void WDS_Initialize_CB(void *arg) -{ -#pragma unused(arg) - OS_TPrintf("WDS_Initialize_CB\n"); - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSSCAN, OS_MESSAGE_NOBLOCK ); -} - -static void WDS_StartScan_CB(void *arg) -{ -#pragma unused(arg) -// OS_TPrintf("WDS_StartScan_CB\n"); - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSCOMPLETESCAN, OS_MESSAGE_NOBLOCK ); -} - -static void WDS_EndScan_CB(void *arg) -{ -#pragma unused(arg) - OS_TPrintf("WDS_EndScan_CB\n"); - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSCOMPLETEENDSCAN, OS_MESSAGE_NOBLOCK ); -} - -static void WDS_End_CB(void *arg) -{ -#pragma unused(arg) - OS_TPrintf("WDS_End_CB\n"); - (void)OS_SendMessage(&s_msgQueue, (OSMessage)APP_STATE_WDSCOMPLETEEND, OS_MESSAGE_NOBLOCK ); -} diff --git a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.h b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.h index 5e7f888a..1e6f9b1a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.h @@ -30,8 +30,8 @@ extern "C" { // global variables-------------------------------------------------- // function---------------------------------------------------------- -extern void StartScanWDS( void ); - +extern BOOL IsClearnupWDSWrapper( void ); +extern void Callback_WDSWrapper( void *ptr ); #ifdef __cplusplus } diff --git a/build/systemMenu_tools/SystemUpdater/Makefile b/build/systemMenu_tools/SystemUpdater/Makefile index e37afd70..a7b569c4 100644 --- a/build/systemMenu_tools/SystemUpdater/Makefile +++ b/build/systemMenu_tools/SystemUpdater/Makefile @@ -45,7 +45,7 @@ SUBDIRS = $(LAUNCHER_DIR) \ export UPDATER_RELEASE = TRUE export DO_NOT_SHOW_LAUNCHER = TRUE -export DISABLE_WDS_SCAN = TRUE +export DISABLE_WDS_SCAN = FALSE export IGNORE_WLFIRM_SIGNCHECK = FALSE export DISABLE_WLFIRM_LOAD = FALSE export DISABLE_INITIAL_SETTINGS = TRUE diff --git a/include/sysmenu.h b/include/sysmenu.h index c24c32a6..98e1006f 100644 --- a/include/sysmenu.h +++ b/include/sysmenu.h @@ -35,6 +35,7 @@ #include #include #include +#include /* SYSMENU_H_ */ #endif