From af4ce501634ea8ca48cea611bee2607633b365bf Mon Sep 17 00:00:00 2001 From: sato_masaki Date: Tue, 4 Mar 2008 10:42:07 +0000 Subject: [PATCH] =?UTF-8?q?=E7=84=A1=E7=B7=9A=E3=83=95=E3=82=A1=E3=83=BC?= =?UTF-8?q?=E3=83=A0=E3=83=AD=E3=83=BC=E3=83=89=E3=81=AE=E7=B5=90=E6=9E=9C?= =?UTF-8?q?=E3=82=92=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E6=94=B9=E5=AE=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@807 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../Launcher/ARM9/src/loadWlanFirm.c | 155 +++++++++++------- .../Launcher/ARM9/src/loadWlanFirm.h | 23 ++- 2 files changed, 114 insertions(+), 64 deletions(-) diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c index 36c0ed0e..a04b62ff 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -23,6 +23,10 @@ #include #include "loadWlanFirm.h" +/* + definitions + */ + /* LCFGの無線ファームバージョンをタイトルIDとしてそのまま使う場合 */ #define USE_LCFG_STRING 0 /* 無線FWダウンロード処理にかかる時間を計測する。 */ @@ -37,63 +41,62 @@ #define FWBUFFER_SIZE 0x40000 #define SIGNHEAP_SIZE 0x01000 -static u32 nwmBuf[NWM_SYSTEM_BUF_SIZE/sizeof(u32)] ATTRIBUTE_ALIGN(32); -static u8* fwBuffer = 0; +/* + internal variables + */ + +static u32* pNwmBuf; +static u8* pFwBuffer = 0; #if (MEASURE_WIRELESS_INITTIME == 1) static OSTick startTick; #endif static OSMessageQueue mesq; static OSMessage mesAry[1]; -static void nwmCallback(void* arg); -static s32 readFirmwareBinary(u8 *buffer, s32 bufSize); -static BOOL verifyWlanfirmSignature(u8* buffer, u32 length); +/* + internal functions + */ +static void InstallFirmCallback(void* arg); +static s32 ReadFirmwareBinary(u8 *buffer, s32 bufSize); +static BOOL VerifyWlanfirmSignature(u8* buffer, u32 length); + extern NWMRetCode NWMi_InstallFirmware(NWMCallbackFunc callback, void* addr, u32 size, BOOL isColdstart); -static inline u16 SCFG_GetBondingOption(void) -{ - return (u16)(*(u8*)(HW_SYS_CONF_BUF+HWi_WSYS08_OFFSET) & HWi_WSYS08_OP_OPT_MASK); -} -void nwmCallback(void* arg) +void InstallFirmCallback(void* arg) { NWMCallback *cb = (NWMCallback*)arg; - switch (cb->apiid) - { - case NWM_APIID_INSTALL_FIRMWARE: - if (cb->retcode == NWM_RETCODE_SUCCESS) { - OS_TPrintf("Wlan firm:FW download success!\n"); + WLANFirmResult result; + + if (cb->retcode == NWM_RETCODE_SUCCESS) { #if (MEASURE_WIRELESS_INITTIME == 1) - OS_TPrintf("Wlan firm:LoadTime=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - startTick)); + OS_TPrintf("Wlan firm:LoadTime=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - startTick)); #endif - OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n"); - if (fwBuffer) { - SYSM_Free( fwBuffer ); - fwBuffer = 0; - } - OS_SendMessage(&mesq, (OSMessage)1, OS_MESSAGE_BLOCK); - } else { - OS_TPrintf("Wlan firm:FW download Timeout Error!\n"); - if (fwBuffer) { - SYSM_Free( fwBuffer ); - fwBuffer = 0; - } - } - break; - default: - OS_TWarning("Wlan firm:Error(invalid apiid=0x%04X)!\n", cb->apiid); - if (fwBuffer) { - SYSM_Free( fwBuffer ); - fwBuffer = 0; - } - break; + OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n"); + result = WLANFIRM_RESULT_SUCCESS; + } else { // in case of failure + OS_TPrintf("Wlan firm:FW download Timeout Error!\n"); + result = WLANFIRM_RESULT_FAILURE; } + + if (pFwBuffer) { + SYSM_Free( pFwBuffer ); + pFwBuffer = 0; + } + if (pNwmBuf) + { + NWM_End(); + SYSM_Free( pNwmBuf ); + pNwmBuf = 0; + } + /* メッセージキューにFWダウンロードの結果を通知 */ + OS_SendMessage(&mesq, (OSMessage)result, OS_MESSAGE_BLOCK); } -s32 readFirmwareBinary(u8 *buffer, s32 bufSize) +s32 ReadFirmwareBinary(u8 *buffer, s32 bufSize) { char path[256]; FSFile file[1]; @@ -167,7 +170,7 @@ s32 readFirmwareBinary(u8 *buffer, s32 bufSize) return flen; } -BOOL verifyWlanfirmSignature(u8* buffer, u32 length) +BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) { NWMFirmHeader *hdr = (NWMFirmHeader*)buffer; u8 *pPubkey; @@ -218,7 +221,7 @@ BOOL verifyWlanfirmSignature(u8* buffer, u32 length) OS_TPrintf("Wlan Firmware authentication has failed.\n"); /* continue verifying process even though decryption fails in the case of bonding option = 0x01 (support ARM9/ARM7) */ - if (!( HWi_WSYS08_OP_OP0_MASK == SCFG_GetBondingOption() )) + if (!( HWi_WSYS08_OP_OP0_MASK == SCFG_ReadBondingOption() )) { SYSM_Free(signHeap); return FALSE; @@ -239,7 +242,7 @@ BOOL verifyWlanfirmSignature(u8* buffer, u32 length) skip comparing SHA1 digests in the case of bonding option = 0x01 (support ARM9/ARM7) this restriction is for debugging TWL wireless firmware. */ - if (!( HWi_WSYS08_OP_OP0_MASK == SCFG_GetBondingOption() )) + if (!( HWi_WSYS08_OP_OP0_MASK == SCFG_ReadBondingOption() )) { /* verify digest */ if (FALSE == SVC_CompareSHA1( (const void*)txtDigest, (const void*)signDigest )) @@ -260,73 +263,99 @@ BOOL InstallWlanFirmware(void) { NWMRetCode err; - fwBuffer = 0; + pNwmBuf = 0; + pFwBuffer = 0; OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0])); /* HotStart/ColdStartのチェック */ if (TRUE == SYSMi_GetWork()->flags.common.isHotStart) { + pNwmBuf = SYSM_Alloc( NWM_SYSTEM_BUF_SIZE ); + if (!pNwmBuf) { + OS_TWarning("Error: Couldn't allocate memory for NWM.\n"); + goto instfirm_error; + } // HotStart - NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ - err = NWMi_InstallFirmware(nwmCallback, NULL, 0, FALSE); + NWM_Init(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */ + err = NWMi_InstallFirmware(InstallFirmCallback, NULL, 0, FALSE); } else { s32 flen = 0; // ColdStart - /* fwBuffer should be allocated from heap. */ - fwBuffer = SYSM_Alloc( FWBUFFER_SIZE ); - if (!fwBuffer) { + /* pFwBuffer should be allocated from heap. */ + pFwBuffer = SYSM_Alloc( FWBUFFER_SIZE ); + if (!pFwBuffer) { OS_TWarning("Error: Couldn't allocate memory for WlanFirmware.\n"); - return FALSE; + goto instfirm_error; } - flen = readFirmwareBinary(fwBuffer, FWBUFFER_SIZE); + flen = ReadFirmwareBinary(pFwBuffer, FWBUFFER_SIZE); - if ( 0 > flen ) + if ( 0 >= flen ) { OS_TPrintf("Error: Couldn't read wlan firmware.\n"); - SYSM_Free( fwBuffer ); - return FALSE; + goto instfirm_error; } /* check signature data */ - if (FALSE == verifyWlanfirmSignature(fwBuffer, (u32)flen)) + if (FALSE == VerifyWlanfirmSignature(pFwBuffer, (u32)flen)) { OS_TPrintf("Error: This Wlan Firmware is quite illegal!\n"); OS_TPrintf(" It has never been installed.\n"); - SYSM_Free( fwBuffer ); - return FALSE; + goto instfirm_error; } /*************************************************************/ - NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ + pNwmBuf = SYSM_Alloc( NWM_SYSTEM_BUF_SIZE ); + if (!pNwmBuf) { + OS_TWarning("Error: Couldn't allocate memory for NWM.\n"); + goto instfirm_error; + } + NWM_Init(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */ #if (MEASURE_WIRELESS_INITTIME == 1) startTick = OS_GetTick(); #endif - if ( 0 < flen ) - { - err = NWMi_InstallFirmware(nwmCallback, fwBuffer, (u32)flen, TRUE); - } + err = NWMi_InstallFirmware(InstallFirmCallback, pFwBuffer, (u32)flen, TRUE); } /* - [TODO:] 無線ロード処理の完了をメインルーチンへ通知するための仕組みを考える必要あり。 + 無線ロード処理の完了は、IsWlanFirmwareInstalledでチェックする。 */ return TRUE; + + /* エラー処理 */ +instfirm_error: + if (pFwBuffer) + { + SYSM_Free( pFwBuffer ); + pFwBuffer = 0; + } + if (pNwmBuf) + { + NWM_End(); + SYSM_Free( pNwmBuf ); + pNwmBuf = 0; + } + return FALSE; } -BOOL IsWlanFirmwareInstalled(void) +BOOL IsWlanFirmwareInstalled(WLANFirmResult *pResult) { OSMessage msg; + BOOL retval; - return OS_ReadMessage(&mesq, &msg, OS_MESSAGE_NOBLOCK); + retval = OS_ReadMessage(&mesq, &msg, OS_MESSAGE_NOBLOCK); + + *pResult = (WLANFirmResult)msg; + + return retval; } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h index dd15597b..8c7c1c5b 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h @@ -24,8 +24,29 @@ extern "C" { #endif +typedef enum { + WLANFIRM_RESULT_SUCCESS = 1, + WLANFIRM_RESULT_FAILURE = 2 +} WLANFirmResult; + +/* + InstallWlanFirmware + + 引数 :なし + 返り値:TRUE … 無線ファームウェアインストールの非同期処理中 +     FALSE … 無線ファームウェアインストールに失敗した + */ + BOOL InstallWlanFirmware(void); -BOOL IsWlanFirmwareInstalled(void); + +/* + IsWlanFirmwareInstalled + + 引数 :result 無線ファームウェアインストール結果コード(WLANFirmResult) + 返り値:無線ファームウェアインストールの結果が存在 + */ + +BOOL IsWlanFirmwareInstalled(WLANFirmResult *pResult); #ifdef __cplusplus }