From 0c81e7e98181906237bfd1903fd639e8b3d5ee27 Mon Sep 17 00:00:00 2001 From: sato_masaki Date: Mon, 3 Mar 2008 12:46:49 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBNWMi=5FInstallFirmware()=E3=81=AE?= =?UTF-8?q?=E5=BC=95=E6=95=B0=E5=A4=89=E6=9B=B4=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=80=82=20=E3=83=BB=E7=84=A1=E7=B7=9AFirmware=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E7=B5=82=E4=BA=86?= =?UTF-8?q?=E3=82=92=E3=83=A1=E3=82=A4=E3=83=B3=E3=83=AB=E3=83=BC=E3=83=97?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=99?= =?UTF-8?q?=E3=82=8B=E9=96=A2=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0=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@788 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../Launcher/ARM9/src/loadWlanFirm.c | 111 +++++++++++------- .../Launcher/ARM9/src/loadWlanFirm.h | 3 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 7 +- 3 files changed, 73 insertions(+), 48 deletions(-) diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c index fa39c8d5..36c0ed0e 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -37,17 +37,19 @@ #define FWBUFFER_SIZE 0x40000 #define SIGNHEAP_SIZE 0x01000 -static u32 nwmBuf[NWM_SYSTEM_BUF_SIZE/sizeof(u32)] ATTRIBUTE_ALIGN(32); -static u8* fwBuffer = 0; +static u32 nwmBuf[NWM_SYSTEM_BUF_SIZE/sizeof(u32)] ATTRIBUTE_ALIGN(32); +static u8* fwBuffer = 0; #if (MEASURE_WIRELESS_INITTIME == 1) -static OSTick startTick; +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); -extern NWMRetCode NWMi_InstallFirmware(NWMCallbackFunc callback, void* addr, u32 size); +extern NWMRetCode NWMi_InstallFirmware(NWMCallbackFunc callback, void* addr, u32 size, BOOL isColdstart); static inline u16 SCFG_GetBondingOption(void) { @@ -67,16 +69,25 @@ void nwmCallback(void* arg) OS_TPrintf("Wlan firm:LoadTime=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - startTick)); #endif OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n"); - SYSM_Free( fwBuffer ); - /* [TODO:] osSendMessage */ + 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"); - SYSM_Free( fwBuffer ); + if (fwBuffer) { + SYSM_Free( fwBuffer ); + fwBuffer = 0; + } } break; default: OS_TWarning("Wlan firm:Error(invalid apiid=0x%04X)!\n", cb->apiid); - SYSM_Free( fwBuffer ); + if (fwBuffer) { + SYSM_Free( fwBuffer ); + fwBuffer = 0; + } break; } @@ -245,57 +256,66 @@ BOOL verifyWlanfirmSignature(u8* buffer, u32 length) } -BOOL InstallWirelessFirmware(void) +BOOL InstallWlanFirmware(void) { - s32 flen = 0; NWMRetCode err; - /* ColdStartのチェック(HotStartでは呼ばれない筈だが) */ + fwBuffer = 0; + + OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0])); + + /* HotStart/ColdStartのチェック */ if (TRUE == SYSMi_GetWork()->flags.common.isHotStart) { - OS_TPrintf("Error: It isn't Cold start.\n"); - return FALSE; - } + // HotStart + NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ + err = NWMi_InstallFirmware(nwmCallback, NULL, 0, FALSE); + } else { + s32 flen = 0; - /* fwBuffer should be allocated from heap. */ - fwBuffer = SYSM_Alloc( FWBUFFER_SIZE ); + // ColdStart - flen = readFirmwareBinary(fwBuffer, FWBUFFER_SIZE); + /* fwBuffer should be allocated from heap. */ + fwBuffer = SYSM_Alloc( FWBUFFER_SIZE ); + if (!fwBuffer) { + OS_TWarning("Error: Couldn't allocate memory for WlanFirmware.\n"); + return FALSE; + } - if ( 0 > flen ) - { - OS_TPrintf("Error: Couldn't read wlan firmware.\n"); - SYSM_Free( fwBuffer ); - return FALSE; - } + flen = readFirmwareBinary(fwBuffer, FWBUFFER_SIZE); - /* + if ( 0 > flen ) + { + OS_TPrintf("Error: Couldn't read wlan firmware.\n"); + SYSM_Free( fwBuffer ); + return FALSE; + } + + /* check signature data - */ - if (FALSE == verifyWlanfirmSignature(fwBuffer, (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; - } + */ + if (FALSE == verifyWlanfirmSignature(fwBuffer, (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; + } - /*************************************************************/ + /*************************************************************/ - NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ + NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ #if (MEASURE_WIRELESS_INITTIME == 1) - startTick = OS_GetTick(); + startTick = OS_GetTick(); #endif - - if ( 0 < flen ) - { - err = NWMi_InstallFirmware(nwmCallback, fwBuffer, (u32)flen); - } else if (flen <= 0) { - err = NWMi_InstallFirmware(nwmCallback, NULL, (u32)flen); + + if ( 0 < flen ) + { + err = NWMi_InstallFirmware(nwmCallback, fwBuffer, (u32)flen, TRUE); + } } - /* osRecvMessage */ /* [TODO:] 無線ロード処理の完了をメインルーチンへ通知するための仕組みを考える必要あり。 */ @@ -303,3 +323,10 @@ BOOL InstallWirelessFirmware(void) return TRUE; } + +BOOL IsWlanFirmwareInstalled(void) +{ + OSMessage msg; + + return OS_ReadMessage(&mesq, &msg, OS_MESSAGE_NOBLOCK); +} diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h index 1b6b877d..dd15597b 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h @@ -24,7 +24,8 @@ extern "C" { #endif -BOOL InstallWirelessFirmware(void); +BOOL InstallWlanFirmware(void); +BOOL IsWlanFirmwareInstalled(void); #ifdef __cplusplus } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 32df4363..9cfe612c 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -192,11 +192,8 @@ void TwlMain( void ) // 無線ファームウェアを無線モジュールにダウンロードする。 #if( WIRELESS_FIRM_LOADING == 1 ) - if (SYSMi_GetWork()->flags.common.isHotStart == FALSE) - { - if( FALSE == InstallWirelessFirmware() ) { - OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); - } + if( FALSE == InstallWlanFirmware() ) { + OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); } #endif