mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ゲームモード関数統一に伴うコードの整理。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@785 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
339352192e
commit
436cdb8f2e
@ -1,8 +1,8 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Project: TwlSDK
|
Project: TwlIPL
|
||||||
File: hotsw.c
|
File: hotsw.c
|
||||||
|
|
||||||
Copyright 2007 Nintendo. All rights reserved.
|
Copyright 2007-2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
These coded instructions, statements, and computer programs contain
|
These coded instructions, statements, and computer programs contain
|
||||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
@ -422,7 +422,7 @@ static HotSwState LoadCardData(void)
|
|||||||
|
|
||||||
// ---------------------- Game Mode ----------------------
|
// ---------------------- Game Mode ----------------------
|
||||||
// ID読み込み
|
// ID読み込み
|
||||||
state = s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
state = ReadIDGame(&s_cbData);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// バナーファイルの読み込み
|
// バナーファイルの読み込み
|
||||||
@ -497,8 +497,7 @@ static HotSwState LoadBannerData(void)
|
|||||||
|
|
||||||
// バナーリード
|
// バナーリード
|
||||||
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
|
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
|
||||||
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset,
|
||||||
s_cbData.pBootSegBuf->rh.s.banner_offset,
|
|
||||||
(u32 *)SYSM_CARD_BANNER_BUF,
|
(u32 *)SYSM_CARD_BANNER_BUF,
|
||||||
sizeof(TWLBannerFile) );
|
sizeof(TWLBannerFile) );
|
||||||
|
|
||||||
@ -544,10 +543,9 @@ static HotSwState LoadStaticModule(void)
|
|||||||
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
|
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
|
||||||
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
|
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
||||||
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
||||||
s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
|
||||||
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
|
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
|
||||||
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
|
|
||||||
|
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
return retval;
|
return retval;
|
||||||
@ -556,7 +554,7 @@ static HotSwState LoadStaticModule(void)
|
|||||||
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
||||||
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
||||||
state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size);
|
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
@ -570,14 +568,13 @@ static HotSwState LoadStaticModule(void)
|
|||||||
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
|
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
|
||||||
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
|
||||||
state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size);
|
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
|
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
|
||||||
state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
|
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
|
||||||
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
|
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
|
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,7 +585,7 @@ static HotSwState LoadStaticModule(void)
|
|||||||
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
||||||
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
||||||
state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
@ -671,7 +668,7 @@ static HotSwState CheckCardAuthCode(void)
|
|||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = s_funcTable[s_cbData.cardType].ReadPage_G( &s_cbData, page_offset, authBuf, MB_AUTHCODE_SIZE );
|
retval = ReadPageGame( &s_cbData, page_offset, authBuf, MB_AUTHCODE_SIZE );
|
||||||
|
|
||||||
p += auth_offset & 0x000001FF;
|
p += auth_offset & 0x000001FF;
|
||||||
if( *p++ == 'a' && *p == 'c' ) {
|
if( *p++ == 'a' && *p == 'c' ) {
|
||||||
|
|||||||
@ -287,97 +287,16 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
// ■ ゲームモードのコマンド ■
|
// ■ ゲームモードのコマンド ■
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
#if 0
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ReadIDGame_ROMEMU
|
Name: ReadIDGame_ROMEMU
|
||||||
|
|
||||||
Description: ゲームモードでIDを読み込む
|
Description: ゲームモードでIDを読み込む
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDGame_ROMEMU(CardBootData *cbd)
|
// 共通
|
||||||
{
|
|
||||||
#pragma unused( cbd )
|
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// カード割り込みによるDMAコピー
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x000000B8;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ReadPageGame_ROMEMU
|
Name: ReadPageGame_ROMEMU
|
||||||
|
|
||||||
Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
// 共通
|
||||||
{
|
|
||||||
#pragma unused( cbd )
|
|
||||||
|
|
||||||
u32 loop, counter=0;
|
|
||||||
u64 i, page;
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
page = (u32)(start_addr / PAGE_SIZE);
|
|
||||||
loop = (u32)(size / PAGE_SIZE);
|
|
||||||
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
|
|
||||||
|
|
||||||
OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf);
|
|
||||||
OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
|
|
||||||
|
|
||||||
for(i=0; i<loop; i++){
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// コマンド作成
|
|
||||||
cndLE.dw = (page + i) << 33;
|
|
||||||
cndLE.dw |= 0xB700000000000000;
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = d に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
|
||||||
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user