(更新:Akabane Jumpei)

・WRAM経由カードアプリロード実装中。
ARM9側のカードリード関数を、エラーを返すように修正。(今後エラー内容の修正あり)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1331 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-05-14 00:57:30 +00:00
parent 6bbf963809
commit 1c786636b6
4 changed files with 134 additions and 113 deletions

View File

@ -109,7 +109,7 @@ static BOOL CheckArm9HashValue(void);
static BOOL CheckExtArm7HashValue(void); static BOOL CheckExtArm7HashValue(void);
static BOOL CheckExtArm9HashValue(void); static BOOL CheckExtArm9HashValue(void);
#else #else
static HotSwState ReadCardData(u32 src, u32 dest, u32 size); static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size);
#endif #endif
static void ShowRegisterData(void); static void ShowRegisterData(void);
@ -886,18 +886,13 @@ static HotSwState LoadBannerData(void)
twl_card_keytable_area_rom_offset -> KeyTable2領域オフセット twl_card_keytable_area_rom_offset -> KeyTable2領域オフセット
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD #ifdef USE_WRAM_LOAD
static HotSwState ReadCardData(u32 src, u32 dest, u32 size) static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
{ {
u32 sendSize = 0; u32 sendSize = 0;
u32 remainSize = size; BOOL result = TRUE;
u32 srcAdd = src;
u32 destAdd = dest;
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
if(!SYSMi_GetWork()->flags.hotsw.isCardGameMode){ if(!SYSMi_GetWork()->flags.hotsw.isCardGameMode){
// [TODO] 適切なエラーコード作って、返す return CARD_READ_MODE_ERROR;
return HOTSW_UNEXPECTED_ERROR;
} }
// カードのロック // カードのロック
@ -907,26 +902,28 @@ static HotSwState ReadCardData(u32 src, u32 dest, u32 size)
LockExCard(s_CardLockID); LockExCard(s_CardLockID);
#endif #endif
while(remainSize > 0){ while(size > 0){
// --- Boot Segment // --- Boot Segment
if(srcAdd >= HOTSW_BOOTSEGMENT_AREA_OFS && srcAdd < HOTSW_KEYTABLE_AREA_OFS){ if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((srcAdd + remainSize) > HOTSW_KEYTABLE_AREA_OFS) ? HOTSW_KEYTABLE_AREA_OFS - srcAdd : remainSize; sendSize = ((src + size) > HOTSW_KEYTABLE_AREA_OFS) ? HOTSW_KEYTABLE_AREA_OFS - src : size;
MI_CpuCopy8((u32 *)(SYSM_CARD_ROM_HEADER_BAK + (srcAdd - HOTSW_BOOTSEGMENT_AREA_OFS)), (u32 *)destAdd, sendSize); MI_CpuCopy8((u32 *)(SYSM_CARD_ROM_HEADER_BAK + (src - HOTSW_BOOTSEGMENT_AREA_OFS)), (u32 *)dest, sendSize);
} }
// --- Key Table // --- Key Table
else if(srcAdd >= HOTSW_KEYTABLE_AREA_OFS && srcAdd < HOTSW_SECURE_AREA_OFS){ else if(src >= HOTSW_KEYTABLE_AREA_OFS && src < HOTSW_SECURE_AREA_OFS){
// [TODO] ここなにも処理しない? OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = remainSize; sendSize = ((src + size) > HOTSW_SECURE_AREA_OFS) ? HOTSW_SECURE_AREA_OFS - src : size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
} }
// --- Secure Segment // --- Secure Segment
else if(srcAdd >= HOTSW_SECURE_AREA_OFS && srcAdd < HOTSW_GAME_AREA_OFS){ else if(src >= HOTSW_SECURE_AREA_OFS && src < HOTSW_GAME_AREA_OFS){
sendSize = ((srcAdd + remainSize) > HOTSW_GAME_AREA_OFS) ? HOTSW_GAME_AREA_OFS - srcAdd : remainSize; OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Src Adr : 0x%08x\n", __FUNCTION__, __LINE__, (SYSM_CARD_NTR_SECURE_BUF + (srcAdd - HOTSW_SECURE_AREA_OFS)) ); sendSize = ((src + size) > HOTSW_GAME_AREA_OFS) ? HOTSW_GAME_AREA_OFS - src : size;
MI_CpuCopy8((u32 *)(SYSM_CARD_NTR_SECURE_BUF + (srcAdd - HOTSW_SECURE_AREA_OFS)), (u32 *)destAdd, sendSize); MI_CpuCopy8((u32 *)(SYSM_CARD_NTR_SECURE_BUF + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
} }
// --- Game Segment // --- Game Segment
else if(srcAdd >= HOTSW_GAME_AREA_OFS){ else if(src >= HOTSW_GAME_AREA_OFS){
// KeyTable2が設定されている場合 // KeyTable2が設定されている場合
if(s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset){ if(s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset){
u32 keyTable2Adr = (u32)s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset * TWLCARD_BORDER_OFFSET; u32 keyTable2Adr = (u32)s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset * TWLCARD_BORDER_OFFSET;
@ -934,40 +931,41 @@ static HotSwState ReadCardData(u32 src, u32 dest, u32 size)
u32 Game2Adr = keyTable2Adr + HOTSW_GAME2_AREA_OFS; u32 Game2Adr = keyTable2Adr + HOTSW_GAME2_AREA_OFS;
// --- Game Segment // --- Game Segment
if(srcAdd < keyTable2Adr){ if(src < keyTable2Adr){
sendSize = ((srcAdd + remainSize) > keyTable2Adr) ? keyTable2Adr - srcAdd : remainSize; OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Src Adr : 0x%08x Dest Adr : 0x%08x Size : 0x%08x\n", __FUNCTION__, __LINE__, srcAdd, destAdd, sendSize ); sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
ReadImage((u32 *)destAdd, (s32)srcAdd, (s32)sendSize, &s_cbData); result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
} }
// --- Key Table2 // --- Key Table2
else if(srcAdd >= keyTable2Adr && srcAdd < Secure2Adr){ else if(src >= keyTable2Adr && src < Secure2Adr){
// [TODO] ここなにも処理しない? OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = remainSize; sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
} }
// --- Secure2 Segment // --- Secure2 Segment
else if(srcAdd >= Secure2Adr && srcAdd < Game2Adr){ else if(src >= Secure2Adr && src < Game2Adr){
sendSize = ((srcAdd + remainSize) > Game2Adr) ? Game2Adr - srcAdd : remainSize; OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Src Adr : 0x%08x\n", __FUNCTION__, __LINE__, (SYSM_CARD_TWL_SECURE_BUF + (srcAdd - Secure2Adr)) ); sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
MI_CpuCopy8((u32 *)(SYSM_CARD_TWL_SECURE_BUF + (srcAdd - Secure2Adr)), (u32 *)destAdd, sendSize); MI_CpuCopy8((u32 *)(SYSM_CARD_TWL_SECURE_BUF + (src - Secure2Adr)), (u32 *)dest, sendSize);
} }
// --- Game2 Segment // --- Game2 Segment
else{ else{
sendSize = remainSize; OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Src Adr : 0x%08x Dest Adr : 0x%08x Size : 0x%08x\n", __FUNCTION__, __LINE__, srcAdd, destAdd, sendSize ); sendSize = size;
ReadImage((u32 *)destAdd, (s32)srcAdd, (s32)sendSize, &s_cbData); result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
} }
} }
// --- Game Segment // --- Game Segment
else{ else{
sendSize = remainSize; OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Src Adr : 0x%08x Dest Adr : 0x%08x Size : 0x%08x\n", __FUNCTION__, __LINE__, srcAdd, destAdd, sendSize ); sendSize = size;
ReadImage((u32 *)destAdd, (s32)srcAdd, (s32)sendSize, &s_cbData); result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
} }
} }
remainSize -= sendSize; size -= sendSize;
srcAdd += sendSize; src += sendSize;
destAdd += sendSize; dest += sendSize;
} }
#ifndef DEBUG_USED_CARD_SLOT_B_ #ifndef DEBUG_USED_CARD_SLOT_B_
@ -976,10 +974,12 @@ static HotSwState ReadCardData(u32 src, u32 dest, u32 size)
UnlockExCard(s_CardLockID); UnlockExCard(s_CardLockID);
#endif #endif
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); if(result){
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = TRUE; return CARD_READ_SUCCESS;
}
return HOTSW_SUCCESS; else{
return CARD_READ_UNKNOWN_ERROR;
}
} }
#endif #endif
@ -1674,6 +1674,17 @@ static void HotSwThread(void *arg)
FinalizeHotSw( msg->apli ); FinalizeHotSw( msg->apli );
} }
#ifdef USE_WRAM_LOAD
if( msg->read == TRUE ){
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
SYSMi_GetWork()->cardReadParam.result = ReadCardData(SYSMi_GetWork()->cardReadParam.src,
SYSMi_GetWork()->cardReadParam.dest,
SYSMi_GetWork()->cardReadParam.size);
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = TRUE;
continue;
}
#endif
while(1){ while(1){
if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) {
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
@ -2156,10 +2167,23 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
d.data = data; d.data = data;
#ifndef USE_WRAM_LOAD
OS_TPrintf("... Pxi Message - value:%x ctrl:%x finalize:%x bootType:%x\n",
d.msg.value, d.msg.ctrl, d.msg.finalize, d.msg.bootType);
#else
OS_TPrintf("... Pxi Message - value:%x ctrl:%x finalize:%x read:%x bootType:%x\n", OS_TPrintf("... Pxi Message - value:%x ctrl:%x finalize:%x read:%x bootType:%x\n",
d.msg.value, d.msg.ctrl, d.msg.finalize, d.msg.read, d.msg.bootType); d.msg.value, d.msg.ctrl, d.msg.finalize, d.msg.read, d.msg.bootType);
if(!d.msg.read){ /*
if(d.msg.read){
OS_PutString("--- ARM7\n");
OS_TPrintf("src : 0x%08x\n", SYSMi_GetWork()->cardReadParam.src);
OS_TPrintf("dst : 0x%08x\n", SYSMi_GetWork()->cardReadParam.dest);
OS_TPrintf("size : 0x%08x\n", SYSMi_GetWork()->cardReadParam.size);
}*/
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].read = (d.msg.read) ? TRUE : FALSE;
#endif
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].finalize = (d.msg.finalize) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].finalize = (d.msg.finalize) ? TRUE : FALSE;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value;
@ -2171,16 +2195,6 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
// メッセージインデックスをインクリメント // メッセージインデックスをインクリメント
HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM;
} }
else{
#ifdef USE_WRAM_LOAD
OS_PutString("--- ARM7\n");
OS_TPrintf("src : 0x%08x\n", SYSMi_GetWork()->cardReadParam.src);
OS_TPrintf("dst : 0x%08x\n", SYSMi_GetWork()->cardReadParam.dest);
OS_TPrintf("size : 0x%08x\n", SYSMi_GetWork()->cardReadParam.size);
ReadCardData(SYSMi_GetWork()->cardReadParam.src, SYSMi_GetWork()->cardReadParam.dest, SYSMi_GetWork()->cardReadParam.size);
#endif
}
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*

