From 4fa95f38d46ed4ed0ca9fd8b35e35041bc134804 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 17 Sep 2008 02:28:19 +0000 Subject: [PATCH] =?UTF-8?q?(=E4=BD=90=E3=80=85=E6=9C=A8@PSEG1)CSU=E3=80=80?= =?UTF-8?q?NANDFirm=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AB=E8=BF=BD=E5=BE=93=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=81=ABkami=5Fwrite=5Fnandfirm.c=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= 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@2534 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ARM9.TWL/src/kami_write_nandfirm.c | 82 +++++++++++++------ 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/build/tests/CustomSystemUpdater/ARM9.TWL/src/kami_write_nandfirm.c b/build/tests/CustomSystemUpdater/ARM9.TWL/src/kami_write_nandfirm.c index 488313c7..cac9c5ee 100644 --- a/build/tests/CustomSystemUpdater/ARM9.TWL/src/kami_write_nandfirm.c +++ b/build/tests/CustomSystemUpdater/ARM9.TWL/src/kami_write_nandfirm.c @@ -20,7 +20,6 @@ #include #include #include - #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 ); // ブロック単位、バイト単位、ブロック単位 + } +}