TwlSDK 2947-2994対応

SCFGのWRAMコピー対応
いろいろ整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@343 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-12-11 10:34:23 +00:00
parent 61265162f7
commit 09e141f8c6
4 changed files with 130 additions and 100 deletions

View File

@ -16,19 +16,24 @@
# $Author:$ # $Author:$
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
override TARGET_CODEGEN := ARM
SUBDIRS = SUBDIRS =
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Codegen for sub processer # Codegen for sub processer
TWL_PROC = ARM7 override TWL_PROC = ARM7
SRCS = crt0_firm.c \ # Avoid to use pre-compile-header of "nitro.h"
TWL_NO_STD_PCHDR = True
TARGET_OBJ = crt0_firm.o # Avoid to build THUMB version object
override TWL_CODEGEN = ARM
SRCS = crt0_firm.c
TARGET_OBJ = crt0_firm.o
MACRO_FLAGS += -DSDK_NOINIT
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -14,9 +14,10 @@
$Rev$ $Rev$
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <twl/code32.h>
#include <firm.h> #include <firm.h>
#include <twl/hw/ARM7/mmap_wramEnv.h> #include <twl/hw/common/mmap_wramEnv.h>
#include <twl/code32.h>
void _start(void); void _start(void);
void _start_AutoloadDoneCallback(void *argv[]); void _start_AutoloadDoneCallback(void *argv[]);
@ -27,10 +28,6 @@ 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
// volatile parameters in IPL's work memory
#define IPL_PARAM_CARD_ROM_HEADER 0x023FE940
#define IPL_PARAM_DOWNLOAD_PARAMETER 0x023FE904
/* ŠO•”ŠÖ<C5A0>”ŽQ<C5BD>Æè` */ /* ŠO•”ŠÖ<C5A0>”ŽQ<C5BD>Æè` */
extern void OS_IrqHandler(void); extern void OS_IrqHandler(void);
extern void _fp_init(void); extern void _fp_init(void);
@ -38,6 +35,7 @@ extern void __call_static_initializers(void);
static void INITi_DoAutoload(void); static void INITi_DoAutoload(void);
static void INITi_ShelterLtdBinary(void); static void INITi_ShelterLtdBinary(void);
static void INITi_CopySysConfig( void );
static void detect_main_memory_size(void); static void detect_main_memory_size(void);
#ifndef SDK_NOINIT #ifndef SDK_NOINIT
static void INITi_ShelterStaticInitializer(u32* ptr); static void INITi_ShelterStaticInitializer(u32* ptr);
@ -113,8 +111,8 @@ SDK_WEAK_SYMBOL asm void _start( void )
msr cpsr_csfx, r0 msr cpsr_csfx, r0
sub sp, r1, #4 // 4byte for stack check code sub sp, r1, #4 // 4byte for stack check code
//---- read reset flag from pmic
#ifdef FIRM_DISABLE_CR_AT_WARMBOOT #ifdef FIRM_DISABLE_CR_AT_WARMBOOT
//---- read reset flag from mcu
#ifdef SDK_TS #ifdef SDK_TS
#if 0 #if 0
mov r0, #REG_PMIC_SW_FLAGS_ADDR mov r0, #REG_PMIC_SW_FLAGS_ADDR
@ -144,32 +142,13 @@ SDK_WEAK_SYMBOL asm void _start( void )
tst r2, r1 tst r2, r1
beq @1 beq @1
#if 0
// move parameters from IPL's work memory to shared area
ldr r0, =IPL_PARAM_CARD_ROM_HEADER
ldr r1, =HW_CARD_ROM_HEADER
add r2, r1, #HW_CARD_ROM_HEADER_SIZE
@1_1:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
bmi @1_1
ldr r0, =IPL_PARAM_DOWNLOAD_PARAMETER
add r2, r1, #HW_DOWNLOAD_PARAMETER_SIZE
@1_2:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
bmi @1_2
#endif
//---- load autoload block and initialize bss //---- load autoload block and initialize bss
//bl INITi_DoAutoload //bl INITi_DoAutoload
#ifndef SDK_FINALROM // for IS-TWL-DEBUGGER #ifndef SDK_FINALROM // for IS-TWL-DEBUGGER
bl _start_AutoloadDoneCallback bl _start_AutoloadDoneCallback
#endif #endif
//---- fill static static bss with 0 //---- fill static bss with 0
ldr r0, =_start_ModuleParams ldr r0, =_start_ModuleParams
ldr r1, [r0, #12] // BSS segment start ldr r1, [r0, #12] // BSS segment start
ldr r2, [r0, #16] // BSS segment end ldr r2, [r0, #16] // BSS segment end
@ -178,6 +157,9 @@ SDK_WEAK_SYMBOL asm void _start( void )
strcc r0, [r1], #4 strcc r0, [r1], #4
bcc @2 bcc @2
/* SCFG ‚ð HW_SYS_CONF_BUF ÖƒRƒs<C692>[ */
bl INITi_CopySysConfig
//---- detect main memory size //---- detect main memory size
bl detect_main_memory_size bl detect_main_memory_size
@ -424,6 +406,75 @@ _start_AutoloadDoneCallback(void* argv[])
bx lr bx lr
} }
/*---------------------------------------------------------------------------*
Name: INITi_CopySysConfig
Description: copy SCFG registers to HW_SYS_CONF_BUF and HW_PRV_WRAM_SYSRV
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static asm void INITi_CopySysConfig( void )
{
//################ temp: this process will be done in IPL
// SCFG enable?
ldr r2, =REG_EXT_ADDR
ldr r0, [r2]
tst r0, #0x80000000
beq @9
ldr r2, =HW_PRV_WRAM_SYSRV
//EXT(extentions)
ldr r3, =REG_EXT_ADDR
ldr r0, [r3]
str r0, [r2, #HWi_WSYS04_WRAMOFFSET]
//OPT(bonding option)
ldr r3, =REG_OP_ADDR
ldrb r0, [r3]
//A9ROM(ARM9 ROM)
ldr r3, =REG_A9ROM_ADDR
ldrb r1, [r3]
and r12,r1, #(REG_SCFG_A9ROM_RSEL_MASK | REG_SCFG_A9ROM_SEC_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS08_ROM_ARM9SEC_SHIFT - REG_SCFG_A9ROM_SEC_SHIFT)
//A7ROM(ARM7 ROM)
ldr r3, =REG_A7ROM_ADDR
ldrb r1, [r3]
and r12,r1, #(REG_SCFG_A7ROM_RSEL_MASK | REG_SCFG_A7ROM_SEC_MASK | REG_SCFG_A7ROM_FUSE_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS08_ROM_ARM7SEC_SHIFT - REG_SCFG_A7ROM_SEC_SHIFT)
//DS-WL(DS wireless)
ldr r3, =REG_A7ROM_ADDR
ldrb r1, [r3]
and r12,r1, #REG_SCFG_WL_OFFB_MASK
orr r0, r0, r12, LSL #(HWi_WSYS08_WL_OFFB_SHIFT - REG_SCFG_WL_OFFB_SHIFT)
strb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
//OPT(JTAG info)
ldr r3, =REG_JTAG_ADDR
ldrh r0, [r3]
and r12,r0, #REG_SCFG_JTAG_DSPJE_MASK
orr r0, r0, r12, LSR #(REG_SCFG_JTAG_DSPJE_SHIFT - HWi_WSYS09_JTAG_DSPJE_SHIFT)
//CLK(only wram clock)
ldr r3, =REG_CLK_ADDR
ldrh r1, [r3]
and r12,r1, #(REG_SCFG_CLK_AESHCLK_MASK | REG_SCFG_CLK_SD2HCLK_MASK | REG_SCFG_CLK_SD1HCLK_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS09_CLK_SD1HCLK_SHIFT - REG_SCFG_CLK_SD1HCLK_SHIFT)
and r12,r1, #(REG_SCFG_CLK_SNDMCLK_MASK | REG_SCFG_CLK_WRAMHCLK_MASK)
orr r0, r0, r12, LSR #(REG_SCFG_CLK_WRAMHCLK_SHIFT - HWi_WSYS09_CLK_WRAMHCLK_SHIFT)
strb r0, [r2, #HWi_WSYS09_WRAMOFFSET]
@9:
//################
//---- copy scfg setting
ldr r2, =HW_PRV_WRAM_SYSRV
ldr r3, =HW_SYS_CONF_BUF
ldr r0, [r2, #HWi_WSYS04_WRAMOFFSET]
str r0, [r3, #HWi_WSYS04_OFFSET]
ldrh r0, [r2, #HWi_WSYS08_WRAMOFFSET]
strh r0, [r3, #HWi_WSYS08_OFFSET]
bx lr
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: detect_main_memory_size Name: detect_main_memory_size
@ -443,42 +494,11 @@ _start_AutoloadDoneCallback(void* argv[])
static asm void detect_main_memory_size( void ) static asm void detect_main_memory_size( void )
{ {
//################ this process is required before IPL stmfd sp!, {r4,lr}
#if 0
// SCFG enable?
ldr r2, =REG_EXT_ADDR
ldr r0, [r2]
tst r0, #0x80000000
beq @9
#endif
ldr r2, =HW_PRV_WRAM_SYSRV
//OPT(bonding option)
ldr r3, =REG_OP_ADDR
ldrh r0, [r3]
strh r0, [r2, #8]
//OPT(JTAG info)
ldr r3, =REG_JTAG_ADDR
ldrb r0, [r3]
//CLK(only wram clock)
ldr r3, =REG_CLK_ADDR
ldrh r1, [r3]
and r1, r1, #0x80
orr r0, r0, r1, LSR 1
strb r0, [r2, #9]
@9:
//################
//---- copy scfg setting
ldr r2, =HW_PRV_WRAM_SYSRV
ldr r3, =HW_SYS_CONF_BUF
ldr r0, [r2, #HWi_WSYS04_WRAMOFFSET]
str r0, [r3, #HWi_WSYS04_OFFSET]
ldrh r0, [r2, #HWi_WSYS08_WRAMOFFSET]
strh r0, [r3, #HWi_WSYS08_OFFSET]
//---- detect memory size //---- detect memory size
#if 0 // NITRO hardware is not supported #if 0
mov r0, #OS_CONSOLE_SIZE_4MB mov r4, #OS_CONSOLE_SIZE_4MB
mov r1, #0 mov r1, #0
ldr r2, =HW_MMEMCHECKER_SUB ldr r2, =HW_MMEMCHECKER_SUB
@ -499,15 +519,13 @@ static asm void detect_main_memory_size( void )
//---- 8MB or 16MB or 32MB //---- 8MB or 16MB or 32MB
@2: @2:
// check if running on twl/nitro // check if running on twl/nitro
ldr r1, =HW_SYS_CONF_BUF bl INITi_IsRunOnTwl
ldrb r12, [r1,#HWi_WSYS09_OFFSET] cmp r0, #FALSE
tst r12, #HWi_WSYS09_CLK_WRAMHCLK_MASK moveq r4, #OS_CONSOLE_SIZE_8MB
moveq r0, #OS_CONSOLE_SIZE_8MB
beq @4 beq @4
#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
@ -516,24 +534,24 @@ static asm void detect_main_memory_size( void )
ldrh r12, [r3] ldrh r12, [r3]
cmp r1, r12 cmp r1, r12
movne r0, #OS_CONSOLE_SIZE_32MB movne r4, #OS_CONSOLE_SIZE_32MB
bne @4 bne @4
add r1, r1, #1 add r1, r1, #1
cmp r1, #2 // check 2 loop cmp r1, #2 // check 2 loop
bne @3 bne @3
mov r0, #OS_CONSOLE_SIZE_16MB mov r4, #OS_CONSOLE_SIZE_16MB
@4: @4:
//---- check SMX_CNT //---- check SMX_CNT
ldr r3, =REG_SMX_CNT_ADDR ldr r3, =REG_SMX_CNT_ADDR
ldrh r1, [r3] ldrh r1, [r3]
and r1, r1, #OSi_DETECT_NITRO_MASK and r1, r1, #OSi_DETECT_NITRO_MASK
cmp r1, #OSi_DETECT_NITRO_VAL cmp r1, #OSi_DETECT_NITRO_VAL
orreq r0, r0, #OS_CHIPTYPE_SMX_MASK orreq r4, r4, #OS_CHIPTYPE_SMX_MASK
strb r0, [r2] strb r4, [r2]
ldmfd sp!, {r4,lr}
bx lr bx lr
} }
@ -549,3 +567,5 @@ static asm void detect_main_memory_size( void )
SDK_WEAK_SYMBOL void TwlSpStartUp(void) SDK_WEAK_SYMBOL void TwlSpStartUp(void)
{ {
} }
#include <twl/codereset.h>

View File

@ -16,15 +16,21 @@
# $Author:$ # $Author:$
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
override TARGET_CODEGEN := ARM
SUBDIRS = SUBDIRS =
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
SRCS = crt0_firm.c \ # Avoid to use pre-compile-header of "nitro.h"
TWL_NO_STD_PCHDR = True
TARGET_OBJ = crt0_firm.o # Avoid to build THUMB version object
override TWL_CODEGEN = ARM
SRCS = crt0_firm.c
TARGET_OBJ = crt0_firm.o
MACRO_FLAGS += -DSDK_NOINIT
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -14,9 +14,10 @@
$Rev$ $Rev$
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <twl/code32.h>
#include <firm.h> #include <firm.h>
#include <twl/code32.h>
void _start(void); void _start(void);
void _start_AutoloadDoneCallback(void *argv[]); void _start_AutoloadDoneCallback(void *argv[]);
@ -338,6 +339,8 @@ INITi_InitCoprocessor(void)
static asm void static asm void
INITi_InitRegion(void) INITi_InitRegion(void)
{ {
mov r12, lr
#define SET_PROTECTION_A(id, adr, siz) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE) #define SET_PROTECTION_A(id, adr, siz) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE)
#define SET_PROTECTION_B(id, adr, siz) mcr p15, 0, r0, c6, id, 0 #define SET_PROTECTION_B(id, adr, siz) mcr p15, 0, r0, c6, id, 0
#define REGION_BIT(a, b, c, d, e, f, g, h) (((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7)) #define REGION_BIT(a, b, c, d, e, f, g, h) (((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7))
@ -364,10 +367,11 @@ INITi_InitRegion(void)
SET_PROTECTION_B(c6, HW_BIOS, 32KB) SET_PROTECTION_B(c6, HW_BIOS, 32KB)
/* TWL ハードウェア上で動作しているかどうかを調査 */ /* TWL ハードウェア上で動作しているかどうかを調査 */
ldr r1, =REG_CLK_ADDR #if 0
ldrh r0, [r1] bl INITi_IsRunOnTwl
tst r0, #REG_SCFG_CLK_WRAMHCLK_MASK cmp r0, #FALSE
beq @002 beq @002
#endif
@001: /* ハードウェアが TWL の場合 */ @001: /* ハードウェアが TWL の場合 */
/* (1) メインメモリ及び WRAM */ /* (1) メインメモリ及び WRAM */
@ -408,7 +412,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
#if 0
b @003 b @003
@002: /* ハードウェアが NITRO の場合 */ @002: /* ハードウェアが NITRO の場合 */
@ -433,7 +437,7 @@ INITi_InitRegion(void)
/* (7) ARM9/ARM7 共有メインメモリ空間 */ /* (7) ARM9/ARM7 共有メインメモリ空間 */
SET_PROTECTION_A(c7, HW_MAIN_MEM_SHARED, 4KB) SET_PROTECTION_A(c7, HW_MAIN_MEM_SHARED, 4KB)
SET_PROTECTION_B(c7, HW_MAIN_MEM_SHARED, 4KB) SET_PROTECTION_B(c7, HW_MAIN_MEM_SHARED, 4KB)
#if 0
/* 命令キャッシュ許可 */ /* 命令キャッシュ許可 */
mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0) mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0)
mcr p15, 0, r0, c2, c0, 1 mcr p15, 0, r0, c2, c0, 1
@ -456,14 +460,6 @@ 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)
mcr p15, 0, r0, c5, c0, 2 mcr p15, 0, r0, c5, c0, 2
#else // NITROS•s‰Â
mov r0, #REGION_BIT(0, 0, 0, 0, 0, 0, 0, 0)
mcr p15, 0, r0, c2, c0, 1
mcr p15, 0, r0, c2, c0, 0
mcr p15, 0, r0, c3, c0, 0
ldr r0, =REGION_ACC(NA, NA, NA, NA, NA, NA, NA, NA)
mcr p15, 0, r0, c5, c0, 3
mcr p15, 0, r0, c5, c0, 2
#endif #endif
@003: /* プロテクションユニット及びキャッシュ使用許可設定 */ @003: /* プロテクションユニット及びキャッシュ使用許可設定 */
mrc p15, 0, r0, c1, c0, 0 mrc p15, 0, r0, c1, c0, 0
@ -479,7 +475,7 @@ INITi_InitRegion(void)
mcr p15, 0, r1, c7, c6, 0 mcr p15, 0, r1, c7, c6, 0
mcr p15, 0, r1, c7, c5, 0 mcr p15, 0, r1, c7, c5, 0
bx lr bx r12
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -554,7 +550,7 @@ INITi_DoAutoload(void)
ldmia sp!, {r2} // r2 = start address of destination range ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE mov r0, #HW_ITCM_IMAGE
cmp r2, r0 cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE movge r0, #HW_ITCM_END
cmpge r0, r2 cmpge r0, r2
bgt @015 // If I-TCM autoload block, skip cache control logic. bgt @015 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START ldr r0, =SDK_AUTOLOAD_DTCM_START
@ -574,10 +570,11 @@ INITi_DoAutoload(void)
@020: @020:
/* TWL ハードウェア上で動作しているかどうかを調査 */ /* TWL ハードウェア上で動作しているかどうかを調査 */
ldr r1, =REG_CLK_ADDR #if 0
ldrh r0, [r1] bl INITi_IsRunOnTwl
tst r0, #REG_SCFG_CLK_WRAMHCLK_MASK cmp r0, #FALSE
beq @030 beq @030
#endif
/* TWL 専用ブロックの存在を確認 */ /* TWL 専用ブロックの存在を確認 */
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1cc /* ARM9 用拡張常駐モジュール ROM サイズ */ ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1cc /* ARM9 用拡張常駐モジュール ROM サイズ */
@ -628,7 +625,7 @@ INITi_DoAutoload(void)
ldmia sp!, {r2} // r2 = start address of destination range ldmia sp!, {r2} // r2 = start address of destination range
mov r0, #HW_ITCM_IMAGE mov r0, #HW_ITCM_IMAGE
cmp r2, r0 cmp r2, r0
addge r0, r0, #HW_ITCM_SIZE movge r0, #HW_ITCM_END
cmpge r0, r2 cmpge r0, r2
bgt @025 // If I-TCM autoload block, skip cache control logic. bgt @025 // If I-TCM autoload block, skip cache control logic.
ldr r0, =SDK_AUTOLOAD_DTCM_START ldr r0, =SDK_AUTOLOAD_DTCM_START
@ -915,3 +912,5 @@ void OSi_ReferSymbol(void *symbol)
{ {
#pragma unused(symbol) #pragma unused(symbol)
} }
#include <twl/codereset.h>