(佐々木@PSEG1)CSU NANDFirm書き込み変更処理に追従するためにkami_write_nandfirm.cを更新

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2534 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-09-17 02:28:19 +00:00
parent 97ad118b91
commit 4fa95f38d4

View File

@ -20,7 +20,6 @@
#include <nitro/card.h>
#include <twl/nam.h>
#include <nitro/nvram.h>
#include "kami_font.h"
#include "kami_pxi.h"
@ -34,15 +33,13 @@
// NANDファーム書き込みの際にNVRAMの未割り当て領域予約領域をクリアする場合は定義します開発用
//#define CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL
#define ROUND_UP(value, alignment) \
(((u32)(value) + (alignment-1)) & ~(alignment-1))
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define NAND_BLOCK_BYTE 0x200
#define NAND_FIRM_START_OFFSET 0x200
#define NAND_BLOCK_BYTE 0x200
#define NAND_FIRM_START_OFFSET 0x200
#define NAND_FIRM_START_OFFSET_IN_FILE 0x200
#define NVRAM_PAGE_SIZE 0x100
#define NVRAM_NORFIRM_RESERVED_ADDRESS 0x200
@ -58,6 +55,12 @@
static u8 sNvramPageSizeBuffer[NVRAM_PAGE_SIZE] ATTRIBUTE_ALIGN(32); // ARM7からアクセスするためスタックでは駄目
static u32 sReservedAreaEndAddress;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
void kamiEraseNandfirmVersion( u32 nandfirmsize );
/*---------------------------------------------------------------------------*
Name: kamiWriteNandfirm
@ -75,15 +78,16 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
BOOL read_is_ok;
u8* pTempBuf;
u32 file_size;
u32 nandfirm_size;
u32 alloc_size;
u32 write_size;
u32 write_block;
BOOL result = TRUE;
u16 crc_w1, crc_w2;
u16 crc_r1, crc_r2;
u16 crc_norfirm_reserved_area_w, crc_norfirm_reserved_area_r;
#ifdef CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL
#ifdef CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL
u32 write_offset;
#endif
#endif // CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL
// .nandファイルオープン
FS_InitFile(&file);
@ -103,8 +107,11 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
return FALSE;
}
nandfirm_size = file_size - NAND_FIRM_START_OFFSET_IN_FILE;
// バッファ確保
alloc_size = ROUND_UP(file_size, 32) ;
// 書き込みがブロック単位(512byte)であることを考慮し512アライメントを確保
alloc_size = MATH_ROUNDUP(file_size, 512);
pTempBuf = allocFunc( alloc_size );
if (pTempBuf == NULL)
{
@ -113,10 +120,12 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
return FALSE;
}
MI_CpuClear8( pTempBuf, alloc_size );
// .nandファイルリード
DC_InvalidateRange(pTempBuf, alloc_size);
DC_FlushRange(pTempBuf, alloc_size);
read_is_ok = FS_ReadFile( &file, pTempBuf, (s32)file_size );
DC_StoreRange(pTempBuf, file_size);
DC_FlushRange(pTempBuf, file_size);
if (!read_is_ok)
{
kamiFontPrintfConsoleEx(1, "Fail FS_ReadFile!\n");
@ -130,7 +139,7 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
// 書き込み前のCRCを計算
crc_w1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) );
crc_w2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 );
crc_w2 = SVC_GetCRC16( 0xffff, pTempBuf+NAND_FIRM_START_OFFSET_IN_FILE, nandfirm_size );
// まずNORHeaderDS領域を書き込む40byte?
if (NVRAMi_Write(0, sizeof(NORHeaderDS), (void*)pTempBuf) != NVRAM_RESULT_SUCCESS)
@ -140,7 +149,7 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
}
// CRCを計算するので念のためにクリアしてからリードする
MI_CpuFill8( pTempBuf, 0xee, sizeof(NORHeaderDS) );
MI_CpuClear8( pTempBuf, sizeof(NORHeaderDS) );
DC_FlushRange(pTempBuf, sizeof(NORHeaderDS));
// CRCチェックのためNvramからリード
@ -148,7 +157,7 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
{
kamiFontPrintfConsoleEx(1, "Fail NVRAMi_Read()!\n");
}
DC_StoreRange(pTempBuf, sizeof(NORHeaderDS));
DC_FlushRange(pTempBuf, sizeof(NORHeaderDS));
// 書き込み後のCRCを計算
crc_r1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) );
@ -176,7 +185,7 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
}
// CRCを計算するので念のためにクリアしてからリードする
MI_CpuFill8( sNvramPageSizeBuffer, 0xee, NVRAM_PAGE_SIZE );
MI_CpuClear8( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE );
// 読み込みはARM7が直接メモリに書き出すため
DC_FlushRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE);
@ -188,7 +197,7 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
}
// 書き込み後のCRCを計算
DC_StoreRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE);
DC_FlushRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE);
crc_norfirm_reserved_area_r = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE );
// NORファームリザーブ領域のCRC比較
@ -258,28 +267,29 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
result = FALSE;
}
// nandfirmバージョンの消去デバッグ用
kamiEraseNandfirmVersion(nandfirm_size);
// kamiFontPrintfConsoleEx(0, "NAND Firm Import Start!\n");
// NAND書き込み
write_size = file_size/NAND_BLOCK_BYTE + (file_size % NAND_BLOCK_BYTE != 0);
kamiNandWrite( NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE, pTempBuf+NAND_FIRM_START_OFFSET, write_size ); // ブロック単位、バイト単位、ブロック単位
// kamiFontPrintfConsoleEx(0, "Start CRC check\n");
write_block = nandfirm_size/NAND_BLOCK_BYTE + (nandfirm_size % NAND_BLOCK_BYTE != 0);
kamiNandWrite( NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE, pTempBuf+NAND_FIRM_START_OFFSET, write_block ); // ブロック単位、バイト単位、ブロック単位
kamiFontLoadScreenData();
// CRCを計算するので念のためにクリアしてからリードする
MI_CpuClear8( pTempBuf, file_size );
DC_FlushRange(pTempBuf, file_size);
MI_CpuClear8( pTempBuf, nandfirm_size );
DC_FlushRange(pTempBuf, nandfirm_size);
// CRCチェックのためNandからリード
if (kamiNandRead(0, pTempBuf, file_size/512 ) == KAMI_RESULT_SEND_ERROR)
if (kamiNandRead(NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE, pTempBuf, write_block ) == KAMI_RESULT_SEND_ERROR)
{
kamiFontPrintfConsoleEx(1, "kamiNandRead ... %s!\n", "ERROR");
}
DC_StoreRange(pTempBuf, file_size);
DC_FlushRange(pTempBuf, nandfirm_size);
// 書き込み後のCRCを計算
crc_r2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 );
crc_r2 = SVC_GetCRC16( 0xffff, pTempBuf, nandfirm_size );
// NAND部分についてのCRCチェック
if (crc_w2 == crc_r2)
@ -298,5 +308,25 @@ BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFu
return result;
}
/*---------------------------------------------------------------------------*
Name: kamiEraseNandfirmVersion
Description: nandfirmのバージョン情報を消去します
Arguments: no
Returns: None.
*---------------------------------------------------------------------------*/
void kamiEraseNandfirmVersion( u32 nandfirmsize )
{
u8 buffer[NAND_BLOCK_BYTE];
u32 blockNo;
if ((nandfirmsize % NAND_BLOCK_BYTE)==0)
{
blockNo = NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE + nandfirmsize/NAND_BLOCK_BYTE;
MI_CpuClear8( buffer, NAND_BLOCK_BYTE );
DC_FlushRange(buffer, NAND_BLOCK_BYTE);
kamiNandWrite( blockNo, buffer, 1 ); // ブロック単位、バイト単位、ブロック単位
}
}