mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(佐々木@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:
parent
97ad118b91
commit
4fa95f38d4
@ -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の未割り当て領域+予約領域を0クリアする場合は定義します(開発用)
|
||||
//#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 ); // ブロック単位、バイト単位、ブロック単位
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user