整理整頓

JTAG周りは触らないようにした
detect_main_memory_sizeを実行するようにした (コンソールタイプ判定のため)


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@110 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-11-07 10:12:01 +00:00
parent 4e497d0610
commit 7ddc474e2c
2 changed files with 470 additions and 403 deletions

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlIPL - libraries - init Project: TwlIPL - libraries - init
File: crt0.c File: crt0_firm.c
Copyright 2007 Nintendo. All rights reserved. Copyright 2007 Nintendo. All rights reserved.
@ -17,8 +17,6 @@
#include <nitro/code32.h> #include <nitro/code32.h>
#include <firm.h> #include <firm.h>
//#define FIRM_ENABLE_JTAG
void _start(void); void _start(void);
void _start_AutoloadDoneCallback(void *argv[]); void _start_AutoloadDoneCallback(void *argv[]);
@ -32,10 +30,10 @@ void _start_AutoloadDoneCallback(void *argv[]);
#define IPL_PARAM_CARD_ROM_HEADER 0x023FE940 #define IPL_PARAM_CARD_ROM_HEADER 0x023FE940
#define IPL_PARAM_DOWNLOAD_PARAMETER 0x023FE904 #define IPL_PARAM_DOWNLOAD_PARAMETER 0x023FE904
/* 外部関数参照定義 */
extern void OS_IrqHandler(void); extern void OS_IrqHandler(void);
extern void _fp_init(void); extern void _fp_init(void);
extern void __call_static_initializers(void); extern void __call_static_initializers(void);
extern void TwlMain(void);
static void INITi_DoAutoload(void); static void INITi_DoAutoload(void);
static void INITi_ShelterLtdBinary(void); static void INITi_ShelterLtdBinary(void);
@ -45,20 +43,12 @@ static void INITi_ShelterStaticInitializer(u32* ptr);
static void INITi_CallStaticInitializers(void); static void INITi_CallStaticInitializers(void);
#endif #endif
// from LCF /* リンカスクリプトにより定義されるシンボル参照 */
extern unsigned long SDK_IRQ_STACKSIZE[]; extern void SDK_AUTOLOAD_LIST(void);
extern void SDK_AUTOLOAD_LIST_END(void);
extern void SDK_STATIC_BSS_START(void); // static bss start address extern void SDK_AUTOLOAD_START(void);
extern void SDK_STATIC_BSS_END(void); // static bss start address extern void SDK_STATIC_BSS_START(void);
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information extern void SDK_STATIC_BSS_END(void);
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
extern void SDK_LTDAUTOLOAD_LIST(void); // start pointer to autoload information
extern void SDK_LTDAUTOLOAD_LIST_END(void); // end pointer to autoload information
extern void SDK_LTDAUTOLOAD_START(void); // autoload data will start from here
//---- IRQ+SVC stack size in boot (this area is not cleared)
#define INITi_Initial_Stack 0x100
void *const _start_ModuleParams[] = void *const _start_ModuleParams[] =
{ {
@ -73,6 +63,10 @@ void *const _start_ModuleParams[] =
(void*)SDK_NITROCODE_LE, (void*)SDK_NITROCODE_LE,
}; };
extern void SDK_LTDAUTOLOAD_LIST(void);
extern void SDK_LTDAUTOLOAD_LIST_END(void);
extern void SDK_LTDAUTOLOAD_START(void);
void* const _start_LtdModuleParams[] = void* const _start_LtdModuleParams[] =
{ {
(void*)SDK_LTDAUTOLOAD_LIST, (void*)SDK_LTDAUTOLOAD_LIST,
@ -94,13 +88,6 @@ void* const _start_LtdModuleParams[] =
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void _start( void ) SDK_WEAK_SYMBOL asm void _start( void )
{ {
#ifdef FIRM_ENABLE_JTAG
ldr r1, =REG_JTAG_ADDR
ldrh r2, [r1]
orr r2, r2, #REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK
strh r2, [r1]
#endif
//---- set IME = 0 //---- set IME = 0
// ( use that LSB of HW_REG_BASE equal to 0 ) // ( use that LSB of HW_REG_BASE equal to 0 )
mov r12, #HW_REG_BASE mov r12, #HW_REG_BASE
@ -187,7 +174,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
bcc @2 bcc @2
//---- detect main memory size //---- detect main memory size
//bl detect_main_memory_size bl detect_main_memory_size
//---- set interrupt vector //---- set interrupt vector
ldr r1, =HW_INTR_VECTOR_BUF ldr r1, =HW_INTR_VECTOR_BUF
@ -361,6 +348,7 @@ INITi_ShelterStaticInitializer(u32* ptr)
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2 sub r1, r1, r2
add r1, r1, #4
/* 退避場所先頭から空き場所を調査 */ /* 退避場所先頭から空き場所を調査 */
@001: ldr r2, [r1] @001: ldr r2, [r1]
@ -394,6 +382,7 @@ INITi_CallStaticInitializers(void)
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2 sub r1, r1, r2
add r1, r1, #4
/* テーブルに管理されているポインタを一つずつ呼び出し */ /* テーブルに管理されているポインタを一つずつ呼び出し */
@001: ldr r0, [r1] @001: ldr r0, [r1]
@ -438,10 +427,6 @@ _start_AutoloadDoneCallback(void* argv[])
value is [OS_CONSOLE_SIZE_4MB|OS_CONSOLE_SIZE_8MB| value is [OS_CONSOLE_SIZE_4MB|OS_CONSOLE_SIZE_8MB|
OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32MB] OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32MB]
Arguments: None. Arguments: None.
Returns: None. Returns: None.
@ -461,8 +446,6 @@ static asm void detect_main_memory_size( void )
strh r1, [r2] strh r1, [r2]
ldrh r12, [r3] ldrh r12, [r3]
cmp r1, r12 cmp r1, r12
bne @2 bne @2
add r1, r1, #1 add r1, r1, #1
@ -470,6 +453,11 @@ static asm void detect_main_memory_size( void )
bne @1 bne @1
//---- 4MB //---- 4MB
// check SMX_CNT
ldr r2, =REG_SMX_CNT_ADDR
ldrh r1, [r2]
tst r1, #0
orrne r0, r0, #OS_CHIPTYPE_SMX_MASK
b @4 b @4
//---- 8MB or 16MB or 32MB //---- 8MB or 16MB or 32MB
@ -483,6 +471,7 @@ static asm void detect_main_memory_size( void )
#else #else
ldr r2, =HW_MMEMCHECKER_SUB ldr r2, =HW_MMEMCHECKER_SUB
#endif #endif
//---- 16MB or 32MB //---- 16MB or 32MB
mov r1, #0 mov r1, #0
add r3, r2, #OSi_IMAGE_DIFFERENCE2 add r3, r2, #OSi_IMAGE_DIFFERENCE2
@ -506,12 +495,6 @@ static asm void detect_main_memory_size( void )
ldrh r0, [r2] ldrh r0, [r2]
and r0, r0, #REG_SCFG_OP_OPT_MASK and r0, r0, #REG_SCFG_OP_OPT_MASK
// check SMX_CNT
ldr r2, =REG_SMX_CNT_ADDR
ldrh r1, [r2]
tst r1, #0
orrne r0, r0, #OS_CHIPTYPE_SMX_MASK
//---- detect jtag //---- detect jtag
ldr r2, =REG_JTAG_ADDR ldr r2, =REG_JTAG_ADDR
ldrh r1, [r2] ldrh r1, [r2]

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlIPL - libraries - init Project: TwlIPL - libraries - init
File: crt0.c File: crt0_firm.c
Copyright 2007 Nintendo. All rights reserved. Copyright 2007 Nintendo. All rights reserved.
@ -14,7 +14,7 @@
$Rev$ $Rev$
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <nitro/code32.h> #include <twl/code32.h>
#include <firm.h> #include <firm.h>
void _start(void); void _start(void);
@ -26,55 +26,51 @@ void _start_AutoloadDoneCallback(void *argv[]);
#define SDK_TWLCODE_LE 0x6314c0de #define SDK_TWLCODE_LE 0x6314c0de
#define SDK_TWLCODE_BE 0xdec01463 #define SDK_TWLCODE_BE 0xdec01463
/* 外部関数参照定義 */
extern void OS_IrqHandler(void); extern void OS_IrqHandler(void);
extern void _fp_init(void); extern void _fp_init(void);
extern void __call_static_initializers(void); extern void __call_static_initializers(void);
extern void TwlMain(void);
/* 内部関数プロトタイプ定義 */
static void INITi_CpuClear32(register u32 data, register void *destp, register u32 size); static void INITi_CpuClear32(register u32 data, register void *destp, register u32 size);
static void INITi_InitCoprocessor(void); static void INITi_InitCoprocessor(void);
static void INITi_InitRegion(void); static void INITi_InitRegion(void);
static void INITi_DoAutoload(void); static void INITi_DoAutoload(void);
static void INITi_ShelterLtdBinary(void); static void INITi_ShelterLtdBinary(void);
#ifndef SDK_NOINIT
static void INITi_ShelterStaticInitializer(u32* ptr);
static void INITi_CallStaticInitializers(void);
#endif
// from LCF /* リンカスックリプトにより定義されるシンボル参照 */
extern unsigned long SDK_IRQ_STACKSIZE[]; extern void SDK_AUTOLOAD_LIST(void);
extern void SDK_AUTOLOAD_LIST_END(void);
extern void SDK_AUTOLOAD_START(void);
extern void SDK_STATIC_BSS_START(void);
extern void SDK_STATIC_BSS_END(void);
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
extern void SDK_STATIC_BSS_START(void); // static bss start address
extern void SDK_STATIC_BSS_END(void); // static bss end address
extern void SDK_LTDAUTOLOAD_LIST(void); // start pointer to autoload information
extern void SDK_LTDAUTOLOAD_LIST_END(void); // end pointer to autoload information
extern void SDK_LTDAUTOLOAD_START(void); // autoload data will start from here
/*---------------------------------------------------------------------------*
Name: _start_ModuleParams
Description: autoload/compress/arguments data block
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
//#include <nitro/version.h> //#include <nitro/version.h>
#define SDK_VERSION_ID ((u32)SDK_VERSION_MAJOR<<24|\ #define SDK_VERSION_ID ((u32)SDK_VERSION_MAJOR<<24|\
(u32)SDK_VERSION_MINOR<<16|\ (u32)SDK_VERSION_MINOR<<16|\
(u32)SDK_VERSION_RELSTEP) (u32)SDK_VERSION_RELSTEP)
void *const _start_ModuleParams[] = void* const _start_ModuleParams[] =
{ {
(void *)SDK_AUTOLOAD_LIST, (void*)SDK_AUTOLOAD_LIST,
(void *)SDK_AUTOLOAD_LIST_END, (void*)SDK_AUTOLOAD_LIST_END,
(void *)SDK_AUTOLOAD_START, (void*)SDK_AUTOLOAD_START,
(void *)SDK_STATIC_BSS_START, (void*)SDK_STATIC_BSS_START,
(void *)SDK_STATIC_BSS_END, (void*)SDK_STATIC_BSS_END,
(void *)0, // CompressedStaticEnd (void*)0, // CompressedStaticEnd. This fixed number will be updated by compstatic tool.
(void *)SDK_VERSION_ID, // SDK version info (void*)SDK_VERSION_ID, // SDK version info /* [TODO] ビルドを通すため */
(void *)SDK_NITROCODE_BE, // Checker 1 (void*)SDK_NITROCODE_BE,
(void *)SDK_NITROCODE_LE, // Checker 2 (void*)SDK_NITROCODE_LE,
}; };
extern void SDK_LTDAUTOLOAD_LIST(void);
extern void SDK_LTDAUTOLOAD_LIST_END(void);
extern void SDK_LTDAUTOLOAD_START(void);
void* const _start_LtdModuleParams[] = void* const _start_LtdModuleParams[] =
{ {
(void*)SDK_LTDAUTOLOAD_LIST, (void*)SDK_LTDAUTOLOAD_LIST,
@ -85,15 +81,11 @@ void* const _start_LtdModuleParams[] =
(void*)SDK_TWLCODE_LE, (void*)SDK_TWLCODE_LE,
}; };
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: _start Name: _start
Description:
Description: Start up Arguments:
Returns:
Arguments: None
Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#define INITi_HW_DTCM SDK_AUTOLOAD_DTCM_START #define INITi_HW_DTCM SDK_AUTOLOAD_DTCM_START
@ -217,6 +209,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
bl _fp_init bl _fp_init
bl TwlStartUp bl TwlStartUp
bl __call_static_initializers bl __call_static_initializers
// bl INITi_CallStaticInitializers
#endif #endif
//---- start (to 16bit code) //---- start (to 16bit code)
ldr r1, =TwlMain ldr r1, =TwlMain
@ -227,337 +220,21 @@ SDK_WEAK_SYMBOL asm void _start( void )
bx r1 bx r1
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: INITi_CpuClear32 Name: INITi_CpuClear32
Description: 32 bit
Description: fill memory with specified data. Arguments: r0 -
32bit version r1 -
r2 -
Arguments: data : fill data
destp : destination address
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static asm void INITi_CpuClear32( register u32 data, register void *destp, register u32 size )
{
add r12, r1, r2 // r12: destEndp = destp + size
@20:
cmp r1, r12 // while (destp < destEndp)
stmltia r1!, {r0} // *((vu32 *)(destp++)) = data
blt @20
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_DoAutoload
Description: 沿
0 4M bytes PSRAM
TWL
Arguments:
Returns:
*---------------------------------------------------------------------------*/
/*
* < >
* 0x02000000 Static ()
* 0x02000000
* NITRO ITCM 0x01ff8000
* NITRO DTCM 0x02fe0000
* 0x02400000 ()
* 0x04000 ROM 0x02f80000 - 0x02f84000 退
* 0x02400000
* TWL WRAM
* TWL
* NITRO 0x02400000
* 0x02400000
* .bss
*
*/
static asm void
INITi_DoAutoload(void)
{
@000:
stmdb sp!, {lr}
/* NITRO 共用ブロックの解凍 */
ldr r1, =_start_ModuleParams
ldr r0, [r1, #20] // r0 = bottom of compressed data
bl MIi_UncompressBackward
@010:
/* NITRO 共用ブロックをオートロード */
ldr r1, =_start_ModuleParams
ldr r12, [r1] // r12 = SDK_AUTOLOAD_LIST
ldr r0, [r1, #4] // r0 = SDK_AUTOLOAD_LIST_END
ldr r1, [r1, #8] // r1 = SDK_AUTOLOAD_START
@011: cmp r12, r0
bge @020
/* 固定セクションをロード */
stmdb sp!, {r0}
ldr r2, [r12], #4 // r2 = start address of destination range
stmdb sp!, {r2}
ldr r3, [r12], #4 // r3 = size of fixed section
add r3, r3, r2 // r3 = end address of destination range of fixed section
@012: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @012
/* .bss セクションを 0 クリア */
mov r0, #0 // r0 = number to fill .bss section
ldr r3, [r12], #4 // r3 = size of .bss section
add r3, r3, r2 // r3 = end address of destination range of .bss section
@013: cmp r2, r3
strlt r0, [r2], #4
blt @013
/* キャッシュを調整 */
ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE
cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE
cmpge r0, r2
bgt @015 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START
cmp r2, r0
addge r0, r0, #HW_DTCM_SIZE
cmpge r0, r2
bgt @015 // If D-TCM autoload block, skip cache control logic.
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
@014: cmp r2, r3
bge @015
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
add r2, r2, #HW_CACHE_LINE_SIZE
b @014
@015: ldmia sp!, {r0}
b @011
@020:
/* TWL ハードウェア上で動作しているかどうかを調査 */
ldr r1, =REG_CLK_ADDR
ldrh r0, [r1]
tst r0, #REG_SCFG_CLK_WRAMHCLK_MASK
beq @030
/* TWL 専用ブロックの存在を確認 */
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1cc /* ARM9 用拡張常駐モジュール ROM サイズ */
ldr r0, [r1]
cmp r0, #0
beq @030
/* 再読み出し不可部分を退避 */
bl INITi_ShelterLtdBinary
/* TWL 専用ブロックの解凍 */
ldr r1, =_start_LtdModuleParams
ldr r0, [r1, #12]
bl MIi_UncompressBackward
/* TWL 専用ブロックをオートロード */
ldr r1, =_start_LtdModuleParams
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r0, [r1, #4] // r0 = SDK_LTDAUTOLOAD_LIST_END
ldr r1, [r1, #8] // r1 = SDK_LTDAUTOLOAD_START
@021: cmp r12, r0
bge @030
/* 固定セクションをロード */
stmdb sp!, {r0}
ldr r2, [r12], #4 // r2 = start address of destination range
stmdb sp!, {r2}
ldr r3, [r12], #4 // r3 = size of fixed section
add r3, r3, r2 // r3 = end address of destination range of fixed section
@022: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @022
/* .bss セクションを 0 クリア */
mov r0, #0 // r0 = number to fill .bss section
ldr r3, [r12], #4 // r3 = size of .bss section
add r3, r3, r2 // r3 = end address of destination range of .bss section
@023: cmp r2, r3
strlt r0, [r2], #4
blt @023
/* キャッシュを調整 */
ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE
cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE
cmpge r0, r2
bgt @025 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START
cmp r2, r0
addge r0, r0, #HW_DTCM_SIZE
cmpge r0, r2
bgt @025 // If D-TCM autoload block, skip cache control logic.
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
@024: cmp r2, r3
bge @025
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
add r2, r2, #HW_CACHE_LINE_SIZE
b @024
@025: ldmia sp!, {r0}
b @021
@030: /* ライトバッファが空になるのを待つ */
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
/* オートロード完了コールバック関数呼び出し */
ldr r0, =_start_ModuleParams
ldr r1, =_start_LtdModuleParams
ldmia sp!, {lr}
b _start_AutoloadDoneCallback
}
/*---------------------------------------------------------------------------*
Name: INITi_ShelterLtdBinary
Description: TWL ROM
退退
ARM7 ARM9
0x4000 退
Arguments:
Returns: Returns:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static asm void static asm void
INITi_ShelterLtdBinary(void) INITi_CpuClear32(register u32 data, register void* destp, register u32 size)
{
/* ARM7 専用メインメモリ空間保護リージョンを一旦アクセス可能に変更 */
mrc p15, 0, r0, c5, c0, 3
mrc p15, 0, r1, c5, c0, 2
stmdb sp!, {r0, r1}
bic r0, r0, #(0xf << 8)
orr r0, r0, #(0x1 << 8)
bic r1, r1, #(0xf << 8)
orr r1, r1, #(0x1 << 8)
mcr p15, 0, r0, c5, c0, 3
mcr p15, 0, r1, c5, c0, 2
/* 退避元・先アドレスを調査 */
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1c8 /* ARM9 用拡張常駐モジュール RAM アドレス */
ldr r1, [r1]
ldr r3, =HW_TWL_ROM_HEADER_BUF + 0x038 /* ARM7 用常駐モジュール RAM アドレス */
ldr r3, [r3]
sub r3, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM7 用退避エリア */
sub r2, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM9 用退避エリア */
/* コピー */
@loop: ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @loop
/* ARM7 専用メインメモリ空間保護リージョン設定を元に戻す */
ldmia sp!, {r0, r1}
mcr p15, 0, r0, c5, c0, 3
mcr p15, 0, r1, c5, c0, 2
bx lr
}
/*---------------------------------------------------------------------------*
Name: MIi_UncompressBackward
Description: Uncompress special archive for module compression.
Arguments: bottom = Bottom adrs of packed archive + 1
bottom[-8..-6] = offset for top of compressed data
inp_top = bottom - bottom[-8..-6]
bottom[-5] = offset for bottom of compressed data
inp = bottom - bottom[-5]
bottom[-4..-1] = offset for bottom of original data
outp = bottom + bottom[-4..-1]
typedef struct
{
u32 bufferTop:24;
u32 compressBottom:8;
u32 originalBottom;
} CompFooter;
Returns: None.
*---------------------------------------------------------------------------*/
asm void
MIi_UncompressBackward(register void* bottom)
{
#define data r0
#define inp_top r1
#define outp r2
#define inp r3
#define outp_save r4
#define flag r5
#define count8 r6
#define index r7
#define len r12
cmp bottom, #0
beq @exit
stmfd sp!, {r4-r7}
ldmdb bottom, {r1-r2}
add outp, bottom, outp
sub inp, bottom, inp_top, LSR #24
bic inp_top, inp_top, #0xff000000
sub inp_top, bottom, inp_top
mov outp_save, outp
@loop:
cmp inp, inp_top // exit if inp==inp_top
ble @end_loop
ldrb flag, [inp, #-1]! // r4 = compress_flag = *--inp
mov count8, #8
@loop8:
subs count8, count8, #1
blt @loop
tst flag, #0x80
bne @blockcopy
@bytecopy:
ldrb data, [inp, #-1]!
strb data, [outp, #-1]! // Copy 1 byte
b @joinhere
@blockcopy:
ldrb len, [inp, #-1]!
ldrb index, [inp, #-1]!
orr index, index, len, LSL #8
bic index, index, #0xf000
add index, index, #0x0002
add len, len, #0x0020
@patterncopy:
ldrb data, [outp, index]
strb data, [outp, #-1]!
subs len, len, #0x0010
bge @patterncopy
@joinhere:
cmp inp, inp_top
mov flag, flag, LSL #1
bgt @loop8
@end_loop:
// DC_FlushRange & IC_InvalidateRange
mov r0, #0
bic inp, inp_top, #HW_CACHE_LINE_SIZE - 1
@cacheflush:
mcr p15, 0, r0, c7, c10, 4 // wait writebuffer empty
mcr p15, 0, inp, c7, c5, 1 // ICache
mcr p15, 0, inp, c7, c14, 1 // DCache
add inp, inp, #HW_CACHE_LINE_SIZE
cmp inp, outp_save
blt @cacheflush
ldmfd sp!, {r4-r7}
@exit bx lr
}
/*---------------------------------------------------------------------------*
Name: _start_AutoloadDoneCallback
Description:
Arguments: argv -
argv[0] = SDK_AUTOLOAD_LIST
argv[1] = SDK_AUTOLOAD_LIST_END
argv[2] = SDK_AUTOLOAD_START
argv[3] = SDK_STATIC_BSS_START
argv[4] = SDK_STATIC_BSS_END
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start_AutoloadDoneCallback(void* argv[])
{ {
add r12, r1, r2
@001: cmp r1, r12
strlt r0, [r1], #4
blt @001
bx lr bx lr
} }
@ -729,6 +406,7 @@ INITi_InitRegion(void)
// ldr r0, =REGION_ACC(RW, RW, NA, RW, RW, RW, RO, RW) // ldr r0, =REGION_ACC(RW, RW, NA, RW, RW, RW, RO, RW)
ldr r0, =REGION_ACC(RW, RW, RW, RW, RW, RW, RO, RW) ldr r0, =REGION_ACC(RW, RW, RW, RW, RW, RW, RO, RW)
mcr p15, 0, r0, c5, c0, 2 mcr p15, 0, r0, c5, c0, 2
b @003 b @003
@002: /* ハードウェアが NITRO の場合 */ @002: /* ハードウェアが NITRO の場合 */
@ -795,6 +473,412 @@ INITi_InitRegion(void)
bx lr bx lr
} }
/*---------------------------------------------------------------------------*
Name: INITi_DoAutoload
Description: 沿
0 4M bytes PSRAM
TWL
Arguments:
Returns:
*---------------------------------------------------------------------------*/
/*
* < >
* 0x02000000 Static ()
* 0x02000000
* NITRO ITCM 0x01ff8000
* NITRO DTCM 0x02fe0000
* 0x02400000 ()
* 0x04000 ROM 0x02f80000 - 0x02f84000 退
* 0x02400000
* TWL WRAM
* TWL
* NITRO 0x02400000
* 0x02400000
* .bss
*
*/
static asm void
INITi_DoAutoload(void)
{
@000:
stmdb sp!, {lr}
/* NITRO 共用ブロックの解凍 */
ldr r1, =_start_ModuleParams
ldr r0, [r1, #20] // r0 = bottom of compressed data
bl MIi_UncompressBackward
@010:
/* NITRO 共用ブロックをオートロード */
ldr r1, =_start_ModuleParams
ldr r12, [r1] // r12 = SDK_AUTOLOAD_LIST
ldr r0, [r1, #4] // r0 = SDK_AUTOLOAD_LIST_END
ldr r1, [r1, #8] // r1 = SDK_AUTOLOAD_START
@011: cmp r12, r0
bge @020
/* 固定セクションをロード */
stmdb sp!, {r0}
ldr r2, [r12], #4 // r2 = start address of destination range
stmdb sp!, {r2}
ldr r3, [r12], #4 // r3 = size of fixed section
add r3, r3, r2 // r3 = end address of destination range of fixed section
@012: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @012
/* static initializer テーブル情報を読み出し */
ldr r0, [r12], #4 // r0 = address of the table managing pointers of static initializers
#ifndef SDK_NOINIT
stmdb sp!, {r0-r3, r12}
bl INITi_ShelterStaticInitializer
ldmia sp!, {r0-r3, r12}
#endif
/* .bss セクションを 0 クリア */
mov r0, #0 // r0 = number to fill .bss section
ldr r3, [r12], #4 // r3 = size of .bss section
add r3, r3, r2 // r3 = end address of destination range of .bss section
@013: cmp r2, r3
strlt r0, [r2], #4
blt @013
/* キャッシュを調整 */
ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE
cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE
cmpge r0, r2
bgt @015 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START
cmp r2, r0
addge r0, r0, #HW_DTCM_SIZE
cmpge r0, r2
bgt @015 // If D-TCM autoload block, skip cache control logic.
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
@014: cmp r2, r3
bge @015
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
add r2, r2, #HW_CACHE_LINE_SIZE
b @014
@015: ldmia sp!, {r0}
b @011
@020:
/* TWL ハードウェア上で動作しているかどうかを調査 */
ldr r1, =REG_CLK_ADDR
ldrh r0, [r1]
tst r0, #REG_SCFG_CLK_WRAMHCLK_MASK
beq @030
/* TWL 専用ブロックの存在を確認 */
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1cc /* ARM9 用拡張常駐モジュール ROM サイズ */
ldr r0, [r1]
cmp r0, #0
beq @030
/* 再読み出し不可部分を退避 */
bl INITi_ShelterLtdBinary
/* TWL 専用ブロックの解凍 */
ldr r1, =_start_LtdModuleParams
ldr r0, [r1, #12]
bl MIi_UncompressBackward
/* TWL 専用ブロックをオートロード */
ldr r1, =_start_LtdModuleParams
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r0, [r1, #4] // r0 = SDK_LTDAUTOLOAD_LIST_END
ldr r1, [r1, #8] // r1 = SDK_LTDAUTOLOAD_START
@021: cmp r12, r0
bge @030
/* 固定セクションをロード */
stmdb sp!, {r0}
ldr r2, [r12], #4 // r2 = start address of destination range
stmdb sp!, {r2}
ldr r3, [r12], #4 // r3 = size of fixed section
add r3, r3, r2 // r3 = end address of destination range of fixed section
@022: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @022
/* static initializer テーブル情報を読み出し */
ldr r0, [r12], #4 // r0 = address of the table managing pointers of static initializers
#ifndef SDK_NOINIT
stmdb sp!, {r0-r3, r12}
bl INITi_ShelterStaticInitializer
ldmia sp!, {r0-r3, r12}
#endif
/* .bss セクションを 0 クリア */
mov r0, #0 // r0 = number to fill .bss section
ldr r3, [r12], #4 // r3 = size of .bss section
add r3, r3, r2 // r3 = end address of destination range of .bss section
@023: cmp r2, r3
strlt r0, [r2], #4
blt @023
/* キャッシュを調整 */
ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE
cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE
cmpge r0, r2
bgt @025 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START
cmp r2, r0
addge r0, r0, #HW_DTCM_SIZE
cmpge r0, r2
bgt @025 // If D-TCM autoload block, skip cache control logic.
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
@024: cmp r2, r3
bge @025
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
add r2, r2, #HW_CACHE_LINE_SIZE
b @024
@025: ldmia sp!, {r0}
b @021
@030: /* ライトバッファが空になるのを待つ */
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
/* オートロード完了コールバック関数呼び出し */
ldr r0, =_start_ModuleParams
ldr r1, =_start_LtdModuleParams
ldmia sp!, {lr}
b _start_AutoloadDoneCallback
}
/*---------------------------------------------------------------------------*
Name: INITi_ShelterLtdBinary
Description: TWL ROM
退退
ARM7 ARM9
0x4000 退
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_ShelterLtdBinary(void)
{
/* ARM7 専用メインメモリ空間保護リージョンを一旦アクセス可能に変更 */
mrc p15, 0, r0, c5, c0, 3
mrc p15, 0, r1, c5, c0, 2
stmdb sp!, {r0, r1}
bic r0, r0, #(0xf << 8)
orr r0, r0, #(0x1 << 8)
bic r1, r1, #(0xf << 8)
orr r1, r1, #(0x1 << 8)
mcr p15, 0, r0, c5, c0, 3
mcr p15, 0, r1, c5, c0, 2
/* 退避元・先アドレスを調査 */
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1c8 /* ARM9 用拡張常駐モジュール RAM アドレス */
ldr r1, [r1]
ldr r3, =HW_TWL_ROM_HEADER_BUF + 0x038 /* ARM7 用常駐モジュール RAM アドレス */
ldr r3, [r3]
sub r3, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM7 用退避エリア */
sub r2, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM9 用退避エリア */
/* コピー */
@loop: ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @loop
/* ARM7 専用メインメモリ空間保護リージョン設定を元に戻す */
ldmia sp!, {r0, r1}
mcr p15, 0, r0, c5, c0, 3
mcr p15, 0, r1, c5, c0, 2
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_ShelterStaticInitializer
Description: static initializer
IRQ ( 4 )
退
Arguments: ptr -
NULL
Returns:
*---------------------------------------------------------------------------*/
#ifndef SDK_NOINIT
static asm void
INITi_ShelterStaticInitializer(u32* ptr)
{
/* 引数確認 */
cmp r0, #0
bxeq lr
/* 退避場所先頭アドレスを計算 */
ldr r1, =SDK_AUTOLOAD_DTCM_START
add r1, r1, #HW_DTCM_SIZE
sub r1, r1, #HW_DTCM_SYSRV_SIZE
sub r1, r1, #HW_SVC_STACK_SIZE
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
/* 退避場所先頭から空き場所を調査 */
@001: ldr r2, [r1]
cmp r2, #0
addne r1, r1, #4
bne @001
/* 空き場所にテーブルをコピー */
@002: ldr r2, [r0], #4
str r2, [r1], #4
cmp r2, #0
bne @002
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_CallStaticInitializers
Description: static initializer
IRQ ( 4
) 退
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_CallStaticInitializers(void)
{
stmdb sp!, {lr}
/* テーブル退避場所先頭アドレスを計算 */
ldr r1, =SDK_AUTOLOAD_DTCM_START
add r1, r1, #HW_DTCM_SIZE
sub r1, r1, #HW_DTCM_SYSRV_SIZE
sub r1, r1, #HW_SVC_STACK_SIZE
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
/* テーブルに管理されているポインタを一つずつ呼び出し */
@001: ldr r0, [r1]
cmp r0, #0
beq @002
stmdb sp!, {r1}
blx r0
ldmia sp!, {r1}
/* 一旦呼び出したポインタはゼロクリア (IRQスタックを間借りしている為) */
mov r0, #0
str r0, [r1], #4
b @001
@002:
ldmia sp!, {lr}
bx lr
}
#endif
/*---------------------------------------------------------------------------*
Name: MIi_UncompressBackward
Description: Uncompress special archive for module compression.
Arguments: bottom = Bottom adrs of packed archive + 1
bottom[-8..-6] = offset for top of compressed data
inp_top = bottom - bottom[-8..-6]
bottom[-5] = offset for bottom of compressed data
inp = bottom - bottom[-5]
bottom[-4..-1] = offset for bottom of original data
outp = bottom + bottom[-4..-1]
typedef struct
{
u32 bufferTop:24;
u32 compressBottom:8;
u32 originalBottom;
} CompFooter;
Returns: None.
*---------------------------------------------------------------------------*/
asm void
MIi_UncompressBackward(register void* bottom)
{
#define data r0
#define inp_top r1
#define outp r2
#define inp r3
#define outp_save r4
#define flag r5
#define count8 r6
#define index r7
#define len r12
cmp bottom, #0
beq @exit
stmfd sp!, {r4-r7}
ldmdb bottom, {r1-r2}
add outp, bottom, outp
sub inp, bottom, inp_top, LSR #24
bic inp_top, inp_top, #0xff000000
sub inp_top, bottom, inp_top
mov outp_save, outp
@loop:
cmp inp, inp_top // exit if inp==inp_top
ble @end_loop
ldrb flag, [inp, #-1]! // r4 = compress_flag = *--inp
mov count8, #8
@loop8:
subs count8, count8, #1
blt @loop
tst flag, #0x80
bne @blockcopy
@bytecopy:
ldrb data, [inp, #-1]!
strb data, [outp, #-1]! // Copy 1 byte
b @joinhere
@blockcopy:
ldrb len, [inp, #-1]!
ldrb index, [inp, #-1]!
orr index, index, len, LSL #8
bic index, index, #0xf000
add index, index, #0x0002
add len, len, #0x0020
@patterncopy:
ldrb data, [outp, index]
strb data, [outp, #-1]!
subs len, len, #0x0010
bge @patterncopy
@joinhere:
cmp inp, inp_top
mov flag, flag, LSL #1
bgt @loop8
@end_loop:
// DC_FlushRange & IC_InvalidateRange
mov r0, #0
bic inp, inp_top, #HW_CACHE_LINE_SIZE - 1
@cacheflush:
mcr p15, 0, r0, c7, c10, 4 // wait writebuffer empty
mcr p15, 0, inp, c7, c5, 1 // ICache
mcr p15, 0, inp, c7, c14, 1 // DCache
add inp, inp, #HW_CACHE_LINE_SIZE
cmp inp, outp_save
blt @cacheflush
ldmfd sp!, {r4-r7}
@exit bx lr
}
/*---------------------------------------------------------------------------*
Name: _start_AutoloadDoneCallback
Description:
Arguments: argv -
argv[0] = SDK_AUTOLOAD_LIST
argv[1] = SDK_AUTOLOAD_LIST_END
argv[2] = SDK_AUTOLOAD_START
argv[3] = SDK_STATIC_BSS_START
argv[4] = SDK_STATIC_BSS_END
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start_AutoloadDoneCallback(void* argv[])
{
bx lr
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: TwlStartUp Name: TwlStartUp