diff --git a/build/systemMenu_RED/NandInitializer/banner/icon/gameIcon.bmp b/build/systemMenu_RED/NandInitializer/banner/icon/gameIcon.bmp index 29464f28..34909746 100644 Binary files a/build/systemMenu_RED/NandInitializer/banner/icon/gameIcon.bmp and b/build/systemMenu_RED/NandInitializer/banner/icon/gameIcon.bmp differ diff --git a/build/systemMenu_RED/NandInitializerProduction/ARM9.TWL/Makefile b/build/systemMenu_RED/NandInitializerProduction/ARM9.TWL/Makefile index 2c47d669..fd99069a 100644 --- a/build/systemMenu_RED/NandInitializerProduction/ARM9.TWL/Makefile +++ b/build/systemMenu_RED/NandInitializerProduction/ARM9.TWL/Makefile @@ -48,6 +48,7 @@ MAKEROM_ARM7 = $(MAKEROM_ARM7_BASE).$(TWL_ELF_EXT) SRCS = main.c \ kami_pxi.c \ + kami_write_nandfirm.c \ font_data.c \ graphics.c \ keypad.c \ diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/Makefile b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/Makefile index 8146a5a6..0b776b7a 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/Makefile +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/Makefile @@ -45,6 +45,7 @@ SRCS = main.c \ graphics.c \ keypad.c \ kami_font.c \ + kami_write_nandfirm.c \ cursor.c \ process_format.c \ process_topmenu.c \ diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_font.h b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_font.h index e8bba22d..ad5095e2 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_font.h +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_font.h @@ -42,6 +42,7 @@ extern const u16 PlttDataSub[16][16]; void kamiFontInit(void); void kamiFontClear(void); +void kamiFontClearMain(void); void kamiFontPut(u16 x, u16 y, u16 color, u16 no); void kamiFontPrintf(s16 x, s16 y, u8 color, char *text, ...); void kamiFontPrintfMain(s16 x, s16 y, u8 color, char *text, ...); diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_write_nandfirm.h b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_write_nandfirm.h new file mode 100644 index 00000000..90fe68bd --- /dev/null +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/include/kami_write_nandfirm.h @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - NandInitializer + File: kami_write_nandfirm.h + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#ifndef KAMI_WRITE_NAND_FIRM +#define KAMI_WRITE_NAND_FIRM + +#ifdef __cplusplus +extern "C" { +#endif + +/*===========================================================================*/ + +#include + +/*---------------------------------------------------------------------------* + 型定義 + *---------------------------------------------------------------------------*/ + +typedef void* (*KAMIAlloc)(u32 size); +typedef void (*KAMIFree)(void* ptr); + +/*---------------------------------------------------------------------------* + 関数定義 + *---------------------------------------------------------------------------*/ + +BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFunc); + +/*===========================================================================*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* KAMI_WRITE_NAND_FIRM */ + +/*---------------------------------------------------------------------------* + End of file + *---------------------------------------------------------------------------*/ diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_font.c b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_font.c index f151e513..fb3818b6 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_font.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_font.c @@ -187,6 +187,21 @@ kamiFontClear(void) MI_CpuClear8( sFontScreenDataSub, sizeof(sFontScreenDataSub) ); } +/*---------------------------------------------------------------------------* + Name: kamiFontClearMain + + Description: 仮想スクリーンをクリアする + + Arguments: None + + Returns: None. + *---------------------------------------------------------------------------*/ +void +kamiFontClearMain(void) +{ + MI_CpuClear8( sFontScreenDataMain, sizeof(sFontScreenDataMain) ); +} + /*---------------------------------------------------------------------------* Name: kamiFontPrintf diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_write_nandfirm.c b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_write_nandfirm.c new file mode 100644 index 00000000..4d519da8 --- /dev/null +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/kami_write_nandfirm.c @@ -0,0 +1,296 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - NandInitializer + File: kami_write_nandfirm.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include "kami_font.h" +#include "kami_pxi.h" + +#include +#include "kami_write_nandfirm.h" + +/*---------------------------------------------------------------------------* + マクロ定義 + *---------------------------------------------------------------------------*/ + +// 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 NVRAM_PAGE_SIZE 0x100 +#define NVRAM_NORFIRM_RESERVED_ADDRESS 0x200 +#define NVRAM_NORFIRM_NANDBOOT_FLAG_OFFSET 0xff +#define NVRAM_NORFIRM_NANDBOOT_FLAG 0x80 + +#define NVRAM_NON_ASIGNED_AREA_ADDRESS 0x300 + +/*---------------------------------------------------------------------------* + 内部変数定義 + *---------------------------------------------------------------------------*/ + +static u8 sNvramPageSizeBuffer[NVRAM_PAGE_SIZE] ATTRIBUTE_ALIGN(32); // ARM7からアクセスするためスタックでは駄目 +static u32 sReservedAreaEndAddress; + +/*---------------------------------------------------------------------------* + Name: kamiWriteNandfirm + + Description: + + Arguments: no + + Returns: None. + *---------------------------------------------------------------------------*/ +BOOL kamiWriteNandfirm(const char* pFullPath, NAMAlloc allocFunc, NAMFree freeFunc) +{ + FSFile file; + + BOOL open_is_ok; + BOOL read_is_ok; + u8* pTempBuf; + u32 file_size; + u32 alloc_size; + u32 write_size; + 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 + u32 write_offset; +#endif + + // .nandファイルオープン + FS_InitFile(&file); + open_is_ok = FS_OpenFile(&file, pFullPath); +// OS_Printf("FS_OpenFile(\"%s\") ... %s!\n", pFullPath, open_is_ok ? "OK" : "ERROR"); + + // サイズチェック + file_size = FS_GetFileLength(&file) ; + if (file_size > (800*1024)) + { + kamiFontPrintfConsoleEx(1, "too big file size!\n"); + FS_CloseFile(&file); + return FALSE; + } + + // バッファ確保 + alloc_size = ROUND_UP(file_size, 32) ; + pTempBuf = allocFunc( alloc_size ); + if (pTempBuf == NULL) + { + kamiFontPrintfConsoleEx(1, "Fail Alloc()!\n"); + FS_CloseFile(&file); + return FALSE; + } + + // .nandファイルリード + DC_InvalidateRange(pTempBuf, alloc_size); + read_is_ok = FS_ReadFile( &file, pTempBuf, (s32)file_size ); + DC_StoreRange(pTempBuf, file_size); + if (!read_is_ok) + { + kamiFontPrintfConsoleEx(1, "Fail FS_ReadFile!\n"); + FS_CloseFile(&file); + freeFunc(pTempBuf); + return FALSE; + } + + // ファイルクローズ + FS_CloseFile(&file); + + // 書き込み前のCRCを計算 + crc_w1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); + crc_w2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); + + // まずNORHeaderDS領域を書き込む(40byte?) + if (kamiNvramWrite(0, (void*)pTempBuf, sizeof(NORHeaderDS)) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); + result = FALSE; + } + + // CRCを計算するので念のためにクリアしてからリードする + MI_CpuFill8( pTempBuf, 0xee, sizeof(NORHeaderDS) ); + DC_FlushRange(pTempBuf, sizeof(NORHeaderDS)); + + // CRCチェックのためNvramからリード + if (kamiNvramRead(0, pTempBuf, sizeof(NORHeaderDS) ) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()!\n"); + } + DC_StoreRange(pTempBuf, sizeof(NORHeaderDS)); + + // 書き込み後のCRCを計算 + crc_r1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); + + // NVRAM先頭部分のCRC比較 + if ( crc_w1 != crc_r1 ) + { + freeFunc(pTempBuf); + kamiFontPrintfConsoleEx(1, "Fail! CRC check %x!=%x\n", crc_w1, crc_r1); + return FALSE; + } + + // nandfirm 起動フラグを立てる + MI_CpuClear8( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + sNvramPageSizeBuffer[NVRAM_NORFIRM_NANDBOOT_FLAG_OFFSET] = NVRAM_NORFIRM_NANDBOOT_FLAG; + DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE); + + // NORファームリザーブ領域の書き込みデータのCRCを計算 + crc_norfirm_reserved_area_w = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + + if (kamiNvramWrite(NVRAM_NORFIRM_RESERVED_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); + result = FALSE; + } + + // CRCを計算するので念のためにクリアしてからリードする + MI_CpuFill8( sNvramPageSizeBuffer, 0xee, NVRAM_PAGE_SIZE ); + + // 読み込みはARM7が直接メモリに書き出すため + DC_FlushRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE); + + if (kamiNvramRead(NVRAM_NORFIRM_RESERVED_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); + result = FALSE; + } + + // 書き込み後のCRCを計算 + DC_StoreRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE); + crc_norfirm_reserved_area_r = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + + // NORファームリザーブ領域のCRC比較 + if ( crc_norfirm_reserved_area_w != crc_norfirm_reserved_area_r ) + { + kamiFontPrintfConsoleEx(1, "Fail! Norfirm Reserved Area CRC check %x!=%x\n", crc_norfirm_reserved_area_w, crc_norfirm_reserved_area_r); + result = FALSE; + } + +#ifdef CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL + DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + // 未割り当て領域+予約領域を0クリアします(開発用) + if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); + result = FALSE; + } + sReservedAreaEndAddress = (u32)(*(u16 *)sNvramPageSizeBuffer << NVRAM_CONFIG_DATA_OFFSET_SHIFT) - 0xA00;// TWL WiFi設定 + NTR WiFi設定 を差し引く + //OS_Printf("end = %x\n", sReservedAreaEndAddress); + + MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); + DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + + for (write_offset=NVRAM_NON_ASIGNED_AREA_ADDRESS; write_offset < sReservedAreaEndAddress; write_offset += NVRAM_PAGE_SIZE) + { + if (kamiNvramWrite(write_offset, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); + result = FALSE; + } + } + //OS_Printf("write_offset = %x\n", write_offset); +#else + // 未割り当て領域先頭256byte+予約領域を0クリアします + + MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); + DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + + if (kamiNvramWrite(NVRAM_NON_ASIGNED_AREA_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); + result = FALSE; + } + + DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); + result = FALSE; + } + sReservedAreaEndAddress = (u32)(*(u16 *)sNvramPageSizeBuffer << NVRAM_CONFIG_DATA_OFFSET_SHIFT) - 0xA00;// TWL WiFi設定 + NTR WiFi設定 を差し引く + + MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); + DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + + if (kamiNvramWrite(sReservedAreaEndAddress - 0x100, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); + result = FALSE; + } +#endif + + // NANDログ情報のクリア + if (kamiClearNandErrorLog() != KAMI_RESULT_SUCCESS) + { + kamiFontPrintfConsoleEx(1, "Fail kamiClearNandErrorLog()\n"); + result = FALSE; + } + +// 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"); + kamiFontLoadScreenData(); + + // CRCを計算するので念のためにクリアしてからリードする + MI_CpuClear8( pTempBuf, file_size ); + DC_FlushRange(pTempBuf, file_size); + + // CRCチェックのためNandからリード + if (kamiNandRead(0, pTempBuf, file_size/512 ) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "kamiNandRead ... %s!\n", "ERROR"); + } + DC_StoreRange(pTempBuf, file_size); + + // 書き込み後のCRCを計算 + crc_r2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); + + // NAND部分についてのCRCチェック + if (crc_w2 == crc_r2) + { +// kamiFontPrintfConsoleEx(0, "Success! CRC check %x==%x\n", crc_w2, crc_r2); + } + else + { + result = FALSE; + kamiFontPrintfConsoleEx(1, "Fail! CRC check %x!=%x\n", crc_w2, crc_r2); + } + + // メモリ解放 + freeFunc(pTempBuf); + + return result; +} + + + diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_import.c b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_import.c index 10f4ad47..32f29c2f 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_import.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_import.c @@ -726,7 +726,7 @@ static BOOL ImportTad(char* file_name, TadWriteOption option) } else { - kamiFontPrintfConsole(CONSOLE_RED, "Fail! RetCode=%x\n", nam_result); + kamiFontPrintfConsole(CONSOLE_RED, "Fail! RetCode=%d\n", nam_result); } // InstalledSoftBoxCount, FreeSoftBoxCount の値を現在のNANDの状態に合わせて更新します。 diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c index 80c023ce..841fda96 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c @@ -29,6 +29,7 @@ #include "process_fade.h" #include "cursor.h" #include "keypad.h" +#include "kami_write_nandfirm.h" #include "TWLHWInfo_api.h" #include @@ -80,7 +81,6 @@ static u32 sReservedAreaEndAddress; *---------------------------------------------------------------------------*/ static void MakeFullPathForSD(char* file_name, char* full_path); -static BOOL WriteNandfirm(char* file_name); /*---------------------------------------------------------------------------* プロセス関数定義 @@ -253,10 +253,13 @@ void* NandfirmProcess1(void) void* NandfirmProcess2(void) { BOOL ret; + char full_path[FS_ENTRY_LONGNAME_MAX+6]; if (STD_GetStringLength(sFilePath[sMenuSelectNo])) { - ret = WriteNandfirm(sFilePath[sMenuSelectNo]); + // .nandのフルパスを作成 + MakeFullPathForSD(sFilePath[sMenuSelectNo], full_path); + ret = kamiWriteNandfirm(full_path, OS_AllocFromMain, OS_FreeToMain); } else { @@ -303,243 +306,3 @@ static void MakeFullPathForSD(char* file_name, char* full_path) STD_CopyString( full_path, "sdmc:/" ); STD_ConcatenateString( full_path, file_name ); } - -/*---------------------------------------------------------------------------* - Name: MakeFullPathForSD - - Description: - - Arguments: no - - Returns: None. - *---------------------------------------------------------------------------*/ -static BOOL WriteNandfirm(char* file_name) -{ - FSFile file; - char full_path[FS_ENTRY_LONGNAME_MAX+6]; - - BOOL open_is_ok; - BOOL read_is_ok; - u8* pTempBuf; - u32 file_size; - u32 alloc_size; - u32 write_size; - 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 - u32 write_offset; -#endif - - // .nandのフルパスを作成 - MakeFullPathForSD(file_name, full_path); - - // .nandファイルオープン - FS_InitFile(&file); - open_is_ok = FS_OpenFile(&file, full_path); - OS_Printf("FS_OpenFile(\"%s\") ... %s!\n", full_path, open_is_ok ? "OK" : "ERROR"); - - // サイズチェック - file_size = FS_GetFileLength(&file) ; - if (file_size > (800*1024)) - { - kamiFontPrintfConsoleEx(1, "too big file size!\n"); - FS_CloseFile(&file); - return FALSE; - } - - // バッファ確保 - alloc_size = ROUND_UP(file_size, 32) ; - pTempBuf = OS_Alloc( alloc_size ); - if (pTempBuf == NULL) - { - kamiFontPrintfConsoleEx(1, "Fail Alloc()!\n"); - FS_CloseFile(&file); - return FALSE; - } - - // .nandファイルリード - read_is_ok = FS_ReadFile( &file, pTempBuf, (s32)file_size ); - DC_FlushRange(pTempBuf, file_size); - if (!read_is_ok) - { - kamiFontPrintfConsoleEx(1, "Fail FS_ReadFile!\n"); - FS_CloseFile(&file); - OS_Free(pTempBuf); - return FALSE; - } - - // ファイルクローズ - FS_CloseFile(&file); - - // 書き込み前のCRCを計算 - crc_w1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); - crc_w2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); - - // まずNORHeaderDS領域を書き込む(40byte?) - if (kamiNvramWrite(0, (void*)pTempBuf, sizeof(NORHeaderDS)) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); - result = FALSE; - } - - // CRCを計算するので念のためにクリアしてからリードする - MI_CpuFill8( pTempBuf, 0xee, sizeof(NORHeaderDS) ); - DC_FlushRange(pTempBuf, sizeof(NORHeaderDS)); - - // CRCチェックのためNvramからリード - if (kamiNvramRead(0, pTempBuf, sizeof(NORHeaderDS) ) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()!\n"); - } - - // 書き込み後のCRCを計算 - crc_r1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); - - // NVRAM先頭部分のCRC比較 - if ( crc_w1 != crc_r1 ) - { - OS_Free(pTempBuf); - kamiFontPrintfConsoleEx(1, "Fail! CRC check %x!=%x\n", crc_w1, crc_r1); - return FALSE; - } - - // nandfirm 起動フラグを立てる - MI_CpuClear8( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - sNvramPageSizeBuffer[NVRAM_NORFIRM_NANDBOOT_FLAG_OFFSET] = NVRAM_NORFIRM_NANDBOOT_FLAG; - - // NORファームリザーブ領域の書き込みデータのCRCを計算 - crc_norfirm_reserved_area_w = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - - DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - if (kamiNvramWrite(NVRAM_NORFIRM_RESERVED_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); - result = FALSE; - } - - // CRCを計算するので念のためにクリアしてからリードする - MI_CpuFill8( sNvramPageSizeBuffer, 0xee, NVRAM_PAGE_SIZE ); - - // 読み込みはARM7が直接メモリに書き出すため - DC_InvalidateRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE); - - if (kamiNvramRead(NVRAM_NORFIRM_RESERVED_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); - result = FALSE; - } - - // 書き込み後のCRCを計算 - crc_norfirm_reserved_area_r = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - - // NORファームリザーブ領域のCRC比較 - if ( crc_norfirm_reserved_area_w != crc_norfirm_reserved_area_r ) - { - kamiFontPrintfConsoleEx(1, "Fail! Norfirm Reserved Area CRC check %x!=%x\n", crc_norfirm_reserved_area_w, crc_norfirm_reserved_area_r); - result = FALSE; - } - -#ifdef CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL - DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - // 未割り当て領域+予約領域を0クリアします(開発用) - if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); - result = FALSE; - } - sReservedAreaEndAddress = (u32)(*(u16 *)sNvramPageSizeBuffer << NVRAM_CONFIG_DATA_OFFSET_SHIFT) - 0xA00;// TWL WiFi設定 + NTR WiFi設定 を差し引く - //OS_Printf("end = %x\n", sReservedAreaEndAddress); - - MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); - DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - - for (write_offset=NVRAM_NON_ASIGNED_AREA_ADDRESS; write_offset < sReservedAreaEndAddress; write_offset += NVRAM_PAGE_SIZE) - { - if (kamiNvramWrite(write_offset, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); - result = FALSE; - } - } - //OS_Printf("write_offset = %x\n", write_offset); -#else - // 未割り当て領域先頭256byte+予約領域を0クリアします - - MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); - DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - - if (kamiNvramWrite(NVRAM_NON_ASIGNED_AREA_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); - result = FALSE; - } - - DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); - result = FALSE; - } - sReservedAreaEndAddress = (u32)(*(u16 *)sNvramPageSizeBuffer << NVRAM_CONFIG_DATA_OFFSET_SHIFT) - 0xA00;// TWL WiFi設定 + NTR WiFi設定 を差し引く - - MI_CpuFill8( sNvramPageSizeBuffer, 0x00, NVRAM_PAGE_SIZE ); - DC_FlushRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - - if (kamiNvramWrite(sReservedAreaEndAddress - 0x100, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "Fail kamiNvramWrite()\n"); - result = FALSE; - } -#endif - - // NANDログ情報のクリア - if (kamiClearNandErrorLog() != KAMI_RESULT_SUCCESS) - { - kamiFontPrintfConsoleEx(1, "Fail kamiClearNandErrorLog()\n"); - result = FALSE; - } - - 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"); - kamiFontLoadScreenData(); - - // CRCを計算するので念のためにクリアしてからリードする - MI_CpuClear8( pTempBuf, file_size ); - DC_FlushRange(pTempBuf, file_size); - - // CRCチェックのためNandからリード - if (kamiNandRead(0, pTempBuf, file_size/512 ) == KAMI_RESULT_SEND_ERROR) - { - kamiFontPrintfConsoleEx(1, "kamiNandRead ... %s!\n", "ERROR"); - } - DC_FlushRange(pTempBuf, file_size); - - // 書き込み後のCRCを計算 - crc_r2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); - - // NAND部分についてのCRCチェック - if (crc_w2 == crc_r2) - { - kamiFontPrintfConsoleEx(0, "Success! CRC check %x==%x\n", crc_w2, crc_r2); - } - else - { - result = FALSE; - kamiFontPrintfConsoleEx(1, "Fail! CRC check %x!=%x\n", crc_w2, crc_r2); - } - - // メモリ解放 - OS_Free(pTempBuf); - - return result; -} - - - diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_norfirm.c b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_norfirm.c index bfa6c8c4..c7d5f62b 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_norfirm.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_norfirm.c @@ -331,8 +331,8 @@ static BOOL WriteNorfirm(char* file_name) } // .norファイルリード + DC_InvalidateRange(pTempBuf, alloc_size); read_is_ok = FS_ReadFile( &file, pTempBuf, (s32)file_size ); - DC_FlushRange(pTempBuf, file_size); if (!read_is_ok) { kamiFontPrintfConsoleEx(1, "FS_ReadFile(\"%s\") ... ERROR!\n", full_path); @@ -345,6 +345,7 @@ static BOOL WriteNorfirm(char* file_name) FS_CloseFile(&file); // 書き込み前のCRCを計算 + DC_StoreRange(pTempBuf, file_size); crc_w1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); crc_w2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); @@ -365,6 +366,7 @@ static BOOL WriteNorfirm(char* file_name) } // 書き込み後のCRCを計算 + DC_StoreRange(pTempBuf, sizeof(NORHeaderDS)); crc_r1 = SVC_GetCRC16( 0xffff, pTempBuf, sizeof(NORHeaderDS) ); // NVRAM前半部のCRCをチェック @@ -409,6 +411,7 @@ static BOOL WriteNorfirm(char* file_name) } // 書き込み後のCRCを計算 + DC_StoreRange(pTempBuf, file_size); crc_r2 = SVC_GetCRC16( 0xffff, pTempBuf+512, file_size-512 ); // CRC比較