View File

@ -99,7 +99,7 @@ BOOL HOTSW_isCardLoadCompleted(void)
ARM7側 ARM7側
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD #ifdef USE_WRAM_LOAD
void HOTSW_ReadCardData(void* src, void* dest, u32 size) CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
{ {
HotSwPxiMessage msg; HotSwPxiMessage msg;
@ -110,12 +110,6 @@ void HOTSW_ReadCardData(void* src, void* dest, u32 size)
SYSMi_GetWork()->cardReadParam.size = size; SYSMi_GetWork()->cardReadParam.size = size;
DC_FlushRange( &SYSMi_GetWork()->cardReadParam, sizeof(CardReadParam) ); DC_FlushRange( &SYSMi_GetWork()->cardReadParam, sizeof(CardReadParam) );
OS_PutString("--- ARM9\n");
OS_TPrintf("src : 0x%08x\n", SYSMi_GetWork()->cardReadParam.src);
OS_TPrintf("dst : 0x%08x\n", SYSMi_GetWork()->cardReadParam.dest);
OS_TPrintf("size : 0x%08x\n", SYSMi_GetWork()->cardReadParam.size);
DC_FlushRange( dest, size ); DC_FlushRange( dest, size );
msg.msg.read = TRUE; msg.msg.read = TRUE;
@ -128,8 +122,10 @@ void HOTSW_ReadCardData(void* src, void* dest, u32 size)
// [TODO] ARM7側でリードが終了してステートが返ってくるのを待つ // [TODO] ARM7側でリードが終了してステートが返ってくるのを待つ
while (!SYSMi_GetWork()->flags.hotsw.isCardReadCompleted) while (!SYSMi_GetWork()->flags.hotsw.isCardReadCompleted)
{ {
// do nothing
} }
return SYSMi_GetWork()->cardReadParam.result;
} }
#endif #endif

