無線ファームロードの結果を取得する関数を改定。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@807 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
sato_masaki 2008-03-04 10:42:07 +00:00
parent 0f8a452e0c
commit af4ce50163
2 changed files with 114 additions and 64 deletions

View File

@ -23,6 +23,10 @@
#include <sysmenu.h> #include <sysmenu.h>
#include "loadWlanFirm.h" #include "loadWlanFirm.h"
/*
definitions
*/
/* LCFGの無線ファームバージョンをタイトルとしてそのまま使う場合 */ /* LCFGの無線ファームバージョンをタイトルとしてそのまま使う場合 */
#define USE_LCFG_STRING 0 #define USE_LCFG_STRING 0
/* 無線FWダウンロード処理にかかる時間を計測する。 */ /* 無線FWダウンロード処理にかかる時間を計測する。 */
@ -37,63 +41,62 @@
#define FWBUFFER_SIZE 0x40000 #define FWBUFFER_SIZE 0x40000
#define SIGNHEAP_SIZE 0x01000 #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) #if (MEASURE_WIRELESS_INITTIME == 1)
static OSTick startTick; static OSTick startTick;
#endif #endif
static OSMessageQueue mesq; static OSMessageQueue mesq;
static OSMessage mesAry[1]; static OSMessage mesAry[1];
static void nwmCallback(void* arg); /*
static s32 readFirmwareBinary(u8 *buffer, s32 bufSize); internal functions
static BOOL verifyWlanfirmSignature(u8* buffer, u32 length); */
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); 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; NWMCallback *cb = (NWMCallback*)arg;
switch (cb->apiid) WLANFirmResult result;
{
case NWM_APIID_INSTALL_FIRMWARE: if (cb->retcode == NWM_RETCODE_SUCCESS) {
if (cb->retcode == NWM_RETCODE_SUCCESS) {
OS_TPrintf("Wlan firm:FW download success!\n");
#if (MEASURE_WIRELESS_INITTIME == 1) #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 #endif
OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n"); OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n");
if (fwBuffer) { result = WLANFIRM_RESULT_SUCCESS;
SYSM_Free( fwBuffer ); } else { // in case of failure
fwBuffer = 0; OS_TPrintf("Wlan firm:FW download Timeout Error!\n");
} result = WLANFIRM_RESULT_FAILURE;
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;
} }
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]; char path[256];
FSFile file[1]; FSFile file[1];
@ -167,7 +170,7 @@ s32 readFirmwareBinary(u8 *buffer, s32 bufSize)
return flen; return flen;
} }
BOOL verifyWlanfirmSignature(u8* buffer, u32 length) BOOL VerifyWlanfirmSignature(u8* buffer, u32 length)
{ {
NWMFirmHeader *hdr = (NWMFirmHeader*)buffer; NWMFirmHeader *hdr = (NWMFirmHeader*)buffer;
u8 *pPubkey; u8 *pPubkey;
@ -218,7 +221,7 @@ BOOL verifyWlanfirmSignature(u8* buffer, u32 length)
OS_TPrintf("Wlan Firmware authentication has failed.\n"); OS_TPrintf("Wlan Firmware authentication has failed.\n");
/* continue verifying process even though decryption fails /* continue verifying process even though decryption fails
in the case of bonding option = 0x01 (support ARM9/ARM7) */ 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); SYSM_Free(signHeap);
return FALSE; 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) skip comparing SHA1 digests in the case of bonding option = 0x01 (support ARM9/ARM7)
this restriction is for debugging TWL wireless firmware. 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 */ /* verify digest */
if (FALSE == SVC_CompareSHA1( (const void*)txtDigest, (const void*)signDigest )) if (FALSE == SVC_CompareSHA1( (const void*)txtDigest, (const void*)signDigest ))
@ -260,73 +263,99 @@ BOOL InstallWlanFirmware(void)
{ {
NWMRetCode err; NWMRetCode err;
fwBuffer = 0; pNwmBuf = 0;
pFwBuffer = 0;
OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0])); OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0]));
/* HotStart/ColdStartのチェック */ /* HotStart/ColdStartのチェック */
if (TRUE == SYSMi_GetWork()->flags.common.isHotStart) 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 // HotStart
NWM_Init(nwmBuf, sizeof(nwmBuf), 3); /* 3 -> DMA no. */ NWM_Init(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */
err = NWMi_InstallFirmware(nwmCallback, NULL, 0, FALSE); err = NWMi_InstallFirmware(InstallFirmCallback, NULL, 0, FALSE);
} else { } else {
s32 flen = 0; s32 flen = 0;
// ColdStart // ColdStart
/* fwBuffer should be allocated from heap. */ /* pFwBuffer should be allocated from heap. */
fwBuffer = SYSM_Alloc( FWBUFFER_SIZE ); pFwBuffer = SYSM_Alloc( FWBUFFER_SIZE );
if (!fwBuffer) { if (!pFwBuffer) {
OS_TWarning("Error: Couldn't allocate memory for WlanFirmware.\n"); 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"); OS_TPrintf("Error: Couldn't read wlan firmware.\n");
SYSM_Free( fwBuffer ); goto instfirm_error;
return FALSE;
} }
/* /*
check signature data 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("Error: This Wlan Firmware is quite illegal!\n");
OS_TPrintf(" It has never been installed.\n"); OS_TPrintf(" It has never been installed.\n");
SYSM_Free( fwBuffer ); goto instfirm_error;
return FALSE;
} }
/*************************************************************/ /*************************************************************/
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) #if (MEASURE_WIRELESS_INITTIME == 1)
startTick = OS_GetTick(); startTick = OS_GetTick();
#endif #endif
if ( 0 < flen ) err = NWMi_InstallFirmware(InstallFirmCallback, pFwBuffer, (u32)flen, TRUE);
{
err = NWMi_InstallFirmware(nwmCallback, fwBuffer, (u32)flen, TRUE);
}
} }
/* /*
[TODO:] IsWlanFirmwareInstalledでチェックする
*/ */
return TRUE; 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; 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;
} }

View File

@ -24,8 +24,29 @@
extern "C" { extern "C" {
#endif #endif
typedef enum {
WLANFIRM_RESULT_SUCCESS = 1,
WLANFIRM_RESULT_FAILURE = 2
} WLANFirmResult;
/*
InstallWlanFirmware
 
TRUE
     FALSE
*/
BOOL InstallWlanFirmware(void); BOOL InstallWlanFirmware(void);
BOOL IsWlanFirmwareInstalled(void);
/*
IsWlanFirmwareInstalled
 result (WLANFirmResult)
*/
BOOL IsWlanFirmwareInstalled(WLANFirmResult *pResult);
#ifdef __cplusplus #ifdef __cplusplus
} }