From fece573d78265bf6f1c9b0f7f16f9deea60b5a97 Mon Sep 17 00:00:00 2001 From: kamikawa Date: Thu, 3 Apr 2008 11:45:48 +0000 Subject: [PATCH] =?UTF-8?q?Nand=E3=83=95=E3=82=A1=E3=83=BC=E3=83=A0?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=AB=20NVRAM?= =?UTF-8?q?=20=E3=81=AE=20=E6=9C=AA=E5=89=B2=E3=82=8A=E5=BD=93=E3=81=A6?= =?UTF-8?q?=E9=A0=98=E5=9F=9F=E5=85=88=E9=A0=AD256byte=20=E3=81=A8=20?= =?UTF-8?q?=E4=BA=88=E7=B4=84=E9=A0=98=E5=9F=9F=20256byte=20=E3=82=92?= =?UTF-8?q?=EF=BC=90=E3=82=AF=E3=83=AA=E3=82=A2=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82?= 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@1059 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ARM9.TWL/src/process_nandfirm.c | 85 ++++++++++++++++--- 1 file changed, 74 insertions(+), 11 deletions(-) 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 703a8561..967b8660 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/src/process_nandfirm.c @@ -37,6 +37,10 @@ /*---------------------------------------------------------------------------* マクロ定義 *---------------------------------------------------------------------------*/ + +// NANDファーム書き込みの際にNVRAMの未割り当て領域+予約領域を0クリアする場合は定義します(開発用) +//#define CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL + #define ROUND_UP(value, alignment) \ (((u32)(value) + (alignment-1)) & ~(alignment-1)) @@ -59,6 +63,8 @@ #define NVRAM_NORFIRM_NANDBOOT_FLAG_OFFSET 0xff #define NVRAM_NORFIRM_NANDBOOT_FLAG 0x80 +#define NVRAM_NON_ASIGNED_AREA_ADDRESS 0x300 + /*---------------------------------------------------------------------------* 内部変数定義 *---------------------------------------------------------------------------*/ @@ -66,7 +72,8 @@ static s32 sMenuSelectNo; static char sFilePath[FILE_NUM_MAX][FS_ENTRY_LONGNAME_MAX]; static u8 sFileNum; -static u8 sNorFirmReservedData[NVRAM_PAGE_SIZE]; // ARM7からアクセスするためスタックでは駄目 +static u8 sNvramPageSizeBuffer[NVRAM_PAGE_SIZE] ATTRIBUTE_ALIGN(32); // ARM7からアクセスするためスタックでは駄目 +static u32 sReservedAreaEndAddress; /*---------------------------------------------------------------------------* 内部関数宣言 @@ -321,7 +328,10 @@ static BOOL WriteNandfirm(char* file_name) 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); @@ -398,31 +408,31 @@ static BOOL WriteNandfirm(char* file_name) } // nandfirm 起動フラグを立てる - MI_CpuClear8( sNorFirmReservedData, NVRAM_PAGE_SIZE ); - sNorFirmReservedData[NVRAM_NORFIRM_NANDBOOT_FLAG_OFFSET] = NVRAM_NORFIRM_NANDBOOT_FLAG; + 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, sNorFirmReservedData, NVRAM_PAGE_SIZE ); + crc_norfirm_reserved_area_w = SVC_GetCRC16( 0xffff, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); - DC_FlushRange( sNorFirmReservedData, NVRAM_PAGE_SIZE ); - if (kamiNvramWrite(NVRAM_NORFIRM_RESERVED_ADDRESS, sNorFirmReservedData, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + 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( sNorFirmReservedData, 0xee, NVRAM_PAGE_SIZE ); - if (kamiNvramRead(NVRAM_NORFIRM_RESERVED_ADDRESS, sNorFirmReservedData, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + MI_CpuFill8( sNvramPageSizeBuffer, 0xee, NVRAM_PAGE_SIZE ); + if (kamiNvramRead(NVRAM_NORFIRM_RESERVED_ADDRESS, sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) { kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); result = FALSE; } // 読み込みはARM7が直接メモリに書き出すため - DC_InvalidateRange(sNorFirmReservedData, NVRAM_PAGE_SIZE); + DC_InvalidateRange(sNvramPageSizeBuffer, NVRAM_PAGE_SIZE); // 書き込み後のCRCを計算 - crc_norfirm_reserved_area_r = SVC_GetCRC16( 0xffff, sNorFirmReservedData, 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 ) @@ -431,6 +441,59 @@ static BOOL WriteNandfirm(char* file_name) result = FALSE; } +#ifdef CLEAR_NON_ASIGNED_AREA_AND_RESERVED_AREA_ALL + // 未割り当て領域+予約領域を0クリアします(開発用) + if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); + result = FALSE; + } + DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + 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; + } + + if (kamiNvramRead(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, &sNvramPageSizeBuffer, NVRAM_PAGE_SIZE) == KAMI_RESULT_SEND_ERROR) + { + kamiFontPrintfConsoleEx(1, "Fail kamiNvramRead()\n"); + result = FALSE; + } + DC_InvalidateRange( sNvramPageSizeBuffer, NVRAM_PAGE_SIZE ); + 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 + kamiFontPrintfConsoleEx(0, "NAND Firm Import Start!\n"); // NAND書き込み