From fbbb9cdc1188633a9c8624ff6c63fc0779fddf1f Mon Sep 17 00:00:00 2001 From: kamikawa Date: Thu, 12 Jun 2008 06:09:29 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=9E=E3=82=A4=E3=82=B3=E3=83=B3=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=83=BC=E3=83=A0=E3=81=AE=E6=9B=B8=E3=81=8D=E6=8F=9B?= =?UTF-8?q?=E3=81=88=E3=81=AB=E5=AF=BE=E5=BF=9C=EF=BC=88NandInitializerRed?= =?UTF-8?q?=EF=BC=89=20=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=E3=81=AB?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AB?= =?UTF-8?q?=E3=81=AF=E3=80=81=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=E6=9C=89=E3=81=99=E3=82=8B=E3=83=9E=E3=82=A4?= =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=95=E3=82=A1=E3=83=BC=E3=83=A0=E3=81=AB?= =?UTF-8?q?=EF=BC=88=E5=88=A5=E6=89=8B=E6=AE=B5=E3=81=A7=EF=BC=89=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=81=97=E3=81=A6=E3=81=8A=E3=81=8F=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E3=81=8C=E3=81=82=E3=82=8A=E3=81=BE=E3=81=99=E3=80=82=20?= =?UTF-8?q?=E3=83=9E=E3=82=A4=E3=82=B3=E3=83=B3=E3=83=95=E3=82=A1=E3=83=BC?= =?UTF-8?q?=E3=83=A0=E3=83=87=E3=83=BC=E3=82=BF=E3=81=AFROM=E6=8C=81?= =?UTF-8?q?=E3=81=A1=E3=81=97=E3=81=A6=E3=81=84=E3=81=BE=E3=81=99=E3=81=8C?= =?UTF-8?q?SD=E3=82=AB=E3=83=BC=E3=83=89=E6=8C=81=E3=81=A1=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=99=E3=82=8B=E3=81=8B=E3=82=82=E3=81=97?= =?UTF-8?q?=E3=82=8C=E3=81=BE=E3=81=9B=E3=82=93=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@1618 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ARM7.TWL/Makefile | 3 +- .../ARM9.TWL/Makefile | 1 + .../NandInitializerRed/ARM7.TWL/Makefile | 3 +- .../NandInitializerRed/ARM7.TWL/armadillo.lsf | 1 + .../ARM7.TWL/src/kami_pxi.c | 18 + .../NandInitializerRed/ARM9.TWL/Makefile | 1 + .../ARM9.TWL/include/kami_pxi.h | 1 + .../ARM9.TWL/include/process_mcu.h | 54 + .../ARM9.TWL/src/kami_pxi.c | 44 + .../ARM9.TWL/src/process_import.c | 59 - .../ARM9.TWL/src/process_mcu.c | 251 ++++ .../ARM9.TWL/src/process_topmenu.c | 7 +- .../NandInitializerRed/common/include/fifo.h | 1 + .../NandInitializerRed/data/cert.sys | Bin 3136 -> 0 bytes .../NandInitializerRed/data/mcu_twl.hex | 1041 +++++++++++++++++ .../common/ARM7/include/mcu_firm.h | 22 + .../common/ARM7/src/mcu_firm.c | 226 ++++ 17 files changed, 1671 insertions(+), 62 deletions(-) create mode 100644 build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/process_mcu.h create mode 100644 build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_mcu.c delete mode 100644 build/systemMenu_tools/NandInitializerRed/data/cert.sys create mode 100644 build/systemMenu_tools/NandInitializerRed/data/mcu_twl.hex create mode 100644 build/systemMenu_tools/common/ARM7/include/mcu_firm.h create mode 100644 build/systemMenu_tools/common/ARM7/src/mcu_firm.c diff --git a/build/systemMenu_tools/NandInitializerProduction/ARM7.TWL/Makefile b/build/systemMenu_tools/NandInitializerProduction/ARM7.TWL/Makefile index b498910b..55cdc8f9 100644 --- a/build/systemMenu_tools/NandInitializerProduction/ARM7.TWL/Makefile +++ b/build/systemMenu_tools/NandInitializerProduction/ARM7.TWL/Makefile @@ -30,7 +30,8 @@ SRCS = crt0.SCFG_NOLOCK.c \ main.c \ kami_pxi.c \ formatter.c \ - nvram_misc.c + nvram_misc.c \ + mcu_firm.c TARGET_NAME = armadillo diff --git a/build/systemMenu_tools/NandInitializerProduction/ARM9.TWL/Makefile b/build/systemMenu_tools/NandInitializerProduction/ARM9.TWL/Makefile index 0203a3aa..0e45ca7a 100644 --- a/build/systemMenu_tools/NandInitializerProduction/ARM9.TWL/Makefile +++ b/build/systemMenu_tools/NandInitializerProduction/ARM9.TWL/Makefile @@ -74,6 +74,7 @@ SRCS = main.c \ process_auto.c \ process_fade.c \ process_font.c \ + process_mcu.c \ process_wireless_setting.c \ sd_event.c \ hwi.c \ diff --git a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/Makefile b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/Makefile index 408a2005..0807dbda 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/Makefile +++ b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/Makefile @@ -30,7 +30,8 @@ SRCS = crt0.SCFG_NOLOCK.c \ main.c \ kami_pxi.c \ formatter.c \ - nvram_misc.c + nvram_misc.c \ + mcu_firm.c TARGET_NAME = armadillo diff --git a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/armadillo.lsf b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/armadillo.lsf index f9d28f17..e3507975 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/armadillo.lsf +++ b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/armadillo.lsf @@ -42,6 +42,7 @@ Ltdautoload SCRWRAM Object $(OBJDIR)/kami_pxi.o Object $(OBJDIR)/formatter.o Object $(OBJDIR)/nvram_misc.o + Object $(OBJDIR)/mcu_firm.o Library libsea_sp$(LIBSUFFIX).a Library libcrypto_sp$(LIBSUFFIX).a diff --git a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/src/kami_pxi.c b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/src/kami_pxi.c index 9299ee7e..53eb40e5 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/src/kami_pxi.c +++ b/build/systemMenu_tools/NandInitializerRed/ARM7.TWL/src/kami_pxi.c @@ -22,6 +22,7 @@ #include "twl/cdc.h" #include "formatter.h" #include "nvram.h" +#include "mcu_firm.h" #include #include #include @@ -129,6 +130,7 @@ static void KamiPxiCallback(PXIFifoTag tag, u32 data, BOOL err) case KAMI_EXE_FORMAT: case KAMI_NAND_IO: case KAMI_NVRAM_IO: + case KAMI_MCU_WRITE_FIRM: case KAMI_MCU_IO: case KAMI_ARM7_IO: case KAMI_CDC_GO_DSMODE: @@ -249,6 +251,22 @@ static void KamiThread(void *arg) } break; + case KAMI_MCU_WRITE_FIRM: + { + void* buffer; + KAMI_UNPACK_U32((u32 *)(&buffer), &kamiWork.data[1]); + + if ( MCU_WriteFirm( buffer ) ) + { + KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_SUCCESS); + } + else + { + KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_SUCCESS_FALSE); + } + } + break; + case KAMI_MCU_IO: { BOOL is_read; diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile index 085b9206..7d1fa653 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile @@ -70,6 +70,7 @@ SRCS = main.c \ process_auto.c \ process_fade.c \ process_font.c \ + process_mcu.c \ process_wireless_setting.c \ sd_event.c \ hwi.c \ diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/kami_pxi.h b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/kami_pxi.h index 4b18a74c..32db296c 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/kami_pxi.h +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/kami_pxi.h @@ -61,6 +61,7 @@ void KamiPxiInit( void ); KAMIResult ExeFormatAsync(FormatMode format_mode, KAMICallback callback); KAMIResult kamiNandIo(u32 block, void* buffer, u32 count, BOOL is_read); KAMIResult kamiNvramIo(u32 address, void* buffer, u32 size, BOOL is_read); +KAMIResult kamiMcuWriteFirm(void* buffer ); KAMIResult kamiMcuIo(u32 reg_no, void* buffer, u32 value, BOOL is_read); KAMIResult kamiARM7Io(u32 addr, u32* buffer, u32 value, BOOL is_read); KAMIResult kamiCDC_GoDsMode( void ); diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/process_mcu.h b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/process_mcu.h new file mode 100644 index 00000000..a9056481 --- /dev/null +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/process_mcu.h @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - NandInitializer + File: process_mcu.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 PROCESS_MCU_H_ +#define PROCESS_MCU_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/*===========================================================================*/ + +#include + +/*---------------------------------------------------------------------------* + 定数定義 + *---------------------------------------------------------------------------*/ +#define MCU_DATA_FILE_PATH_IN_ROM "rom:/data/mcu_twl.hex" + +/*---------------------------------------------------------------------------* + 関数定義 + *---------------------------------------------------------------------------*/ + +void* mcuProcess0(void); +void* mcuProcess1(void); +void* mcuProcess2(void); +void* mcuProcess3(void); +void* mcuProcess4(void); + +/*===========================================================================*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* PROCESS_MCU_H_ */ + +/*---------------------------------------------------------------------------* + End of file + *---------------------------------------------------------------------------*/ diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/kami_pxi.c b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/kami_pxi.c index 6fb06a7d..08a32565 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/kami_pxi.c +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/kami_pxi.c @@ -225,6 +225,50 @@ KAMIResult kamiNvramIo(u32 address, void* buffer, u32 size, BOOL is_read) return KAMI_RESULT_SEND_ERROR; } +/*---------------------------------------------------------------------------* + Name: kamiMcuWriteFirm + + Description: MCUファーム更新関数 + + Arguments: buffer : new mcu data buffer + + Returns: + *---------------------------------------------------------------------------*/ + +KAMIResult kamiMcuWriteFirm(void* buffer ) +{ + OSIntrMode enabled; + u8 data[4]; + int i; + + // ロック + enabled = OS_DisableInterrupts(); + if (kamiWork.lock) + { + (void)OS_RestoreInterrupts(enabled); + return KAMI_RESULT_BUSY; + } + kamiWork.lock = TRUE; + (void)OS_RestoreInterrupts(enabled); + + kamiWork.callback = NULL; + kamiWork.arg = 0; + + // データ作成 + KAMI_PACK_U32(&data[0], &buffer); + + if (KamiSendPxiCommand(KAMI_MCU_WRITE_FIRM, 4, (u8)0)) + { + for (i = 0; i < 4; i+=3) + { + KamiSendPxiData(&data[i]); + } + KamiWaitBusy(); + return (KAMIResult)kamiWork.result; + } + + return KAMI_RESULT_SEND_ERROR; +} /*---------------------------------------------------------------------------* Name: MCUアクセス関数 diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c index 2a0eb739..0f17458b 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c @@ -104,7 +104,6 @@ static void MakeFullPathForSD(char* file_name, char* full_path); static void ShowTitleinfoDifference( NAMTitleInfo* titleInfoNand, NAMTitleInfo* titleInfoSd); void ProgessInit(void); void ProgressDraw(f32 ratio); -static void* ImportProcessReturn0(void); static void* ImportProcessReturn1(void); static void* ImportIndividuallyProcess0(void); @@ -141,19 +140,6 @@ void* ImportProcess0(void) FSFile dir; int i; - // 2008/05/20 もうcert.sysは必要なし。 -#if 0 - FATFSFileHandle fat_handle; - // F:sys/cert.sysが存在しないなら出直してもらう - fat_handle = FATFS_OpenFile(E_TICKET_FILE_PATH_IN_NAND, "r"); - if (!fat_handle) - { - FATFS_CloseFile(fat_handle); - return ImportProcessReturn0; - } - FATFS_CloseFile(fat_handle); -#endif - // 文字列全クリア kamiFontClear(); @@ -327,51 +313,6 @@ void* ImportProcess2(void) return ImportProcess1; } -/*---------------------------------------------------------------------------* - Name: ImportProcessReturn0 - - Description: - - Arguments: None. - - Returns: next sequence - *---------------------------------------------------------------------------*/ - -void* ImportProcessReturn0(void) -{ - int i; - - // 文字列全クリア - kamiFontClear(); - kamiFontPrintf(2, 10, FONT_COLOR_RED, "%s is not exist", E_TICKET_FILE_PATH_IN_NAND); - kamiFontPrintf(2, 11, FONT_COLOR_RED, "You should write e-ticket", E_TICKET_FILE_PATH_IN_NAND); - kamiFontPrintf(2, 12, FONT_COLOR_RED, "beforehand.", E_TICKET_FILE_PATH_IN_NAND); - kamiFontPrintf(2, 22, FONT_COLOR_BLACK, "B Button : return to menu"); - - // バージョン表示 - kamiFontPrintf(2, 1, FONT_COLOR_BLACK, "Import TAD from SD"); - kamiFontPrintf(0, 2, FONT_COLOR_BLACK, "--------------------------------"); - - // 背景全クリア - for (i=0;i<24;i++) - { - kamiFontFillChar( i, BG_COLOR_TRANS, BG_COLOR_TRANS ); - } - - // 背景上部 - kamiFontFillChar( 0, BG_COLOR_PINK, BG_COLOR_PINK ); - kamiFontFillChar( 1, BG_COLOR_PINK, BG_COLOR_PINK ); - kamiFontFillChar( 2, BG_COLOR_PINK, BG_COLOR_TRANS ); - - // カーソル消去 - SetCursorPos((u16)200, (u16)200); - - // フォントスクリーンデータロード - kamiFontLoadScreenData(); - - FADE_IN_RETURN( ImportProcessReturn1 ); -} - /*---------------------------------------------------------------------------* Name: ImportProcessReturn1 diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_mcu.c b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_mcu.c new file mode 100644 index 00000000..ecca41a9 --- /dev/null +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_mcu.c @@ -0,0 +1,251 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - NandInitializer + File: process_mcu.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 "process_topmenu.h" +#include "process_mcu.h" +#include "process_auto.h" +#include "process_fade.h" +#include "cursor.h" +#include "keypad.h" + +/*---------------------------------------------------------------------------* + 型定義 + *---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------* + 定数定義 + *---------------------------------------------------------------------------*/ + +#define NUM_OF_MENU_SELECT 2 +#define DOT_OF_MENU_SPACE 16 +#define CURSOR_ORIGIN_X 32 +#define CURSOR_ORIGIN_Y 56 + +#define ROUND_UP(value, alignment) \ + (((u32)(value) + (alignment-1)) & ~(alignment-1)) + +/*---------------------------------------------------------------------------* + 内部変数定義 + *---------------------------------------------------------------------------*/ + +static s8 sMenuSelectNo; + +/*---------------------------------------------------------------------------* + 内部関数宣言 + *---------------------------------------------------------------------------*/ + +static BOOL WriteMcuData(void); + +/*---------------------------------------------------------------------------* + プロセス関数定義 + *---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------* + Name: mcu プロセス0 + + Description: + + Arguments: None. + + Returns: next sequence + *---------------------------------------------------------------------------*/ + +void* mcuProcess0(void) +{ + int i; + + // 文字列全クリア + kamiFontClear(); + + // バージョン表示 + kamiFontPrintf(2, 1, FONT_COLOR_BLACK, "Write MCU Data"); + kamiFontPrintf(0, 2, FONT_COLOR_BLACK, "--------------------------------"); + + // メニュー一覧 + kamiFontPrintf(3, 6, FONT_COLOR_BLACK, "+-------------------+-----+"); + kamiFontPrintf(3, 7, FONT_COLOR_BLACK, "l WRITE MCU DATA l l"); + kamiFontPrintf(3, 8, FONT_COLOR_BLACK, "+-------------------+-----+"); + kamiFontPrintf(3, 9, FONT_COLOR_BLACK, "l RETURN l l"); + kamiFontPrintf(3, 10, FONT_COLOR_BLACK, "+-------------------+-----+"); + + // 背景全クリア + for (i=0;i<24;i++) + { + kamiFontFillChar( i, BG_COLOR_TRANS, BG_COLOR_TRANS ); + } + + // 背景上部 + kamiFontFillChar( 0, BG_COLOR_GRAY, BG_COLOR_GRAY ); + kamiFontFillChar( 1, BG_COLOR_GRAY, BG_COLOR_GRAY ); + kamiFontFillChar( 2, BG_COLOR_GRAY, BG_COLOR_TRANS ); + + // カーソル消去 + SetCursorPos((u16)200, (u16)200); + + FADE_IN_RETURN( mcuProcess1 ); +} + +/*---------------------------------------------------------------------------* + Name: mcu プロセス1 + + Description: + + Arguments: None. + + Returns: next sequence + *---------------------------------------------------------------------------*/ + +void* mcuProcess1(void) +{ +/* +#ifndef NAND_INITIALIZER_LIMITED_MODE + // オート実行用 + if (gAutoFlag) + { + sMenuSelectNo = 0; + return mcuProcess2; + } +#endif +*/ + + // 選択メニューの変更 + if ( kamiPadIsRepeatTrigger(PAD_KEY_UP) ) + { + if (--sMenuSelectNo < 0) sMenuSelectNo = NUM_OF_MENU_SELECT -1; + } + else if ( kamiPadIsRepeatTrigger(PAD_KEY_DOWN) ) + { + if (++sMenuSelectNo >= NUM_OF_MENU_SELECT) sMenuSelectNo = 0; + } + + // カーソル配置 + SetCursorPos((u16)CURSOR_ORIGIN_X, (u16)(CURSOR_ORIGIN_Y + sMenuSelectNo * DOT_OF_MENU_SPACE)); + + // 決定 + if (kamiPadIsTrigger(PAD_BUTTON_A)) + { + return mcuProcess2; + } + // トップメニューへ戻る + else if (kamiPadIsTrigger(PAD_BUTTON_B)) + { + FADE_OUT_RETURN( TopmenuProcess0 ); + } + + return mcuProcess1; +} + +/*---------------------------------------------------------------------------* + Name: mcu プロセス2 + + Description: + + Arguments: None. + + Returns: next sequence + *---------------------------------------------------------------------------*/ + +void* mcuProcess2(void) +{ + BOOL result; + + switch( sMenuSelectNo ) + { + case 0: + result = WriteMcuData(); + if (result) + { + kamiFontPrintf(25, 7, FONT_COLOR_GREEN, "OK"); + } + else + { + kamiFontPrintf(25, 7, FONT_COLOR_RED, "NG"); + } + break; + case 1: + FADE_OUT_RETURN( TopmenuProcess0 ); + } +/* +#ifndef NAND_INITIALIZER_LIMITED_MODE + // Auto用 + if (gAutoFlag) + { + if (result) { FADE_OUT_RETURN( AutoProcess1 ); } + else { FADE_OUT_RETURN( AutoProcess2); } + } +#endif +*/ + return mcuProcess1; +} + +/*---------------------------------------------------------------------------* + 処理関数定義 + *---------------------------------------------------------------------------*/ + +static BOOL WriteMcuData(void) +{ + FSFile file; + BOOL open_is_ok; + BOOL read_is_ok; + void* pTempBuf; + u32 file_size; + u32 alloc_size; + BOOL result = TRUE; + + // ROMファイルオープン + FS_InitFile(&file); + open_is_ok = FS_OpenFile(&file, MCU_DATA_FILE_PATH_IN_ROM); + if (!open_is_ok) + { + OS_Printf("FS_OpenFile(\"%s\") ... ERROR!\n", MCU_DATA_FILE_PATH_IN_ROM); + return FALSE; + } + + // ROMファイルリード + file_size = FS_GetFileLength(&file) ; + alloc_size = ROUND_UP(file_size, 32) ; + pTempBuf = OS_Alloc( alloc_size ); + SDK_NULL_ASSERT(pTempBuf); + DC_InvalidateRange(pTempBuf, alloc_size); + read_is_ok = FS_ReadFile( &file, pTempBuf, (s32)file_size ); + if (!read_is_ok) + { + kamiFontPrintfConsoleEx(CONSOLE_RED, "FS_ReadFile(\"%s\") ... ERROR!\n", MCU_DATA_FILE_PATH_IN_ROM); + FS_CloseFile(&file); + OS_Free(pTempBuf); + return FALSE; + } + + // ROMファイルクローズ + FS_CloseFile(&file); + + if (kamiMcuWriteFirm(pTempBuf) != KAMI_RESULT_SUCCESS) + { + result = FALSE; + } + + OS_Free(pTempBuf); + + return result; +} + diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_topmenu.c b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_topmenu.c index 62b60779..631ae97b 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_topmenu.c +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_topmenu.c @@ -27,6 +27,7 @@ #include "process_fade.h" #include "process_wireless_setting.h" #include "process_font.h" +#include "process_mcu.h" #include "cursor.h" #include "keypad.h" @@ -50,6 +51,7 @@ enum { MENU_IMPORT_TAD, MENU_IMPORT_NANDFIRM, MENU_IMPORT_NORFIRM, + MENU_WRITE_MCU_DATA, #endif // NAND_INITIALIZER_LIMITED_MODE NUM_OF_MENU_SELECT }; @@ -86,7 +88,8 @@ static const MenuAndColor sMenuArray[] = #ifndef NAND_INITIALIZER_LIMITED_MODE {" IMPORT TAD FROM SD ", BG_COLOR_PINK }, {" IMPORT NANDFIRM FROM SD", BG_COLOR_GREEN }, - {" IMPORT NORFIRM FROM SD", BG_COLOR_VIOLET } + {" IMPORT NORFIRM FROM SD", BG_COLOR_VIOLET }, + {" WRITE MCU DATA ", BG_COLOR_GRAY } #endif // NAND_INITIALIZER_LIMITED_MODE }; @@ -238,6 +241,8 @@ void* TopmenuProcess2(void) FADE_OUT_RETURN( NandfirmProcess0 ); case MENU_IMPORT_NORFIRM: FADE_OUT_RETURN( NorfirmProcess0 ); + case MENU_WRITE_MCU_DATA: + FADE_OUT_RETURN( mcuProcess0 ); #endif // NAND_INITIALIZER_LIMITED_MODE } diff --git a/build/systemMenu_tools/NandInitializerRed/common/include/fifo.h b/build/systemMenu_tools/NandInitializerRed/common/include/fifo.h index 9c859689..4967fc47 100644 --- a/build/systemMenu_tools/NandInitializerRed/common/include/fifo.h +++ b/build/systemMenu_tools/NandInitializerRed/common/include/fifo.h @@ -65,6 +65,7 @@ typedef enum KamiCommand KAMI_NAND_IO, KAMI_NVRAM_IO, KAMI_MCU_IO, + KAMI_MCU_WRITE_FIRM, KAMI_ARM7_IO, KAMI_CDC_GO_DSMODE, KAMI_CLEAR_NAND_ERRORLOG, diff --git a/build/systemMenu_tools/NandInitializerRed/data/cert.sys b/build/systemMenu_tools/NandInitializerRed/data/cert.sys deleted file mode 100644 index 9368fbbcbee56ab9d336f571c66fe71e057bef9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3136 zcmb`{_d6Tf9|!P+lo)BXgwjfN5HVAuT&);2Q#9yRqr?h=#$I2ep(Se6UWwXj#Hj6B zRkOsdqE)TiC@MP4QWf9c=idGSx9;cs@cHGuKj%E>c|8XJ1OO7v8n`bZ8N1Jj(@nmC zAim}@#rxPvQfnTsNtcIx)=88LguD>;5mgOCYo4QCcj_%P zS4=?b$s4Iexe%Pa7=6}X354`$> zQso~@uoth1-PAPH@{?fV%+fE(_jhMxN_Z6!?{EZ?KkZ4f<7vW0^MfT^&D;Biyb@bd_AnK7Esu8wl3`s4wF6JE!AMdsJG8*hEK_uI!GOO zvOn3g9=!+MSL>cppu26Hu}I97b?RGry1%C&Qo5QtC%OjW*#OJW(7>KD=y>>0i51PV zn}JMUb==t!pJN(ti)C-;#0Om$8q)!>F@sh!0oksorFK;@q!yc7{-${&uR3omt6U*Z z^YboL#kt2*Y-I_?nKPp*{SJ|!15TE4rD}9=bCOP)=!QFEpT<4C{$fdHc?3NwgAVm+WBMamyBX}x1I@2;nv zASWv#@hndL3OO;M5$cnBg?@RhWre@XYGgWHtzuxpFq?DQqf?}|r`dp~M5ACRlv1Hm zF;r+mskrD$F0qyn>z|&8rWHB$GO^m|#UNjFV*X9<*~>?Di^yLtj^FN}%1Z)(Ki03* zkDL|DqbTclN?dzEmt@}@Rc~Z9hfSxJyQ1p4Ij)v-wZFlucM2jn8b1{93kBegd*itb zT73g_x@;msh_QFfV8$v`*Hes^41LglH;0NUx2SqnJ=W6k7>!$E3P#>uLKNKgalYOZSNTi8Y(dI?)3QPKWa^ z@PS)qQctcJa+F52MpSik=a85J>>ln-9 z+{u^SkpP2k`IKNlcN7>bta2KDB53uHpt%Lal&y~p%VZE~P2RFRZSQvo0#Y#A2WpCO z7<4otl{4l;J>1_O^;qlavUTqXK(NBxvab|=l&=3`9*(IcIL&5NXaziC5((gME4}b! zuY*xU4KITaGaf$kMDIxZVf>T&c8*oOE42jX&tC)i4}idnDO-G>bkf`Q*^=l>yUqz* zl*B4pmRU*bX$p*nahX-ulo%@8BS+Gyf`YUBRnfOcESU<(PLQ z83<9n9<#aTaXaDth0Rha@p2{+@3NWuDNN>%=3Q9uPF-2KFl_xPofci+ri+MTbP4~q zk%Srs2zqI(H>k+!PSr9yAOVaXpyKZjN~7r5;Fnx#+FXJ~hD9#o9{JLotxe&MoE%ob zOQgaTJLu;7=#?~qL;c_Xg@1F?fBawickX}g{^9>2?Nvl zdJFfL&5ISHm}igs6Mz?J*t?gqNOH7_ErJf(ePS2~mm1eWs$DGqjjYvSlayi{v4h)i zvS#B6$)U$5v3@eY5sMVc0nRG9-B;~d>^JHtupEVmFZI`*$ckU`N_jX=pK_a2>UlKz%!%jV0m?2|bHl-0POMTgA!i|Mv;xAy zoG%&w$V~{dtOwnS|L&wEe7pXr`VuSx^5J2vXEhcM(M9K8Uz!aE3&Xy=UX@sVpjvG^ zRzAnYjmqiN|Fq41v^yhNoUg-3ZC;BZBV=-~X MUQd4Q)W1{z2SN)i%K!iX diff --git a/build/systemMenu_tools/NandInitializerRed/data/mcu_twl.hex b/build/systemMenu_tools/NandInitializerRed/data/mcu_twl.hex new file mode 100644 index 00000000..88bc9ca4 --- /dev/null +++ b/build/systemMenu_tools/NandInitializerRed/data/mcu_twl.hex @@ -0,0 +1,1041 @@ +:02000000F0000E +:10000200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10001200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:02002200FFFFDE +:02002400DA0BF5 +:04002600FFFFFFFFDA +:02002A00530D74 +:08002C00FFFFFFFFFFFFFFFFD4 +:020034003B206F +:10003600FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10004600FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10005600FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10006600FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:08007600FFFFFFFFFFFFFFFF8A +:02007E00FFFF82 +:040080007E000000FE +:01008400007B +:0A008500CC23BAC37D94FE73A5E6F8 +:01008F00FF71 +:1000900000080000000A000300000000000000004B +:0600A0000002070E15002E +:1000A6000028333940464C52565A5F646A6F747959 +:1000B6007E83898F94999DA1A5A8ABAEB1B4B7BA3A +:1000C6006352431F006352442E1B4D34210B0052D2 +:1000D600372A1E1B4E3E3020004E3E3020100000B8 +:0A00E60000FFFFFFFFFFFF00000016 +:1000F00061D0EE1C1EFE9A33051000000300FC16B2 +:100100001FFEA3C0A100BB8BFD169000148CFCC683 +:10011000EAA600AD0687958684FAF41602FCC6EAC4 +:100120008CFCAD06A1009786FAF416800014A2FCA0 +:10013000C6EA8000AD0687958684FAF416A2FCC64E +:10014000EAA2FCAD06A1009786FAF49A5001FAFEE5 +:100150009A7D0CA1059E2EFCA1009E60FCA1209E14 +:1001600063FC9A540A9A7E12311384231B84AC8454 +:10017000059A8102FA1931038412148CFC85419589 +:100180004D038D0BA100959AFA0AFA039A97019AEA +:1001900033027110FACFAF9ACD039A5E048C001926 +:1001A0001492FC854D00AD11A100958E16FC9E6346 +:1001B000FC9A22139A290FFA25310300211492FC8C +:1001C0008551AD1AA101958E63FC9E16FCA1009E7F +:1001D00063FC9A22139AC8049A7C0F9A820F8E6F3E +:1001E000FC4D00BD14148EFC8541954814FC8D0611 +:1001F000A100959A560D9A820D1490FC8541954860 +:1002000091FC8D06A100959A9D0F148FFC85419558 +:100210004815FC8D06A100959AB702148CFC854107 +:1002200095488DFC8D06A100959A840631230C0219 +:100230001B0CAF314384054B849A69063153840506 +:100240005B849AE712AC0C0D8E63FC310E0A8E2E85 +:10025000FC4D00BD039AC804316384056B849A2267 +:1002600013317384099A290F4252BD027B843103F2 +:1002700085050B859A540A311385051B859A7110E3 +:10028000AFAC010B3103032EBC012B3A84FA279A41 +:100290003E059AD61131338409A1009E6AFC4A8436 +:1002A000FA039A85059A67159ABF159A82129A548D +:1002B0000A9A55212A84AF310303039B4503310376 +:1002C00000039BCC03A1009E18FC9E17FCCC010EE2 +:1002D0008E1AFC41AD0D141AFC854195FA05A1005A +:1002E0009E1AFCBC010E8E19FC41AD0D1419FC8543 +:1002F0004195FA05A1009E19FCCC011F3133011B69 +:100300008E1AFC4D05BD039AC6128E1AFC4D288D1F +:10031000319AC612A1209E15FCFA273143011EBC5A +:10032000011B8E19FC4D05BD039AD6128E19FC4D8A +:10033000288D0F9AD612A1209E15FCFA05A1029EC7 +:1003400015FC9BCC038C0018CC010E8E18FC41AD23 +:10035000141418FC854195FA0CA1009E18FCFA05AE +:10036000A1009E18FCA1009E1AFC9E19FCBC010E67 +:100370008E17FC41AD0D1417FC854195FA05A100BF +:100380009E17FCCC011F3133011B8E18FC4D05BD9F +:10039000039A99058E18FC4D288D319A9905A12054 +:1003A0009E15FCFA273143011EBC011B8E17FC4D24 +:1003B00005BD039AF8058E17FC4D288D0F9AF80598 +:1003C000A1209E15FCFA05A1029E15FCAF9C0261BE +:1003D0008E1BFC41AD06141BFC8541958E93FC4D94 +:1003E00000BD248E1BFC4878FC8D1CA1019E93FC53 +:1003F0008E63FC310F671461FC856D08950B0C71E1 +:100400000B2C710A2CFA568E93FC51BD508E1BFC9E +:100410004879FC8D48A1029E93FC8E63FC310F3D10 +:100420001461FC856D02950B0C710B2C710A2CFA72 +:100430002C8E93FC51BD1E8E63FC310F111461FC98 +:10044000856D01950B0C710B2C710A2CFA07146247 +:10045000FC856D0195A1009E1BFC9E93FCAF8E62F6 +:10046000FC311F02FA0B8E62FC310F05712B212B20 +:1004700001AC014E8E1CFC4D029D08141CFC8541F4 +:1004800095FA44A1009E61FC9E62FC9E67FC9A293D +:100490000FA1009E63FCA1079E65FC9A540A6A8422 +:1004A000146FFC854D00AD06A100959A7110A10056 +:1004B0009E98FC710A2C712A217A1EA1039E93FC3E +:1004C000FA05A1009E1CFCAFB7312385450286FCCE +:1004D00012D604B33198146BFCB5027EFC12E5040D +:1004E000B3B1A001AFB062764D00AD1B0284FC1227 +:1004F000F504B33198146BFCB5027EFC120405B30D +:10050000B1A001AFB062760288FC121005B3319839 +:100510002B85B6AF9A3C0C9A290C9A420C9A14215E +:100520009A070C9A670C9AF90C9A260D9ACF0C9A96 +:100530008E0CAF7B1E13F0049A14057A1EAFA12116 +:100540009E5EFCA1009E63FCA1079E65FCA1109E1F +:1005500078FCA1649E79FCAFB7B1B1891CD6A1002B +:10056000BE01AE014D20AD1772B716A600AAB6495E +:1005700002BD05AE0172FA09AE0141BE01FAE3A265 +:1005800017B0B0B6AFA000B1A0509AC910B0327089 +:10059000329A5805629E6AFCAF1461FC856D4095E5 +:1005A0008E63FC310F080B0C710B2C710A2C8E6AB8 +:1005B000FC4D1FAD428E63FC317E29A101486AFCCF +:1005C0008D09146AFC850D0295FA1FA104486AFC86 +:1005D0008D09146AFC850D0495FA0F146AFC850DCB +:1005E0000595FA06146AFC854195A11F486AFC9D91 +:1005F000039E6AFC9A6906AF1461FC856D40958E76 +:1006000063FC310F080B0C710B2C710A2C8E6AFCE9 +:100610004D00AD548E63FC317E398E6AFC4D0B8DDE +:1006200009146AFC851D0595FA2F8E6AFC4D068D0E +:1006300009146AFC851D0495FA1F8E6AFC4D05BDE0 +:1006400009146AFC851D0395FA0F146AFC851D04C4 +:1006500095FA06146AFC855195A17F486AFC9D05B0 +:10066000A1009E6AFC9A6906AFB78E6AFC5D1F7294 +:10067000B716A600AAB676B7A000B1A0509A4A1144 +:10068000B0B0B6AFB78E2EFC9E2FFC023EFC0340EE +:10069000FC023CFC033EFC023AFC033CFC0238FC3E +:1006A000033AFC0236FC0338FC0234FC0336FC023D +:1006B00032FC0334FC0230FC3061013027D20232BC +:1006C000FC30081EFC30281FFCCA05006143BD0336 +:1006D0003061429D280230FC3061013027D2023265 +:1006E000FC30081EFC30281FFCDA0500614BBD03FE +:1006F00030614A9D080230FC0332FCFA130230FCE0 +:1007000030081EFC30281FFC21253025300332FC28 +:10071000021EFC0330FC0240FC30083EFC30283F47 +:10072000FC30083CFC30283DFC30083AFC30283BCB +:10073000FC300838FC302839FC300836FC302837CB +:10074000FC300834FC302835FC300832FC302833CB +:10075000FCA20831820320FC8C000DA1009E42FC0B +:10076000A0000344FC9B3C081442FC85419551BD0C +:10077000039B3C088E42FC4D02AD039B12080240D5 +:10078000FC0346FC023EFC4847FCBD04304846FCE6 +:100790009D06023EFC0346FC023CFC4847FCBD04AF +:1007A000304846FC9D06023CFC0346FC023AFC48ED +:1007B00047FCBD04304846FC9D06023AFC0346FC5B +:1007C0000238FC4847FCBD04304846FC9D06023810 +:1007D000FC0346FC0236FC4847FCBD04304846FC9E +:1007E0009D060236FC0346FC0234FC4847FCBD046F +:1007F000304846FC9D060234FC0346FC0232FC48AD +:1008000047FCBD04304846FC9D320232FC0346FCE6 +:10081000FA2A8E42FC4D7F9D1D0220FC301846FCBA +:10082000303847FC0344FCEA00808D10AD0E100008 +:10083000000344FCFA061442FC8551950220FC306A +:100840001844FC303845FC4825FCBD04304824FCE5 +:100850008D06AD04A605FA720220FC301844FC3067 +:100860003845FC4827FCBD04304826FC8D06AD0405 +:10087000A604FA560220FC301844FC303845FC48E7 +:1008800029FCBD04304828FC8D06AD04A603FA3AC5 +:100890000220FC301844FC303845FC482BFCBD04D9 +:1008A00030482AFC8D06AD04A602FA1E0220FC3058 +:1008B0001844FC303845FC482DFCBD0430482CFC65 +:1008C0008D06AD04A601FA02A6008E48FC614EAD6D +:1008D0000BA1009E49FC669E48FCFA5C1449FC850D +:1008E00041958E94FC4D1E9D181494FC854195A154 +:1008F0000A4849FC9D42A1009E49FC669E2EFCFAD6 +:1009000037A1194849FC9D30A1009E49FCBC031C3D +:100910008E2EFC614E9D06142EFC85419566482E58 +:10092000FCAD154D00BD119E2EFCFA0C66482EFC48 +:100930009D06142EFC8551958E2EFC4D00AD2C4D40 +:1009400005AD214D04AD164D03AD0B4D02BD23A1E8 +:10095000039E64FCFA21A1079E64FCFA1AA10B9E77 +:1009600064FCFA13A10F9E64FCFA0CA1009E64FCC7 +:10097000FA05A1019E64FC9A82099AB4099A110CA5 +:10098000B6AFA102482FFC9D11482EFC8D0CA01083 +:10099000B170B1A0829A4A11B0B0A103482FFC8D6A +:1009A00012482EFC9D0DA000B1A002B1A0829A4A6F +:1009B00011B0B0AF8E2EFC51BD201495FC854D00BA +:1009C000BD18A102951461FC856D20958E63FC31E4 +:1009D0000F080B0C710B2C710A2C8E63FC311F4914 +:1009E0008E2EFC4D00BD421495FC854D00BD1AA114 +:1009F00003951461FC856D30958E63FC310F2A0BD5 +:100A00000C710B2C710A2CFA201495FC854D02BD3B +:100A100018A103951461FC856D10958E63FC310F50 +:100A2000080B0C710B2C710A2C8E2EFC4D018D0EB7 +:100A30001461FC855DEF951495FC855DFE958E2E09 +:100A4000FC4D028D0E1461FC855DCF951495FC85DF +:100A50005DFC95AFB7B1B1891CD68E63FC311F2CFC +:100A60008E60FC4D00BD0A10CB00BE0330BE02FA02 +:100A7000458E60FC4D30BD0A10DF00BE0330BE0263 +:100A8000FA3410D500BE0330BE02FA2A8E60FC4D47 +:100A900000BD0A10C600BE0330BE02FA198E60FC0B +:100AA0004D30BD0A10DA00BE0330BE02FA0810D085 +:100AB00000BE0330BE02A100BE01AE014D05AD3641 +:100AC0008E22FCA000300D02D2AE0230AE03D485DF +:100AD00061029D0143AE01A0023188CA24FCD462A8 +:100AE00095638495AE0230AE0380BE0330BE02AE85 +:100AF0000141BE01FAC4B0B0B6AFB78E97FC4D014C +:100B0000AD1E4D00BD409A51219A1F0D9A4C0D9A71 +:100B1000F20C7A015A016A01A1019E97FC9BD80B45 +:100B20008E60FC4D30BD05A1029E97FC3103001381 +:100B30007B015A016B01A1079E65FC9A2213A10259 +:100B40009E97FC9BD80B021EFC5D00309E22FC8E03 +:100B500060FC4D30BD071422FC851D19958E22FCCA +:100B60004D809D55484FFCAD503123014C0286FC11 +:100B700012760BB331981422FCB5027EFC12850B61 +:100B8000B3B1A000AFB062764D00AD240280FC127C +:100B9000950BB331980284FC129E0BB3319814224A +:100BA000FCB5027EFC12AD0BB3B1A001AFB0627612 +:100BB0000288FC12B90BB331988E22FC9E4FFC8E3A +:100BC00060FC4D30BD0F1496FC8541954D058D059B +:100BD000AD0313995A9A110CB6AFB1B3B589B8B138 +:100BE00089BAB189BCB189BEB17A1E8908A24031E7 +:100BF00082031EFC9A1F0CB099BEB099BCB099BA82 +:100C0000B099B8B4B2B08F132F03132890132903EF +:100C1000AF710A2800000000717A28710BE6AF71ED +:100C20000AE6717B28710B28AF139F00717AA271BD +:100C30000BA013A10013FB00711BA0AFB7F4AC769F +:100C4000B6AF110000110100110200110300110CD8 +:100C50000013311B13200113211F13220A13230F2A +:100C6000132C0513480CAF717B43713AE6713BE2DC +:100C7000713AEA138C0613419B134300AF713BE6B4 +:100C8000717A43AF717B43713AE6713BE2AF13BABD +:100C900000716AE5717AE5716BE1717BE113BB026A +:100CA00013BC0013BD16710ABD713BBDEE1250C3DB +:100CB000EE14A861AF13BD16710ABD713BBD13BA26 +:100CC0000CAF13BD16710BBD713BBD13BA00AF71F4 +:100CD0007B6B715AE5715BE1136A03F4215D7FF66A +:100CE00021D8017F11177F136B40AF710A6B717AA6 +:100CF0006BAF717B6B710B6BAF717B69714AE57187 +:100D00004BE11369281118FF111900F4215DDFF67A +:100D100021D801DFAF111900710A69717A69AF71C9 +:100D20007B69710B69AF717B6C713AE5713BE113C3 +:100D30006C18111AFF111B00F4215DBFF621D801B8 +:100D4000BFAF111B00710A6C717A6CAF717B6C7153 +:100D50000B6CAF1A848F31230C12717B6C710B6C8E +:100D60006B01717B69710B695B01FA158C000AA13B +:100D70001E9E14FC9A180EFA08A1A09E14FC9AB8A4 +:100D80000EAF310300108E9BFC4D019D09149BFC9E +:100D90008541959B170EA1009E9BFCF01B4851FCC2 +:100DA000AD11F01B4851FC9D04A101FA02A1FF0EF8 +:100DB0001BF21BC81B00BD0A717B6C710B6C6B01B5 +:100DC000FA17C81BFFBD0A6A01717B6C710B6CFAC4 +:100DD000086B01710A6C717A6CF0194852FCAD1104 +:100DE000F0194852FC9D04A101FA02A1FF0E19F26C +:100DF00019C81900BD0A717B69710B695B01FA178B +:100E0000C819FFBD0A5A01717B69710B69FA085B49 +:100E100001710A69717A69AFB7A1009E53FC8E2EE9 +:100E2000FC4D028D4DA104186BFC728E2EFC73B725 +:100E300016E400ABB65242AD0421258AFC9E51FC5B +:100E4000A104186BFC728E2EFC73B716EA00ABB6C9 +:100E50005242AD0421258AFC9E52FC3133850C3B65 +:100E6000858E51FCF21B8E52FCF219A1009E54FC9F +:100E7000FA44A1009E51FCF21B8E54FC4D00BD1A99 +:100E8000A104186BFC728EEA005242AD0421258A3F +:100E9000FCF219F0199E52FCFA0F8E54FC4D02BD63 +:100EA00008111900A1009E52FC1454FC8541954D77 +:100EB00004BD03A10095B6AF8E53FC4D10AD3F4D60 +:100EC0000CAD3B4D08AD374D04AD334D00AD2F4D4E +:100ED0000EAD0C4D0AAD084D06AD044D02BD3CA152 +:100EE00002482EFC9D0CA1289E51FCA1009E52FCA4 +:100EF000FA29A1009E51FCA1289E52FCFA1DA102D4 +:100F0000482EFC9D0CA1059E51FCA1009E52FCFAAE +:100F10000AA1009E51FCA1059E52FC1453FC854180 +:100F2000954D12BD03A10095AF8E67FC5D034D0288 +:100F3000AD234D03AD044D00BD248914D289106149 +:100F40004BBD0330614A9D091B009AC20CA200FAF6 +:100F50002AA201FA261B009AB50CA200FA1D8914D8 +:100F6000D28910614BBD0330614A9D043126BA0914 +:100F70001A009AC20CA200FA02A201AF1B009AC288 +:100F80000CAF8E66FC310F087B0111170A9AEB0C2F +:100F9000AF8E66FC310F059AF20C7B01AF8E66FCBA +:100FA000310E0D9AF20C7B01A1009E98FC9B7010F3 +:100FB000310300039B70103136E0043147E00BA190 +:100FC000029E98FC713BE0714BE08E9AFC4D00ADA7 +:100FD0000D149AFC855195A1009E98FCFA5C8E98A0 +:100FE000FC4D00AD558E55FC4D05AD074D03AD03D1 +:100FF00051BD077B019AF20CFA2B8E6BFC4D04BDA0 +:10100000077A019AF20CFA1DA104186BFC61617257 +:1010100010FF00AD0861FC253025308AF860F2171A +:101020009AEB0C7B011455FC8541954D20BD41A1E7 +:1010300000951498FC855195FA36A1009E55FC8EBA +:1010400066FC310F2B8E6BFC4D04BD077A019AF2C2 +:101050000CFA1DA104186BFC61617210FF00AD0851 +:1010600061FC253025308AF860F2179AEB0C7B0181 +:10107000AFB78E6FFC5D03BD1E8E2EFC7216E400B2 +:10108000AA9E51FC8E2EFC7216EA00AA9E52FC11FA +:101090001B7F11197FFA308E6FFC310F0A5A0171D4 +:1010A0007B69710B69FA08717B69710B695B018E51 +:1010B0006FFC311F0A6A01717B6C710B6CFA08714D +:1010C0007B6C710B6C6B01B6AFB7B1B1891CD6717B +:1010D0001A21710A211B01711B210B01710B21AE19 +:1010E00002709A0812AE08709A0812711A21710AD9 +:1010F000211B01711B210B01710B21AE026D0170CF +:101100009A0812711A21A100BE01AE014D08AD1B53 +:1011100087610197710A2131130104876D01970BD3 +:1011200001710B21AE0141BE01FADF711A21710A72 +:1011300021710A210B01710B211B01711B21710A05 +:1011400021711A218772B0B0B6AFB7B1891CD671C0 +:101150001A21710A211B01711B210B01710B2187BF +:10116000709A0812AE06709A0812AE08709A0812A9 +:101170001B01711B21710A21711A21B0B6AFB7B1E1 +:10118000B1891CD6711A21710A211B01711B210B17 +:1011900001710B21AE02709A0812AE08709A081203 +:1011A000A100BE01AE01490C9D1DAE0A30AE0BD4AC +:1011B00085709A0812AE0A30AE0B80BE0B30BE0AA4 +:1011C000AE0141BE01FADD1B01711B21710A2171C3 +:1011D0001A21B0B0B6AFB7A613664D00AD28711A8C +:1011E00021710A21711A2131130110711B211B0178 +:1011F000711B21710A21711A21FA0B711B210B013C +:10120000710B2156FAD3B6AFB7B1B1B1891CD6A1D3 +:1012100000BE03AE034D08AD27AE04317F05711A41 +:1012200021FA051B01711B21710A21710A210B0191 +:10123000710B21AE046101BE04AE0341BE03FAD3BB +:10124000711A21710A21A100BE01BE028C011AAEE1 +:101250000130AE0280BE0230BE0130EA10278DECB4 +:10126000ADEA0B01710B21FA10311301070B01716B +:101270000B21FA050B01710B21B0B0B0B6AF139979 +:10128000ACAFB79AD611A000B1A0829AC910B062D3 +:10129000765D1C26265DFC72665D03616A9E5FFCBE +:1012A000665DE021259E60FC9A22138E6BFC72B76E +:1012B000169CFCAAB69E5CFC70B1A003B1A0829AF9 +:1012C0004A11B0B0B6AF8E6BFC41AD06146BFC8515 +:1012D00041959AE712AF8E6BFC4D00AD06146BFC86 +:1012E0008551959AE712AFB7A104486BFC9D039E08 +:1012F0006BFC8E6BFC72B7169CFCAAB6768E5CFCFF +:10130000614EAD1C669E5CFCB7A003B1A0829A4AF8 +:1013100011B0B02A853A859A560D9A820D9A9D0F82 +:10132000B6AFB78E60FC4D30AD29310300258E6518 +:10133000FC5D0124245DC0728E65FC5D02262626BC +:10134000265DF061628E65FC5D0426265DFC616AA7 +:1013500076FA02A6008E63FC310F06A1066166FADA +:1013600004A1026166B7A001B1A0829A4A11B0B08F +:10137000B6AFB7B1891CD68730AE06D6A11B614E79 +:101380009D039B4B14664D128D0CC6A100CA5EFCDA +:10139000D467959B4B14664D0A8D6A4D11AD5C4D1B +:1013A0000EAD4A4D0DAD3E4D0CAD304D0BAD184D53 +:1013B0000ABD50679E68FC67310E04A100FA02A1C5 +:1013C0000125712922FA3C679E69FC67310E04A150 +:1013D00000FA02A10125712102FA28675D1F9E6AA9 +:1013E000FC4A84FA1E679E6BFC5A84FA5E679E6C08 +:1013F000FC675D0151BD540A84FA50679E6FFC1A68 +:1014000085FA48FA46664D09AD3B4D08AD224D05BB +:10141000AD144D07AD0A4D04BD31679E62FCFA2B39 +:10142000679E65FCFA25679E63FC6A840A85FA1B41 +:10143000679E66FC67314E041B0CFA0F1A0CA11450 +:101440009E9AFCFA06679E67FC7A84B0B6AFB7D660 +:10145000A100CA5EFCD4859E7AFC664DFFAD2A4D84 +:101460000BAD1B4D06AD0B4D03BD23A1009E61FCD2 +:10147000FA1CBC0319147AFC856D8095FA10A10042 +:10148000712402279E7AFCFA05A15A9E7AFC8E7A74 +:10149000FC72B6AFB7D6665DF09E7BFC665D0F9EB4 +:1014A0007CFCA180487BFC9D05A2FF9B65158E7B83 +:1014B000FC4D50BD05A2FF9B6515A130487BFC8DFE +:1014C00051A110487BFC8D238E7BFC4D10BD0FA1DC +:1014D00002487CFC8D3A41087CFC729B6515A10298 +:1014E000487CFC8D2B8E7CFC72FA7A8E7BFC4D2026 +:1014F000BD0FA101487CFC8D17A106087CFC72FA87 +:1015000064A103487CFC8D5BA108087CFC72FA5541 +:10151000FA51A160487BFC8D258E7BFC4D60BD0F90 +:10152000A103487CFC8D3CA10E087CFC72FA36A11C +:1015300001487CFC8D2DA10C087CFC72FA278E7B67 +:10154000FC4D70BD0FA107487CFC8D17A112087CD3 +:10155000FC72FA11A101487CFC8D08A11A087CFCE0 +:1015600072FA02A2FFB6AFA001B1A0509AC910B0A2 +:1015700062317E299A0020109D16037EFC10B5165C +:101580000380FC1089160382FC10B1160384FC1042 +:1015900025160386FC1033160388FCFA2110621608 +:1015A000037EFC1082160380FC1045160382FC109B +:1015B00082160384FC1081160386FC0388FCAFB7F7 +:1015C000B1891CD6C680B10282FC12D215B3B1A07B +:1015D00000AFB0629E8AFC4D00BD0CAE019E22FCA5 +:1015E000A1019E6DFCFA0AA1509E22FCA1E09E6D15 +:1015F000FC8E22FC9E6EFCC680B10282FC12051697 +:10160000B3B1A001AFB0629E8AFC4D00BD0FAE0128 +:101610004D0461FE8D02BD059E6BFCFA05A1039E83 +:101620006BFCB0B6AF7B1E9A51219A840C9A1F0CAA +:101630000A02AF0B029A55219A7D0C9A110C7A1E60 +:10164000AF9AB916AFB7B1891CD6870D0270B1A099 +:10165000509AC910B0AE0630AE07D46295A200B061 +:10166000B6AFB7B1891CD6AE0630AE07D48570B11F +:10167000870D0270B1A0509A4A11B0B0A200B0B666 +:05168000AFAFA200AFB6 +:101685009ABD16AFB7B1891CD6AE0630AE07D4AE3B +:1016950000309AE517B0B6AFB7B1891CD6AE0630A3 +:1016A500AE07D4AE00309A3918B0B6AF9A1F19AF4D +:0816B5009A341BAF9AC21BAF6F +:1016BD00B7B5B19A111F4D00AD05A2F49BDE179A77 +:1016CD00A41FA1FF9EB0FCA1009EB1FC9EB9FC8E93 +:1016DD00B1FC9A341ED69A421E4D00AD5B9A7B1E0C +:1016ED004DFFAD0F8EB0FC4DFFBD088EB1FC9EB011 +:1016FD00FCFA459A621D9A721D4D00AD039BCA17E7 +:10170D00A1019EBAFC8EB1FC728EA7FC308EA8FC96 +:10171D00610A309A861D4D00AD1B8EBAFC519EBAE2 +:10172D00FCBDE2A1019EB9FC8EB1FC9A111D4D00CC +:10173D00AD039BD1179A6A1D9AA41F8EB1FC414827 +:10174D00ABFC9D059EB1FCFA868EB0FC4DFFBD62D3 +:10175D00A1009EB1FC8EB1FC9A341ED69AB41E4DDA +:10176D0000BD41B702A4FCD6A155978697869786F2 +:10177D0097B69A621D9A721D4D00BD41C6D48EA7B3 +:10178D00FCA3039AC51D4D00BD059A6A1DFA238E53 +:10179D00B1FC9A111D4D00BD2B9A6A1D9AA41FA173 +:1017AD00019EB9FC8EB1FC4148ABFC9D229EB1FC63 +:1017BD00FAA38EB9FC4D00BD12A200FA149A6A1D4F +:1017CD00A2FEFA0D9A6A1DA2FDFA06A201FA02A264 +:1017DD00FB9AA41FB0B4B6AFB7B5B1891CD69A9712 +:1017ED001F4D00AD04A2F3FA3F9A091C4DFFAD3613 +:1017FD003087309AC21CEA0000AD2780D2AE02308D +:10180D00AE03D4C2D6A2006248A9FC9D0787958677 +:10181D008442FAF3665D034D03BD03948795A200E0 +:10182D00FA06A2F7FA02A2FAB0B4B6AFB7B5B1890B +:10183D001CD69A971F4D00AD05A2F39B1B199A0953 +:10184D001C4DFFBD039B06199EB0FC02A4FC300885 +:10185D00ADFC302D00D4A1FF95949594959495876A +:10186D0072B702A4FCD66297B6AE0230AE03D402B4 +:10187D00A4FCD686A20085978684426248A9FC8D79 +:10188D00F502A4FC3008ADFC302D00DA0100D6873E +:10189D00A00030978630978EB0FC9A341E3008AE7B +:1018AD00FC3028AFFC03B4FCA1019EBAFC8EB0FC49 +:1018BD009A751C03B6FC9A621D9A721D4D00BD3DB2 +:1018CD0002B6FC48B5FC8D073048B4FC9D3330D4CE +:1018DD008EADFC738EA7FC9AC51D4D00AD2B4D1E14 +:1018ED00AD098EBAFC51AD1D9EBAFCC43008ADFCDD +:1018FD00302D008003B6FCFAC7A2FAFA11A2FEFA47 +:10190D000AA2F5FA06A2F6FA02A2009A6A1DB0B46E +:10191D00B6AFB7B5B19AA41F9A971F4D00AD05A2EA +:10192D00F39B2D1BA1009EB9FC9A091C4DFFBD0315 +:10193D009B161B9EB0FC8EB0FC9EB1FC9A341E0310 +:10194D00B2FC8EB1FC4148ABFC8D02A10048B0FC4D +:10195D00BD039B1E1B9EB1FC9A341E03B4FCD69A8C +:10196D00421E4D00ADDC8EA6FC310F509A621D9AC1 +:10197D00721D4D00AD039B1A1BA1019EBAFC8EB1C9 +:10198D00FC728EA7FC308EA8FC610A309A861D4D24 +:10199D0000AD238EBAFC519EBAFCBDE28EB1FC9A0D +:1019AD00111D4D00AD039B261BA1019EB9FC9A6A2A +:1019BD001D9AA41FFA8C9A6A1D9AA41F02B4FCD614 +:1019CD009AB41E4D00AD039B4F1902B4FCCA08001A +:1019DD0003B6FCA1009EBAFC8EAAFC41308EBAFC67 +:1019ED0061488D039BA81A308EB0FC9AC21CEA0088 +:1019FD0000BD039B9B1AD602A4FCD4A2008795863A +:101A0D00846248ADFC9D0342FAF39A621D9A721DE1 +:101A1D004D00AD039B1A1BA1019EBBFC02B6FCD46D +:101A2D003008ADFC302D005DFC7094655DFC6148A7 +:101A3D0084AD2602A4FCD6A15597869786978697E6 +:101A4D0002B4FCCA0400D4A3038EA7FC9AC51D4D95 +:101A5D0000BD719A6A1D9B4F198EADFC738EA7FC4C +:101A6D009AC51D4D00AD184D1EAD098EBBFC519E86 +:101A7D00BBFCAD50C43008ADFC302D0080FAA0C4C5 +:101A8D003008ADFC302D008003B6FC9A6A1D8EBA6D +:101A9D00FC419EBAFC9AA41F9BE5199A621D9A728D +:101AAD001D4D00AD02FA6602A4FCD6A1559786978E +:101ABD008697869702B4FCD4A3038EA7FC9AC51D06 +:101ACD004D00AD188EB1FC9A111D4D00BD4B9AA461 +:101ADD001FA1019EB9FC9A6A1D9B4F1902B2FCCA47 +:101AED000400D48EA7FCA3039AC51D4D00AD0F8E27 +:101AFD00B0FC9A111D4D00BD20A1019EB9FC8EB9FF +:101B0D00FC4D00BD10A200FA14A2FAFA13A2FEFABF +:101B1D000CA2F8FA0BA201FA04A2FDFA009A6A1DB2 +:101B2D009AA41FB0B4B6AFB7B5B19A971F4D00AD1B +:101B3D0004A2F3FA7C9A091C4DFFAD649EB0FC73B0 +:101B4D00634D00BD048EABFC73538EB0FC614BAD89 +:101B5D0057639A341ED69A421E4D00ADE3639EB173 +:101B6D00FC9A621D9A721D4D00BD39A1019EBAFCF1 +:101B7D008EB1FC728EA7FC308EA8FC610A309A865D +:101B8D001D4D00AD278EBAFC519EBAFCBDE28EB143 +:101B9D00FC9A111D4D00AD04A2FDFA12A2FCFA0E25 +:101BAD00A2FAFA0DA2FEFA06A2F9FA05A2009A6AA5 +:101BBD001DB0B4B6AFB7B5B19A971F4D00BD379AEA +:101BCD00091C4DFFAD30729A341ED6629A751CD425 +:101BDD00C63008AEFC3028AFFC30611C30613DD6FC +:101BED00A0008EADFC3080D4C6A20030611C3061E7 +:101BFD003D8D0542FAF5A2FFB0B4B6AFB7A60066AB +:101C0D0048ABFC9D5F9A341E03BCFC66A700674D74 +:101C1D00089D167202BCFCB7D6AAB6726773B702DE +:101C2D00A4FCD662BBB647FAE5B702A4FCD6AE005B +:101C3D0030AE01EA5555BD288686AE0030AE01EABC +:101C4D005555BD1C8686AE0030AE01EAFFFFBD10B6 +:101C5D008686AE0030AE01EAFFFFBD04B666FA0619 +:101C6D00B646FA9BA1FFB6AFB79A341ED43008AE74 +:101C7D00FC3008AFFCD603BCFCC4CA0800D4C63087 +:101C8D0018ADFC303D0090D6614D8D24BD05306101 +:101C9D004C8D1DB58EADFCA0003090D4C630610CBE +:101CAD0030612DD485B44DFFBD06C603BCFCFACE04 +:101CBD0002BCFCB6AFB73073309A341ED43008AEC8 +:101CCD00FC3008AFFCD6C4CA0800D4C63018ADFC31 +:101CDD00303D0090D6614D8D26BD0530614C8D1F78 +:101CED00B58EADFCA0003090D4C630610C30612DA6 +:101CFD00D485B44D00BDD487614BBDCFC6FA03105A +:101D0D000000B6AFB79A341ED402A4FCD6A100BE13 +:101D1D0000BE01BE02BE03A701A601A3048EA7FC4F +:101D2D009A001E4D00BD04A700FA0356BDEDC4CAAE +:101D3D000400D4A601A3048EA7FC9A001E4D00BD7D +:101D4D0004A700FA0356BDED674D00AD04A1FFFADF +:101D5D0002A100B6AF7B1E9A00227A1EAF7B1E9A9F +:101D6D000D227A1EAF02A2FC9A1A229A32234D003E +:101D7D00AD04A1FFFA02A100AFB7D69AA41FC630D9 +:101D8D0073307B1E9A8A227A1E4D1BBD189AA41F92 +:101D9D00C63073307B1E9A2C227A1E4D00ADDC4D61 +:101DAD001FADD8FA084D00AD084D1FADCEA1FFFAFD +:101DBD0002A1009AA41FB6AFB79EC0FCC403BEFC1F +:101DCD006324245D3F41739AA41F02A4FCD610BE68 +:101DDD00FC7B1E9A3E237A1E4D00AD104D1FADE0CB +:101DED004D1EAD04A1FFFA06A11EFA02A1009AA490 +:101DFD001FB6AFB79EC0FCC403BEFC635124245D67 +:101E0D003F41739AA41F02A4FCD610BEFC7B1E9A00 +:101E1D0045227A1E4D00AD084D1FADDFA1FFFACE54 +:101E2D00A1009AA41FB6AFB7728EA8FC610AA000DC +:101E3D00212727B6AFB7AE004D00BD12AE014D0044 +:101E4D00BD0CAE024D00BD06AE034D00AD1CAE0483 +:101E5D004D00BD12AE054D00BD0CAE064D00BD06CC +:101E6D00AE074D00AD04A1FFFA02A100B6AFB7AEAB +:101E7D00004D55BD2EAE014D55BD28AE024D55BD83 +:101E8D0022AE034D55BD1CAE044DFFBD16AE054D26 +:101E9D00FFBD10AE064DFFBD0AAE074DFFBD04A13F +:101EAD0000FA02A1FFB6AFB7AE004DFFBD2EAE01D9 +:101EBD004DFFBD28AE024DFFBD22AE034DFFBD1C33 +:101ECD00AE044DFFBD16AE054DFFBD10AE064DFF68 +:101EDD00BD0AAE074DFFBD04A100FA02A1FFB6AFCA +:101EED00D6AE054D069D1AAE064D399D14AE074D65 +:101EFD00018D0E4DFF9D0AAE084DFE9D04A100FA09 +:101F0D0002A1FFAFB110B0FCD6DAA2FCA1009697EA +:101F1D0050BDFBB0D69AED1E4DFFAD6DAE0030AE8F +:101F2D000103A2FC8686AE0030AE0103A4FC8686BA +:101F3D00879EA6FC86879EA7FC86879EA8FCA1048B +:101F4D009EABFC86879EA9FC86879EAAFC8EA9FC6B +:101F5D0041A00030A204318240A1043188D49030D8 +:101F6D009EADFC100800A200D630610C30612DEA48 +:101F7D0001049D0342FAF1C603AEFC629EACFC8ED9 +:101F8D00A6FC61FA9EA6FCA100AF8EA6FC317F04D3 +:101F9D00A100FA02A1FFAFB18EA6FC311F04A1ACC6 +:041FAD00F699B0AF42 +:101FB100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:101FC100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:101FD100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:101FE100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:0F1FF100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:102000001020FE0302FC100CFC0304FCA1009E0641 +:10201000FC9E07FCA10C9E08FCA1019E09FC419EB0 +:102020000AFC0A027B1E1002FC9A85169AB9164217 +:1020300052BD039AB1167A1E0B02AFB1B3B589B87F +:10204000B189BAB189BCB189BEB1B7715AA631465E +:10205000AA06716AA69B0321A6003106E30946661B +:102060004D00BDF69B03213107AA06716AA69B03AA +:1020700021715AA6710BE3F4A5709A9414629E59CB +:10208000FCA6003117AA0D8E59FC709A4E14629E60 +:102090005BFCFA2A3107E314716AA6710BE3F4A51D +:1020A00070B18E59FC709A7213B0FA5746664D00A3 +:1020B000AD513107AACD716AA6710BE3FA45A600AE +:1020C0003106E30846664D00BDF6FA373107AA052A +:1020D000716AA6FA2E710BE33146AA05716AA6FA57 +:1020E000228E5BFCF6A5A6003106E30846664D008D +:1020F000BDF6FA0F3107AA05716AA6FA06710BE35D +:10210000716AA6B6B099BEB099BCB099BAB099B888 +:10211000B4B2B08F717BA6710AE7710BE3710BEB60 +:10212000F4265DFEF626D806FEF4265DFDF626D8DA +:1021300006FD13A80813A90013A74A711AAB710A68 +:10214000AB714BA6713AA6712AA6710BE7717AA6FC +:10215000AF717BA6AFA1009E56FC717AA6716AA6EC +:01216000AFCF +:10216100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10217100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10218100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10219100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:1021A100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:1021B100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:1021C100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:1021D100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:1021E100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:0F21F100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:1022000013C0A513C40113C4FE13C401AF13C0A5AA +:1022100013C40013C4FF13C400AF22B161F8B6A207 +:10222000009A0081A109BE13BE1423AF9A6A23ADA0 +:102230001122B161F8B0BE03A2039A008123F0E33A +:10224000FA02A105AFB59A8923AD2222B1B3B761D5 +:10225000F8B0BE0560BE04B0BE0360BE00B0BE02F2 +:1022600060BE01A2049A008123F0E3FA02A105B442 +:10227000AF9A6A23AD1122B161F8B0BE03A2069AEB +:10228000008123F0E3FA02A105AF9A6A23AD11227F +:10229000B161F8B0BE03A2089A008123F0E3FA020C +:1022A000A105AFB5D6C2D4AE004D05BD1870AE02C3 +:1022B00073AE019A6A23AD153022B5B161F8B03022 +:1022C000BE0060FA124D03AD084D04AD04A105FA3D +:1022D0004722B5B161F8B0BE03B0BE0560BE04A22E +:1022E000099A0081234D05BD2D634D00AD28324D67 +:1022F000208D234D309D1F62E4D6AE0170AE02E406 +:10230000BE02A0002626262626273027E430611CA0 +:1023100030613D60BE01F0E3B4AFB12261F8891CC9 +:10232000CA0200BE0560BE04A20A9A008123B0F072 +:10233000E3AF2261F8A20E9A008123F0E3AFB59AD1 +:102340008923AD2222B1B3B761F8B0BE0560BE04E7 +:10235000B0BE0360BE00B0BE0260BE01A2179A000C +:102360008123F0E3FA02A105B4AF334D208D174D60 +:10237000309D1333724D069D0B26262626610B32A7 +:102380003332FA02A1FF4DFFAFB7D6AE0070AE01F7 +:10239000EA00808D25EA00C09D20753072A000AE55 +:1023A000024D069D10262626262627302730610D51 +:1023B000302D00FA0910FFFFFA043072A100B6EACE +:0323C000FFFFAF6D +:1023C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:1023D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:1023E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:1023F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10240300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10241300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10242300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10243300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10244300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10245300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10246300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10247300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10248300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10249300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:1024A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1024B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1024C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1024D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:1024E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:1024F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10250300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10251300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10252300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10253300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10254300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10255300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10256300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10257300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10258300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10259300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:1025A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1025B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1025C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1025D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:1025E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:1025F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10260300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10261300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10262300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10263300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10264300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10265300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10266300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10267300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10268300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10269300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:1026A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1026B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1026C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1026D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:1026E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:1026F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10270300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10271300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10272300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10273300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10274300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10275300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10276300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10277300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10278300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:10279300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:1027A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:1027B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:1027C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:1027D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:1027E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:1027F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10280300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10281300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10282300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10283300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10284300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10285300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10286300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10287300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10288300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10289300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:1028A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:1028B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:1028C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:1028D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:1028E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:1028F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10290300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10291300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10292300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10293300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10294300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10295300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10296300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10297300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10298300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10299300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:1029A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:1029B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:1029C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:1029D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:1029E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:1029F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:102A0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:102A1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:102A2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:102A3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:102A4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:102A5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:102A6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:102A7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:102A8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:102A9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:102AA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:102AB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:102AC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:102AD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:102AE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:102AF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:102B0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:102B1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:102B2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:102B3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:102B4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:102B5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:102B6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:102B7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:102B8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:102B9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:102BA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:102BB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:102BC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:102BD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:102BE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:102BF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:102C0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:102C1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:102C2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:102C3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:102C4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:102C5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:102C6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:102C7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:102C8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:102C9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:102CA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:102CB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:102CC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:102CD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:102CE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:102CF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:102D0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:102D1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:102D2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:102D3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:102D4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:102D5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:102D6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:102D7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:102D8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:102D9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:102DA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:102DB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:102DC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:102DD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:102DE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:102DF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:102E0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:102E1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:102E2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:102E3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:102E4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:102E5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:102E6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:102E7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:102E8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:102E9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:102EA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:102EB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:102EC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:102ED300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:102EE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:102EF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:102F0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:102F1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:102F2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:102F3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:102F4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:102F5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:102F6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:102F7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:102F8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:102F9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:102FA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:102FB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:102FC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:102FD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:102FE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:102FF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10300300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10301300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10302300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10303300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10304300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10305300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10306300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10307300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10308300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10309300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:1030A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:1030B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:1030C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:1030D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:1030E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:1030F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10310300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10311300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10312300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10313300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10314300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10315300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10316300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:10317300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:10318300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:10319300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:1031A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:1031B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:1031C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:1031D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:1031E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:1031F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10320300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10321300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10322300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10323300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10324300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10325300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10326300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10327300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:10328300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10329300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:1032A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:1032B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:1032C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:1032D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:1032E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:1032F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10330300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10331300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10332300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10333300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10334300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10335300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10336300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10337300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10338300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10339300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:1033A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:1033B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:1033C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:1033D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:1033E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:1033F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10340300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10341300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10342300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10343300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10344300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10345300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10346300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10347300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10348300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10349300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1034A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1034B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1034C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:1034D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:1034E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:1034F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10350300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10351300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10352300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10353300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10354300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10355300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10356300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10357300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10358300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10359300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1035A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1035B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1035C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:1035D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:1035E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:1035F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10360300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10361300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10362300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10363300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10364300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10365300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10366300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10367300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10368300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10369300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1036A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1036B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1036C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:1036D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:1036E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:1036F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10370300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10371300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10372300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10373300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10374300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10375300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10376300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10377300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:10378300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:10379300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:1037A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:1037B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:1037C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:1037D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:1037E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:1037F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10380300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10381300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10382300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10383300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10384300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10385300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10386300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10387300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10388300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10389300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:1038A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:1038B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:1038C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:1038D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:1038E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:1038F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10390300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10391300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10392300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10393300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10394300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10395300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10396300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10397300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10398300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10399300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:1039A300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:1039B300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:1039C300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:1039D300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:1039E300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:1039F300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:103A0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:103A1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:103A2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:103A3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:103A4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:103A5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:103A6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:103A7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:103A8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:103A9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:103AA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:103AB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:103AC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:103AD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:103AE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:103AF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:103B0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:103B1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:103B2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:103B3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:103B4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:103B5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:103B6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:103B7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:103B8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:103B9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:103BA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:103BB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:103BC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:103BD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:103BE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:103BF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:103C0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:103C1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:103C2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:103C3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:103C4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:103C5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:103C6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:103C7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:103C8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:103C9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:103CA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:103CB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:103CC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:103CD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:103CE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:103CF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:103D0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:103D1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:103D2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:103D3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:103D4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:103D5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:103D6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:103D7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:103D8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:103D9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:103DA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:103DB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:103DC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:103DD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:103DE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:103DF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:103E0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:103E1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:103E2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:103E3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:103E4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:103E5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:103E6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:103E7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:103E8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:103E9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:103EA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:103EB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:103EC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:103ED300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:103EE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:103EF300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:103F0300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:103F1300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:103F2300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:103F3300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:103F4300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:103F5300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:103F6300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:103F7300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:103F8300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:103F9300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:103FA300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:103FB300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:103FC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:103FD300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:103FE300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:0D3FF300FFFFFFFFFFFFFFFFFFFFFFFFFFCE +:00000001FF + \ No newline at end of file diff --git a/build/systemMenu_tools/common/ARM7/include/mcu_firm.h b/build/systemMenu_tools/common/ARM7/include/mcu_firm.h new file mode 100644 index 00000000..6bd31836 --- /dev/null +++ b/build/systemMenu_tools/common/ARM7/include/mcu_firm.h @@ -0,0 +1,22 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - libraties - mcu + File: mcu_firm.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$ + *---------------------------------------------------------------------------*/ +#ifndef TWL_IPL_MCU_WRITEFIRM_H_ +#define TWL_IPL_MCU_WRITEFIRM_H_ + +BOOL MCU_WriteFirm(const unsigned char* hex); + +#endif diff --git a/build/systemMenu_tools/common/ARM7/src/mcu_firm.c b/build/systemMenu_tools/common/ARM7/src/mcu_firm.c new file mode 100644 index 00000000..35effdeb --- /dev/null +++ b/build/systemMenu_tools/common/ARM7/src/mcu_firm.c @@ -0,0 +1,226 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - libraties - mcu + File: mcu_firm.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 "mcu_firm.h" + +#define PRINT_DEBUG +//#define PRINT_DEBUG_MINI // rough version + +#ifdef PRINT_DEBUG +#include +#define DBG_PRINTF OS_TPrintf +#undef PRINT_DEBUG_MINI // because of the alternative option +#define DBG_PRINT_PROFILE_INIT OSTick debug +#define DBG_PRINT_PROFILE_BEGIN() (debug = OS_GetTick()) +#define DBG_PRINT_PROFILE_END() OS_TPrintf("(%d msec)\n", (int)OS_TicksToMilliSeconds(OS_GetTick()-debug)) +#else +#define DBG_PRINTF( ... ) ((void)0) +#define DBG_PRINT_PROFILE_INIT +#define DBG_PRINT_PROFILE_BEGIN() ((void)0) +#define DBG_PRINT_PROFILE_END() ((void)0) +#endif +#ifdef PRINT_DEBUG_MINI +#include +#define DBG_PRINT_FUNC() OS_TPrintf("%s(0x%02X, 0x%02X);\n", __func__, I2CiDeviceAddrTable[id], reg) +#define DBG_PRINT_FUNC1(data) OS_TPrintf("%s(0x%02X, 0x%02X, 0x%02X);\n", __func__, I2CiDeviceAddrTable[id], reg, (data)) +#define DBG_PRINT_ERR() OS_TPrintf(" Failed(%d) @ %d\n", error, r) +#else +#define DBG_PRINT_FUNC() ((void)0) +#define DBG_PRINT_FUNC1(data) ((void)0) +//#define DBG_PRINT_ERR() ((void)0) +#define DBG_PRINT_ERR() OS_TPrintf("%s: I2C Error (0x%X, 0x%X) %d/%d.\n", __func__, I2CiDeviceAddrTable[id], reg, r+1, RETRY_COUNT); +//#define DBG_PRINT_ERR() OS_TPanic("%s: I2C Error (0x%X, 0x%X) %d/%d.\n", __func__, I2CiDeviceAddrTable[id], reg, r+1, RETRY_COUNT); +#endif + + +static const u8 I2CiDeviceAddrTable[I2C_SLAVE_NUM] = + { + I2C_ADDR_CAMERA_MICRON_IN, + I2C_ADDR_CAMERA_MICRON_OUT, + I2C_ADDR_CAMERA_SHARP_IN, + I2C_ADDR_CAMERA_SHARP_OUT, + I2C_ADDR_MICRO_CONTROLLER, + I2C_ADDR_DEBUG_LED, + I2C_ADDR_DEBUGGER, + }; + +static BOOL slowRate = 0; + +static inline void I2Ci_Start( void ) +{ + reg_OS_I2C_CNT = (u8)((1 << REG_OS_I2C_CNT_E_SHIFT) | + (1 << REG_OS_I2C_CNT_I_SHIFT) | // 割り込み禁止は IE にて行うことで仕様統一 + (I2C_WRITE << REG_OS_I2C_CNT_RW_SHIFT) | + (0 << REG_OS_I2C_CNT_ACK_SHIFT) | + (1 << REG_OS_I2C_CNT_START_SHIFT)); +} + +static inline void I2Ci_Continue( I2CReadWrite rw ) +{ + reg_OS_I2C_CNT = (u8)((1 << REG_OS_I2C_CNT_E_SHIFT) | + (1 << REG_OS_I2C_CNT_I_SHIFT) | + (rw << REG_OS_I2C_CNT_RW_SHIFT) | + (rw << REG_OS_I2C_CNT_ACK_SHIFT)); +} + +static inline void I2Ci_Stop( I2CReadWrite rw ) +{ + reg_OS_I2C_CNT = (u8)((1 << REG_OS_I2C_CNT_E_SHIFT) | + (1 << REG_OS_I2C_CNT_I_SHIFT) | + (rw << REG_OS_I2C_CNT_RW_SHIFT) | + (0 << REG_OS_I2C_CNT_ACK_SHIFT) | + (1 << REG_OS_I2C_CNT_STOP_SHIFT)); +} + +static inline void I2Ci_StopPhase1( I2CReadWrite rw ) +{ + reg_OS_I2C_CNT = (u8)((1 << REG_OS_I2C_CNT_E_SHIFT) | + (1 << REG_OS_I2C_CNT_I_SHIFT) | + (rw << REG_OS_I2C_CNT_RW_SHIFT) | + (0 << REG_OS_I2C_CNT_ACK_SHIFT)); +} +static inline void I2Ci_StopPhase2( void ) +{ + reg_OS_I2C_CNT = (u8)((1 << REG_OS_I2C_CNT_E_SHIFT) | + (1 << REG_OS_I2C_CNT_I_SHIFT) | + (1 << REG_OS_I2C_CNT_STOP_SHIFT) | + (1 << REG_OS_I2C_CNT_NT_SHIFT)); +} + +static inline void I2Ci_WaitEx( void ) // support slowRate +{ + I2Ci_Wait(); + SVC_WaitByLoop(slowRate); +} + +static inline void I2Ci_StopEx( I2CReadWrite rw ) // support slowRate +{ + if (slowRate) + { + I2Ci_StopPhase1(rw); + I2Ci_Wait(); + SVC_WaitByLoop(slowRate); + I2Ci_StopPhase2(); + } + else + { + I2Ci_Stop(rw); + } +} + +static inline void I2Ci_SetData( u8 data ) +{ + DBG_PRINTF("%02X", data); + reg_OS_I2C_DAT = data; +} + +static inline BOOL I2Ci_GetResult( void ) +{ + I2Ci_Wait(); + DBG_PRINTF("%c", (reg_OS_I2C_CNT & REG_OS_I2C_CNT_ACK_MASK) ? '.' : '*'); + return (BOOL)((reg_OS_I2C_CNT & REG_OS_I2C_CNT_ACK_MASK) >> REG_OS_I2C_CNT_ACK_SHIFT); +} + +static inline BOOL I2Ci_SendStart( I2CSlave id ) +{ + DBG_PRINTF("\n"); + I2Ci_Wait(); + I2Ci_SetData( (u8)(I2CiDeviceAddrTable[id] | I2C_WRITE) ); + I2Ci_Start(); + return I2Ci_GetResult(); +} + +static inline BOOL I2Ci_SendMiddle( u8 data ) +{ + I2Ci_WaitEx(); + I2Ci_SetData( data ); + I2Ci_Continue( I2C_WRITE ); + return I2Ci_GetResult(); +} + +static inline BOOL I2Ci_SendLast( u8 data ) +{ + I2Ci_WaitEx(); + I2Ci_SetData( data ); + I2Ci_StopEx( I2C_WRITE ); + return I2Ci_GetResult(); +} + +#define SLOW_RATE_DEFAULT 0x90 +#define SLOW_RATE_LONG HW_CPU_CLOCK_ARM7 // 4 sec +#define SLOW_RATE_ENTER (HW_CPU_CLOCK_ARM7 / 400) // 10msec + +BOOL MCU_WriteFirm(const unsigned char* hex) +{ + BOOL result = TRUE; + DBG_PRINT_PROFILE_INIT; + + I2C_Lock(); + + // start phase + slowRate = SLOW_RATE_DEFAULT; + result &= I2Ci_SendStart( I2C_SLAVE_MICRO_CONTROLLER ); + result &= I2Ci_SendMiddle( 0x77 ); // free register 7 + slowRate = SLOW_RATE_LONG; + DBG_PRINT_PROFILE_BEGIN(); + result &= I2Ci_SendMiddle( 0x4A ); // goto firm writing mode + DBG_PRINT_PROFILE_END(); + + // main phase + while ( hex[0] == ':' && hex[3] < '3' ) // フォーマットが正しく0x3000以前のアドレスである場合に処理する + { + // データ終端チェック (基本的にこの前で終了している) + if ( !MI_CpuComp8( hex, ":00000001FF", 11) ) + { + break; + } + // 無視行チェック + if ( hex[1] == '1' && hex[2] == '0' && !MI_CpuComp8( &hex[9], "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 32 ) ) + { + while ( *hex++ != '\n' ) + { + // skip + } + continue; + } + // 通常出力 + slowRate = SLOW_RATE_DEFAULT; + while ( *hex != '\n' ) + { + result &= I2Ci_SendMiddle( *hex++ ); + } + // 最後の1文字(\n固定) + slowRate = SLOW_RATE_ENTER; + DBG_PRINT_PROFILE_BEGIN(); + result &= I2Ci_SendMiddle( *hex++ ); + DBG_PRINT_PROFILE_END(); + } + + // stop phase + I2Ci_Wait(); + DBG_PRINT_PROFILE_BEGIN(); + SVC_WaitByLoop(slowRate); + DBG_PRINT_PROFILE_END(); + I2Ci_StopPhase2(); + + I2C_Unlock(); + + return result; +} +