WDS処理をWDSWrapperを使用する形に変更。

ランチャーでのWDSスキャンをデフォルト有効にするよう変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1754 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-07-01 09:35:36 +00:00
parent b21602e2c7
commit fae5f942cf
8 changed files with 128 additions and 257 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -15,246 +15,60 @@
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu/WDS.h>
#include <sysmenu.h>
#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 );
}

View File

@ -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
}

View File

@ -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

View File

@ -35,6 +35,7 @@
#include <sysmenu/sharedFont.h>
#include <sysmenu/banner.h>
#include <sysmenu/util.h>
#include <sysmenu/WDSWrapper.h>
/* SYSMENU_H_ */
#endif