From 9774cca464dec7c441d8d7284551ab7e156082ea Mon Sep 17 00:00:00 2001 From: yutaka Date: Mon, 29 Oct 2007 07:30:30 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=87=E3=83=90=E3=82=A4=E3=82=B9=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E3=81=AE=E3=82=A2=E3=83=A9=E3=82=A4=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AB=E5=AF=BE=E5=BF=9C=20=E3=83=A1=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=A1=E3=83=A2=E3=83=AA=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=83=AB=E3=83=BC=E3=83=81=E3=83=B3=E3=81=AB=E3=83=81?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=82=BF=E3=82=A4=E3=83=97=E3=81=A8JTAG?= =?UTF-8?q?=E3=81=AE=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0=20(=E3=81=97=E3=81=8B?= =?UTF-8?q?=E3=81=97=E3=81=93=E3=81=AE=E3=83=AB=E3=83=BC=E3=83=81=E3=83=B3?= =?UTF-8?q?=E8=87=AA=E4=BD=93=E5=91=BC=E3=82=93=E3=81=A7=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=84)=20ARM7=E5=81=B4=E3=81=A0=E3=81=91=E3=82=AA=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=83=AD=E3=83=BC=E3=83=89=E3=83=AB=E3=83=BC=E3=83=81?= =?UTF-8?q?=E3=83=B3=E3=82=92=E5=91=BC=E3=82=93=E3=81=A7=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=A2?= =?UTF-8?q?=E3=82=A6=E3=83=88=20=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=83=AB=E3=83=BC=E3=83=81?= =?UTF-8?q?=E3=83=B3=E3=81=AE=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=A2?= =?UTF-8?q?=E3=82=A6=E3=83=88?= 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@71 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/fatfs/ARM7/src/fatfs_loader.c | 45 +++++++++++++------ build/libraries/init/ARM7/crt0_firm.c | 28 +++++++++--- build/libraries/init/ARM9/crt0_firm.c | 5 ++- build/libraries/mi/ARM9/mi_loader.c | 10 ++++- 4 files changed, 67 insertions(+), 21 deletions(-) diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 1a500fe1..a60b5ab3 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -29,6 +29,10 @@ */ //#define PROFILE_ENABLE +#define MODULE_ALIGNMENT 0x10 // 16バイト単位で読み込む +//#define MODULE_ALIGNMENT 0x200 // 512バイト単位で読み込む +#define RoundUpModuleSize(value) (((value) + MODULE_ALIGNMENT - 1) & -MODULE_ALIGNMENT) + #ifdef SDK_FINALROM // FINALROMで無効化 #undef PROFILE_ENABLE #endif @@ -43,7 +47,7 @@ extern u32 pf_cnt; #define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0 -static ROM_Header* const rh= (ROM_Header*)(HW_MAIN_MEM_SYSTEM_END - 0x2000); +static ROM_Header* const rh= (ROM_Header*)HW_TWL_ROM_HEADER_BUF; static int menu_fd = -1; /*---------------------------------------------------------------------------* @@ -124,6 +128,14 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ) SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。 (ROMヘッダ部分は元から知っているはず) + 補足: + ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを + 前提にしているが、汎用的にするには(独立ライブラリ化するなら)、 + 送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック + &スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に + destとsizeを通知するという形でOKではないか? + (で完了したら返事を返す) + Arguments: offset offset of the file to load (512 bytes alignment) size size to load @@ -285,15 +297,15 @@ static AESCounter* FATFSi_GetCounter( u32 offset ) makerom.TWLまたはIPLの使用に依存します。 Arguments: offset offset of region from head of ROM_Header - size size of region + size size of region (for check only) Returns: counter *---------------------------------------------------------------------------*/ static void FATFSi_SetupAES( u32 offset, u32 size ) { - if ( rh->s.enable_aes && - offset >= rh->s.aes_target_rom_offset && - offset + size <= rh->s.aes_target_rom_offset + rh->s.aes_target_size ) + u32 aes_end = rh->s.aes_target_rom_offset + RoundUpModuleSize(rh->s.aes_target_size); + u32 arg_end = offset + RoundUpModuleSize(size); + if ( rh->s.enable_aes && offset >= rh->s.aes_target_rom_offset && arg_end <= aes_end ) { AESi_WaitKey(); if (rh->s.developer_encrypt) @@ -326,6 +338,9 @@ static void FATFSi_SetupAES( u32 offset, u32 size ) このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが 格納されている必要があります。 + ARM9側と異なり、デバイス依存のアライメント修正を行っています。 + (サイズのみ) + Arguments: None Returns: TRUE if success @@ -335,6 +350,7 @@ BOOL FATFS_LoadStatic( void ) // load ARM9 static region without AES if ( rh->s.main_size > 0 ) { + u32 aligned = RoundUpModuleSize(rh->s.main_size); #ifdef PROFILE_ENABLE // 30: before PXI pf_cnt = 0x30; @@ -342,8 +358,8 @@ BOOL FATFS_LoadStatic( void ) profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_STATIC; // checkpoint #endif PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_STATIC ); - FATFSi_SetupAES( rh->s.main_rom_offset, rh->s.main_size ); - if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, rh->s.main_size ) || + FATFSi_SetupAES( rh->s.main_rom_offset, aligned ); + if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, aligned ) || PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_STATIC ) { return FALSE; @@ -357,6 +373,7 @@ BOOL FATFS_LoadStatic( void ) // load ARM7 static region without AES if ( rh->s.sub_size > 0 ) { + u32 aligned = RoundUpModuleSize(rh->s.sub_size); #ifdef PROFILE_ENABLE // 50: before PXI pf_cnt = 0x50; @@ -364,8 +381,8 @@ BOOL FATFS_LoadStatic( void ) profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_STATIC; // checkpoint #endif PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_STATIC ); - FATFSi_SetupAES( rh->s.sub_rom_offset, rh->s.sub_size ); - if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, rh->s.sub_size ) || + FATFSi_SetupAES( rh->s.sub_rom_offset, aligned ); + if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, aligned ) || PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_STATIC ) { return FALSE; @@ -379,6 +396,7 @@ BOOL FATFS_LoadStatic( void ) // load ARM9 extended static region with AES if ( rh->s.main_ltd_size > 0 ) { + u32 aligned = RoundUpModuleSize(rh->s.main_ltd_size); #ifdef PROFILE_ENABLE // 70: before PXI pf_cnt = 0x70; @@ -386,8 +404,8 @@ BOOL FATFS_LoadStatic( void ) profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC; // checkpoint #endif PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC ); - FATFSi_SetupAES( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size ); - if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size ) || + FATFSi_SetupAES( rh->s.main_ltd_rom_offset, aligned ); + if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, aligned ) || PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC ) { return FALSE; @@ -401,6 +419,7 @@ BOOL FATFS_LoadStatic( void ) // load ARM7 extended static region with AES if ( rh->s.sub_ltd_size > 0 ) { + u32 aligned = RoundUpModuleSize(rh->s.sub_ltd_size); #ifdef PROFILE_ENABLE // 90: before PXI pf_cnt = 0x90; @@ -408,8 +427,8 @@ BOOL FATFS_LoadStatic( void ) profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC; // checkpoint #endif PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC ); - FATFSi_SetupAES( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size ); - if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size ) || + FATFSi_SetupAES( rh->s.sub_ltd_rom_offset, aligned ); + if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, aligned ) || PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC ) { return FALSE; diff --git a/build/libraries/init/ARM7/crt0_firm.c b/build/libraries/init/ARM7/crt0_firm.c index 862ec6ca..3b549b79 100644 --- a/build/libraries/init/ARM7/crt0_firm.c +++ b/build/libraries/init/ARM7/crt0_firm.c @@ -86,7 +86,7 @@ SDK_WEAK_SYMBOL asm void _start( void ) mov r0, #HW_PSR_SYS_MODE msr cpsr_csfx, r0 sub sp, r1, #4 // 4byte for stack check code - +#if 0 // not used in FIRM //---- read reset flag from pmic #ifdef TWL_PLATFORM_TS mov r0, #REG_PMIC_SW_FLAGS_ADDR @@ -98,7 +98,7 @@ SDK_WEAK_SYMBOL asm void _start( void ) mov r0, #FIRM_PXI_ID_INIT_MMEM bl PXI_WaitByIntf #endif // TWL_PLATFORM_TS - +#endif //---- wait for main memory mode into burst mode ldr r3, =REG_EXMEMCNT_L_ADDR mov r1, #REG_MI_EXMEMCNT_L_ECE2_MASK @@ -127,7 +127,7 @@ SDK_WEAK_SYMBOL asm void _start( void ) #endif //---- load autoload block and initialize bss - bl do_autoload + //bl do_autoload //---- fill static static bss with 0 ldr r0, =_start_ModuleParams @@ -139,7 +139,7 @@ SDK_WEAK_SYMBOL asm void _start( void ) bcc @2 //---- detect main memory size -// bl detect_main_memory_size // shared memory will be cleared + //bl detect_main_memory_size //---- set interrupt vector ldr r1, =HW_INTR_VECTOR_BUF @@ -266,6 +266,7 @@ SDK_WEAK_SYMBOL asm void _start_AutoloadDoneCallback( void* argv[] ) static asm void detect_main_memory_size( void ) { +#if 0 // NITRO hardware is not supported mov r0, #OS_CONSOLE_SIZE_4MB mov r1, #0 @@ -292,7 +293,9 @@ static asm void detect_main_memory_size( void ) tst r12, #REG_SCFG_CLK_WRAMHCLK_MASK moveq r0, #OS_CONSOLE_SIZE_8MB beq @4 - +#else + ldr r2, =HW_MMEMCHECKER_SUB +#endif //---- 16MB or 32MB mov r1, #0 add r3, r2, #OSi_IMAGE_DIFFERENCE2 @@ -310,6 +313,21 @@ static asm void detect_main_memory_size( void ) mov r0, #OS_CONSOLE_SIZE_16MB @4: strh r0, [r2] + + //---- detect chiptype + ldr r2, =REG_OP_ADDR + ldrh r0, [r2] + and r0, r0, #REG_SCFG_OP_OPT_MASK + + //---- detect jtag + ldr r2, =REG_JTAG_ADDR + ldrh r1, [r2] + and r1, r1, #REG_SCFG_JTAG_CPUJE_MASK + orr r0, r0, r1, LSL #1 + + ldr r2, =HW_CHIPTYPE_FLAG + strb r0, [r2] + bx lr } diff --git a/build/libraries/init/ARM9/crt0_firm.c b/build/libraries/init/ARM9/crt0_firm.c index ca6085f3..52635b2a 100644 --- a/build/libraries/init/ARM9/crt0_firm.c +++ b/build/libraries/init/ARM9/crt0_firm.c @@ -89,14 +89,15 @@ SDK_WEAK_SYMBOL asm void _start( void ) mov r0, #HW_PSR_SYS_MODE msr cpsr_csfx, r0 sub sp, r1, #4 // 4byte for stack check code - //---- read reset flag from pmic + //---- read reset flag from pmic #ifdef TWL_PLATFORM_TS +#if 0 @0: bl PXI_RecvByIntf cmp r0, #FIRM_PXI_ID_COLDBOOT cmpne r0, #FIRM_PXI_ID_WARMBOOT bne @0 - +#endif //---- initialize Main Memory cmp r0, #FIRM_PXI_ID_COLDBOOT moveq r0, #TRUE diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index 680ba249..e9b7ba7e 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -145,6 +145,14 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。 (ROMヘッダ部分は元から知っているはず) + 補足: + ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを + 前提にしているが、汎用的にするには(独立ライブラリ化するなら)、 + 送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック + &スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に + destとsizeを通知するという形でOKではないか? + (で完了したら返事を返す) + Arguments: dest destination address for received data size size to load ctx context for SHA1 if execute SVC_SHA1Update @@ -178,8 +186,8 @@ static BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx) u8* s = src + done; u8* d = dest + done; u32 u = unit < done + HASH_UNIT ? unit - done : HASH_UNIT; - SVC_SHA1Update( ctx, s, u ); MI_CpuCopyFast( s, d, u ); + SVC_SHA1Update( ctx, s, u ); } } else