View File

@ -35,12 +35,12 @@ typedef enum HotSwMessageType{
} HotSwMessageType; } HotSwMessageType;
typedef enum ModeType{ typedef enum ModeType{
HOTSW_MODE1, HOTSW_MODE1 = 0,
HOTSW_MODE2 HOTSW_MODE2
} ModeType; } ModeType;
typedef enum HotSwApliType{ typedef enum HotSwApliType{
HOTSW_APLITYPE_CARD, HOTSW_APLITYPE_CARD = 0,
HOTSW_APLITYPE_NTR_NAND, HOTSW_APLITYPE_NTR_NAND,
HOTSW_APLITYPE_TWL_NAND HOTSW_APLITYPE_TWL_NAND
} HotSwApliType; } HotSwApliType;
@ -65,42 +65,14 @@ typedef struct HotSwMessage{
u32 value; u32 value;
BOOL ctrl; BOOL ctrl;
BOOL finalize; BOOL finalize;
BOOL read;
HotSwMessageType type; HotSwMessageType type;
HotSwApliType apli; HotSwApliType apli;
} HotSwMessage; } HotSwMessage;
// Function prototype ------------------------------------------------------- // Function prototype -------------------------------------------------------
// 活栓挿抜処理の初期化 // --- ARM9
void HOTSW_Init(u32 threadPrio);
// カードの存在判定
BOOL HOTSW_IsCardExist(void);
// カードにアクセスできる状態か判定
BOOL HOTSW_IsCardAccessible(void);
// Boot Segment バッファの指定
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
// Secure Segment バッファの指定
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size);
// Romエミュレーション情報を格納しているバッファのポインタを返す
SDK_INLINE void* HOTSW_GetRomEmulationBuffer(void)
{
return (void*)&SYSMi_GetWork()->romEmuInfo;
}
// ISデバッガ上で動作しているか
BOOL HOTSWi_IsRunOnDebugger(void);
// ROMをエミュレーションしているか
BOOL HOTSWi_IsRomEmulation(void);
// デバッガ通信用にカードスロットの電源をONにする。
void HOTSWi_TurnCardPowerOn(u32 slot);
#ifdef SDK_ARM9 #ifdef SDK_ARM9
// PXI通信でARM7に活線挿抜有効無効を通知 // PXI通信でARM7に活線挿抜有効無効を通知
void HOTSW_EnableHotSWAsync( BOOL enable ); void HOTSW_EnableHotSWAsync( BOOL enable );
@ -116,14 +88,44 @@ BOOL HOTSW_isCardLoadCompleted(void);
#ifdef USE_WRAM_LOAD #ifdef USE_WRAM_LOAD
// カードデータを読み出す関数 // カードデータを読み出す関数
void HOTSW_ReadCardData(void* src, void* dest, u32 size); CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size);
// カードがゲームモードになったかどうか // カードがゲームモードになったかどうか
BOOL HOTSW_isGameMode(void); BOOL HOTSW_isGameMode(void);
#endif #endif
// --- ARM7
#else
// 活栓挿抜処理の初期化
void HOTSW_Init(u32 threadPrio);
// カードの存在判定
BOOL HOTSW_IsCardExist(void);
// カードにアクセスできる状態か判定
BOOL HOTSW_IsCardAccessible(void);
// Boot Segment バッファの指定
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
// Secure Segment バッファの指定
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size);
// ISデバッガ上で動作しているか
BOOL HOTSWi_IsRunOnDebugger(void);
// ROMをエミュレーションしているか
BOOL HOTSWi_IsRomEmulation(void);
// デバッガ通信用にカードスロットの電源をONにする。
void HOTSWi_TurnCardPowerOn(u32 slot);
#endif #endif
// Romエミュレーション情報を格納しているバッファのポインタを返す
SDK_INLINE void* HOTSW_GetRomEmulationBuffer(void)
{
return (void*)&SYSMi_GetWork()->romEmuInfo;
}
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -35,6 +35,14 @@ typedef enum SYSMCloneBootMode {
} }
SYSMCloneBootMode; SYSMCloneBootMode;
typedef enum CardDataReadState {
CARD_READ_SUCCESS = 0,
CARD_READ_PULLED_OUT_ERROR,
CARD_READ_MODE_ERROR,
CARD_READ_UNKNOWN_ERROR
}
CardDataReadState;
// NAMTitleIDをHiLoに分割してアクセスする場合に使用 // NAMTitleIDをHiLoに分割してアクセスする場合に使用
typedef struct TitleID_HiLo { typedef struct TitleID_HiLo {
u8 Lo[ 4 ]; u8 Lo[ 4 ];
@ -46,6 +54,7 @@ typedef struct CardReadParam {
u32 src; u32 src;
u32 dest; u32 dest;
u32 size; u32 size;
CardDataReadState result;
}CardReadParam; }CardReadParam;
//---------------------------------------------------------------------- //----------------------------------------------------------------------