(更新:Akabane Jumpei)

・挿抜処理を行うスレッド内の処理を変更。(検証途中)
・HOTSW_LoadCardData関数/HOTSW_LoadStaticModule関数を非公開関数に変更。
・カード状態を示すenum型を新規作成。カード読み関数の返り値に利用。
・

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@697 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-19 07:06:32 +00:00
parent ef7303caaa
commit f1befafee6
9 changed files with 376 additions and 211 deletions

View File

@ -18,35 +18,35 @@ extern "C" {
// ■ ノーマルモードのコマンド ■ // ■ ノーマルモードのコマンド ■
// DSカードType1のーマルモードのBoot Segment(4Kbyte)読み込み // DSカードType1のーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_DSType1(CardBootData *cbd); HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd);
// DSカードType1のーマルモードのモード変更 // DSカードType1のーマルモードのモード変更
void ChangeModeNormal_DSType1(CardBootData *cbd); HotSwState ChangeModeNormal_DSType1(CardBootData *cbd);
// ■ セキュアモードのコマンド ■ // ■ セキュアモードのコマンド ■
// DSカードType1のセキュアモードのID読み込み // DSカードType1のセキュアモードのID読み込み
void ReadIDSecure_DSType1(CardBootData *cbd); HotSwState ReadIDSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み // DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_DSType1(CardBootData *cbd); HotSwState ReadSegSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのPNジェネレータON // DSカードType1のセキュアモードのPNジェネレータON
void SwitchONPNGSecure_DSType1(CardBootData *cbd); HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのPNジェネレータOFF // DSカードType1のセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_DSType1(CardBootData *cbd); HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのモード変更 // DSカードType1のセキュアモードのモード変更
void ChangeModeSecure_DSType1(CardBootData *cbd); HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
// ■ ゲームモードのコマンド ■ // ■ ゲームモードのコマンド ■
// DSカードType1のゲームモードのID読み込み // DSカードType1のゲームモードのID読み込み
void ReadIDGame_DSType1(CardBootData *cbd); HotSwState ReadIDGame_DSType1(CardBootData *cbd);
// DSカードType1のゲームモードの指定ページ読み込み // DSカードType1のゲームモードの指定ページ読み込み
void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size); HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -17,7 +17,7 @@ extern "C" {
// =========================================================================== // ===========================================================================
// ■ ノーマルモードのコマンド ■ // ■ ノーマルモードのコマンド ■
// DSカードType2のーマルモードのBoot Segment(4Kbyte)読み込み // DSカードType2のーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_DSType2(CardBootData *cbd); HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd);
// DSカードType2のーマルモードのモード変更 (Type1と同じ処理) // DSカードType2のーマルモードのモード変更 (Type1と同じ処理)
#define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1 #define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1
@ -25,19 +25,19 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd);
// ■ セキュアモードのコマンド ■ // ■ セキュアモードのコマンド ■
// DSカードType2のセキュアモードのID読み込み // DSカードType2のセキュアモードのID読み込み
void ReadIDSecure_DSType2(CardBootData *cbd); HotSwState ReadIDSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み // DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_DSType2(CardBootData *cbd); HotSwState ReadSegSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのPNジェネレータON // DSカードType2のセキュアモードのPNジェネレータON
void SwitchONPNGSecure_DSType2(CardBootData *cbd); HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのPNジェネレータOFF // DSカードType2のセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_DSType2(CardBootData *cbd); HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのモード変更 // DSカードType2のセキュアモードのモード変更
void ChangeModeSecure_DSType2(CardBootData *cbd); HotSwState ChangeModeSecure_DSType2(CardBootData *cbd);
// ■ ゲームモードのコマンド ■ // ■ ゲームモードのコマンド ■
@ -45,7 +45,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd);
#define ReadIDGame_DSType2 ReadIDGame_DSType1 #define ReadIDGame_DSType2 ReadIDGame_DSType1
// DSカードType2のゲームモードの指定ページ読み込み // DSカードType2のゲームモードの指定ページ読み込み
void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size); HotSwState ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
//#define ReadPageGame_DSType2 ReadPageGame_DSType1 //#define ReadPageGame_DSType2 ReadPageGame_DSType1
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -161,13 +161,13 @@ typedef enum CardTypeEx{
DS_CARD_TYPE_2, DS_CARD_TYPE_2,
TWL_CARD, TWL_CARD,
ROM_EMULATION ROM_EMULATION
}CardTypeEx; } CardTypeEx;
typedef enum NormalCommandType{ typedef enum NormalCommandType{
RD_ID = 0, RD_ID = 0,
RD_BSEG, RD_BSEG,
CHG_MODE CHG_MODE
}NormalCommandType; } NormalCommandType;
typedef enum SecureCommandType{ typedef enum SecureCommandType{
S_RD_ID = 0, S_RD_ID = 0,
@ -175,34 +175,44 @@ typedef enum SecureCommandType{
S_PNG_ON, S_PNG_ON,
S_PNG_OFF, S_PNG_OFF,
S_CHG_MODE S_CHG_MODE
}SecureCommandType; } SecureCommandType;
typedef enum GameCommandType{ typedef enum GameCommandType{
G_RD_ID = 0, G_RD_ID = 0,
G_RD_PAGE G_RD_PAGE
}GameCommandType; } GameCommandType;
typedef enum CardType{ typedef enum CardType{
CARD_DS_TYPE1 = 0, CARD_DS_TYPE1 = 0,
CARD_DS_TYPE2, CARD_DS_TYPE2,
CARD_TWL CARD_TWL
}CardType; } CardType;
typedef enum HotSwState{
HOTSW_SUCCESS = 0,
HOTSW_TIME_OUT,
HOTSW_CARD_LOCK_ERROR,
HOTSW_CRC_CHECK_ERROR,
HOTSW_HASH_CHECK_ERROR,
HOTSW_ID_CHECK_ERROR,
HOTSW_PULLED_OUT_ERROR,
HOTSW_INSERT_COUNT_ERROR,
HOTSW_UNEXPECTED_ERROR
} HotSwState;
// union --------------------------------------------------------------------- // union ---------------------------------------------------------------------
typedef union typedef union
{ {
u64 dw; u64 dw;
u8 b[8]; u8 b[8];
} } GCDCmd64;
GCDCmd64;
// ブートセグメントデータ // ブートセグメントデータ
typedef union BootSegmentData typedef union BootSegmentData
{ {
ROM_Header rh; ROM_Header rh;
u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)]; u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)];
} } BootSegmentData;
BootSegmentData;
// struct ------------------------------------------------------------------- // struct -------------------------------------------------------------------
typedef struct BLOWFISH_CTX{ typedef struct BLOWFISH_CTX{
@ -246,23 +256,21 @@ typedef struct CardBootData{
u32 *pSecureSegBuf; u32 *pSecureSegBuf;
BLOWFISH_CTX keyTable; BLOWFISH_CTX keyTable;
} } CardBootData;
CardBootData;
// カード起動用関数 // カード起動用関数
typedef struct CardBootFunction { typedef struct CardBootFunction {
void (*ReadBootSegment_N)(CardBootData *cbd); HotSwState (*ReadBootSegment_N)(CardBootData *cbd);
void (*ChangeMode_N)(CardBootData *cbd); HotSwState (*ChangeMode_N)(CardBootData *cbd);
void (*ReadID_S)(CardBootData *cbd); HotSwState (*ReadID_S)(CardBootData *cbd);
void (*ReadSegment_S)(CardBootData *cbd); HotSwState (*ReadSegment_S)(CardBootData *cbd);
void (*SetPNG_S)(CardBootData *cbd); HotSwState (*SetPNG_S)(CardBootData *cbd);
void (*ChangeMode_S)(CardBootData *cbd); HotSwState (*ChangeMode_S)(CardBootData *cbd);
void (*ReadID_G)(CardBootData *cbd); HotSwState (*ReadID_G)(CardBootData *cbd);
void (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); HotSwState (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size);
} } CardBootFunction;
CardBootFunction;

View File

@ -18,35 +18,35 @@ extern "C" {
// ■ ノーマルモードのコマンド ■ // ■ ノーマルモードのコマンド ■
// Rom EmulationのーマルモードのBoot Segment(4Kbyte)読み込み // Rom EmulationのーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_ROMEMU(CardBootData *cbd); HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd);
// Rom Emulationのーマルモードのモード変更 // Rom Emulationのーマルモードのモード変更
void ChangeModeNormal_ROMEMU(CardBootData *cbd); HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd);
// ■ セキュアモードのコマンド ■ // ■ セキュアモードのコマンド ■
// Rom EmulationのセキュアモードのID読み込み // Rom EmulationのセキュアモードのID読み込み
void ReadIDSecure_ROMEMU(CardBootData *cbd); HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み // Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_ROMEMU(CardBootData *cbd); HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのPNジェネレータON // Rom EmulationのセキュアモードのPNジェネレータON
void SwitchONPNGSecure_ROMEMU(CardBootData *cbd); HotSwState SwitchONPNGSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのPNジェネレータOFF // Rom EmulationのセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd); HotSwState SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd);
// Rom Emulationのセキュアモードのモード変更 // Rom Emulationのセキュアモードのモード変更
void ChangeModeSecure_ROMEMU(CardBootData *cbd); HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd);
// ■ ゲームモードのコマンド ■ // ■ ゲームモードのコマンド ■
// DSカードType1のゲームモードのID読み込み // DSカードType1のゲームモードのID読み込み
void ReadIDGame_ROMEMU(CardBootData *cbd); HotSwState ReadIDGame_ROMEMU(CardBootData *cbd);
// DSカードType1のゲームモードの指定ページ読み込み // DSカードType1のゲームモードの指定ページ読み込み
void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size); HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -34,8 +34,12 @@ static void SetMCSCR(void);
* *
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType1(CardBootData *cbd) HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE );
@ -51,6 +55,8 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -60,11 +66,15 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
* *
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ChangeModeNormal_DSType1(CardBootData *cbd) HotSwState ChangeModeNormal_DSType1(CardBootData *cbd)
{ {
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
u64 vae64 = cbd->vae; u64 vae64 = cbd->vae;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -92,6 +102,8 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
@ -162,8 +174,12 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadIDSecure_DSType1(CardBootData *cbd) HotSwState ReadIDSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
@ -180,6 +196,8 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -187,7 +205,7 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
* *
* Description: * Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadSegSecure_DSType1(CardBootData *cbd) HotSwState ReadSegSecure_DSType1(CardBootData *cbd)
{ {
u32 i,j=0; u32 i,j=0;
u64 segNum = 4; u64 segNum = 4;
@ -195,6 +213,10 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
GCDCmd64 cndLE, cndBE; GCDCmd64 cndLE, cndBE;
for(i=0; i<4; i++){ for(i=0; i<4; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE );
@ -236,6 +258,8 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -243,8 +267,12 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
* *
* Description: * Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType1(CardBootData *cbd) HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd); SetSecureCommand(S_PNG_ON, cbd);
@ -257,6 +285,8 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -264,8 +294,12 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
* *
* Description: * Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd); SetSecureCommand(S_PNG_OFF, cbd);
@ -278,6 +312,8 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -287,8 +323,12 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ChangeModeSecure_DSType1(CardBootData *cbd) HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd); SetSecureCommand(S_CHG_MODE, cbd);
@ -301,6 +341,8 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
@ -312,8 +354,12 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
* *
* Description: IDを読み込む * Description: IDを読み込む
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadIDGame_DSType1(CardBootData *cbd) HotSwState ReadIDGame_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
@ -327,6 +373,8 @@ void ReadIDGame_DSType1(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -334,7 +382,7 @@ void ReadIDGame_DSType1(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size) HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{ {
u32 loop, counter=0; u32 loop, counter=0;
u64 i, page; u64 i, page;
@ -348,6 +396,10 @@ void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -379,4 +431,6 @@ void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size
*((u32 *)buf + counter++) = reg_HOTSW_MCD1; *((u32 *)buf + counter++) = reg_HOTSW_MCD1;
} }
} }
return HOTSW_SUCCESS;
} }

View File

@ -39,7 +39,7 @@ static void SetMCSCR(void);
* *
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType2(CardBootData *cbd) HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd)
{ {
u32 i = 0; u32 i = 0;
u32 loop = ONE_SEGMENT_PAGE_NUM; u32 loop = ONE_SEGMENT_PAGE_NUM;
@ -48,6 +48,10 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
GCDCmd64 cndLE, cndBE; GCDCmd64 cndLE, cndBE;
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){ for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
@ -80,6 +84,8 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
page++; page++;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -159,10 +165,16 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadIDSecure_DSType2(CardBootData *cbd) HotSwState ReadIDSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// スクランブルの設定 // スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
@ -188,6 +200,8 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -197,7 +211,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadSegSecure_DSType2(CardBootData *cbd) HotSwState ReadSegSecure_DSType2(CardBootData *cbd)
{ {
u32 i,j=0,k; u32 i,j=0,k;
u64 segNum = 4; u64 segNum = 4;
@ -208,6 +222,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
for(i=0; i<SECURE_SEGMENT_NUM; i++){ for(i=0; i<SECURE_SEGMENT_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -263,6 +281,8 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -272,10 +292,16 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType2(CardBootData *cbd) HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// スクランブルの設定 // スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd); SetSecureCommand(S_PNG_ON, cbd);
@ -298,6 +324,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -307,10 +335,16 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// スクランブルの設定 // スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd); SetSecureCommand(S_PNG_OFF, cbd);
@ -333,6 +367,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -342,10 +378,16 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
* *
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ChangeModeSecure_DSType2(CardBootData *cbd) HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// スクランブルの設定 // スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定 // コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd); SetSecureCommand(S_CHG_MODE, cbd);
@ -368,6 +410,8 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント // コマンドカウンタインクリメント
cbd->vbi++; cbd->vbi++;
return HOTSW_SUCCESS;
} }
@ -389,7 +433,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
* *
* CT=150ns Latency1=0x657 Latency2=0x1 Pagecount=1page * CT=150ns Latency1=0x657 Latency2=0x1 Pagecount=1page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size) HotSwState ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{ {
u32 loop, counter=0; u32 loop, counter=0;
u64 i, page; u64 i, page;
@ -403,6 +447,10 @@ void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
@ -434,4 +482,6 @@ void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
} }
return HOTSW_SUCCESS;
} }

View File

@ -53,20 +53,7 @@
#define HOTSW_EXMEMCNT_SELB_SHIFT 10 #define HOTSW_EXMEMCNT_SELB_SHIFT 10
#endif #endif
// enum ---------------------------------------------------------------------
typedef enum IntrType{
HOTSW_INSERT = 0,
HOTSW_PULLEDOUT = 1
}
IntrType;
// struct -------------------------------------------------------------------
typedef struct HotSwMessage{
IntrType type;
u32 hotswCount;
}
HotSwMessage;
// スレッド・メッセージ関係をまとめた構造体 // スレッド・メッセージ関係をまとめた構造体
typedef struct CardThreadData{ typedef struct CardThreadData{
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
@ -75,8 +62,8 @@ typedef struct CardThreadData{
u32 idx_insert; u32 idx_insert;
u32 idx_pulledOut; u32 idx_pulledOut;
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; OSMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; OSMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
OSMessageQueue hotswQueue; OSMessageQueue hotswQueue;
OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM];
} }
@ -84,7 +71,6 @@ CardThreadData;
// Function prototype ------------------------------------------------------- // Function prototype -------------------------------------------------------
static BOOL IsSwap(void); static BOOL IsSwap(void);
static BOOL IsCardExist(void);
static u32 GetMcSlotShift(void); static u32 GetMcSlotShift(void);
static void SetMcSlotMode(u32 mode); static void SetMcSlotMode(u32 mode);
static BOOL CmpMcSlotMode(u32 mode); static BOOL CmpMcSlotMode(u32 mode);
@ -103,10 +89,12 @@ static void McPowerOff(void);
static void SetMCSCR(void); static void SetMCSCR(void);
static void GenVA_VB_VD(void); static void GenVA_VB_VD(void);
static void LoadTable(void);
static void ReadRomEmulationData(void);
static void ReadIDNormal(void);
static void DecryptObjectFile(void); static void DecryptObjectFile(void);
static HotSwState LoadTable(void);
static HotSwState ReadRomEmulationData(void);
static HotSwState ReadIDNormal(void);
static HotSwState LoadStaticModule(void);
static HotSwState LoadCardData(void);
static void SetHotSwState(BOOL busy); static void SetHotSwState(BOOL busy);
@ -236,13 +224,9 @@ void HOTSW_Init(void)
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
// カードが挿さってあったらスレッドを起動する // カードが挿さってあったらスレッドを起動する
if(IsCardExist()){ if(HOTSW_IsCardExist()){
// OS_PutString("Card Boot Start\n"); // OS_PutString("Card Boot Start\n");
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
s_ctData.hotswInsertMsg[s_ctData.idx_insert].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
@ -258,29 +242,21 @@ void HOTSW_Init(void)
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* HOTSW_LoadCardData関数 * LoadCardData関数
* *
* *
* *
* BootSegmentBuffer SecureSegmentBufferの設定を行ってから * BootSegmentBuffer SecureSegmentBufferの設定を行ってから
* *
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
BOOL HOTSW_LoadCardData(void) static HotSwState LoadCardData(void)
{ {
OSTick start; OSTick start;
s32 tempLockID; s32 tempLockID;
BOOL retval = TRUE; HotSwState retval = HOTSW_SUCCESS;
start = OS_GetTick(); start = OS_GetTick();
// スロットがスワップされてたら元に戻す。
#ifdef HOTSW_FORCE_CARD_B
if(reg_MI_MC1 & 0x8000){
reg_MI_MC1 = reg_MI_MC1 & 0xff;
}
#endif // HOTSW_FORCE_CARD_B
// OS_TPrintf("---------------- Card Boot Start ---------------\n");
#ifdef SDK_ARM7 #ifdef SDK_ARM7
// カード電源リセット // カード電源リセット
McPowerOff(); McPowerOff();
@ -301,14 +277,14 @@ BOOL HOTSW_LoadCardData(void)
// カードのロックIDを取得 // カードのロックIDを取得
tempLockID = OS_GetLockID(); tempLockID = OS_GetLockID();
if(tempLockID == OS_LOCK_ID_ERROR){ if(tempLockID == OS_LOCK_ID_ERROR){
retval = FALSE; return HOTSW_CARD_LOCK_ERROR;
} }
else{ else{
s_cbData.lockID = (u16)tempLockID; s_cbData.lockID = (u16)tempLockID;
} }
// ブート処理開始 // ブート処理開始
if(IsCardExist() && retval){ if(HOTSW_IsCardExist()){
// カードのロック // カードのロック
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
LockExCard(s_cbData.lockID); LockExCard(s_cbData.lockID);
@ -317,11 +293,11 @@ BOOL HOTSW_LoadCardData(void)
#endif #endif
// カード側でKey Tableをロードする // カード側でKey Tableをロードする
LoadTable(); retval = LoadTable();
// ---------------------- Normal Mode ---------------------- // ---------------------- Normal Mode ----------------------
// カードID読み込み // カードID読み込み
ReadIDNormal(); retval = ReadIDNormal();
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
if(s_cbData.id_nml & 0x80000000){ if(s_cbData.id_nml & 0x80000000){
@ -342,10 +318,10 @@ BOOL HOTSW_LoadCardData(void)
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
// Boot Segment読み込み // Boot Segment読み込み
s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); retval = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
// Romエミュレーション情報を取得 // Romエミュレーション情報を取得
ReadRomEmulationData(); retval = ReadRomEmulationData();
// 取得したRomエミュレーション情報を比較 // 取得したRomエミュレーション情報を比較
s_cbData.debuggerFlg = TRUE; s_cbData.debuggerFlg = TRUE;
@ -372,14 +348,14 @@ BOOL HOTSW_LoadCardData(void)
if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) ||
( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){
retval = FALSE; retval = HOTSW_CRC_CHECK_ERROR;
} }
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
} }
if( retval ) { if( retval == HOTSW_SUCCESS ) {
// NTRカードかTWLカードか // NTRカードかTWLカードか
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){
// OS_TPrintf("TWL Card.\n"); // OS_TPrintf("TWL Card.\n");
@ -400,41 +376,49 @@ BOOL HOTSW_LoadCardData(void)
GenVA_VB_VD(); GenVA_VB_VD();
// セキュアモードに移行 // セキュアモードに移行
s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData); retval = s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
if(retval != HOTSW_SUCCESS){
return retval;
}
// ---------------------- Secure Mode ---------------------- // ---------------------- Secure Mode ----------------------
// PNG設定 // PNG設定
s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); retval = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
// DS側符号生成回路初期値設定 (レジスタ設定) // DS側符号生成回路初期値設定 (レジスタ設定)
SetMCSCR(); SetMCSCR();
// ID読み込み // ID読み込み
s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); retval = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
// カードIDの比較をして、一致しなければFALSEを返す // カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_nml != s_cbData.id_scr){ if(s_cbData.id_nml != s_cbData.id_scr){
return FALSE; return HOTSW_ID_CHECK_ERROR;
} }
// Secure領域のSegment読み込み // Secure領域のSegment読み込み
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); retval = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
// ゲームモードに移行 // ゲームモードに移行
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); retval = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
if(retval != HOTSW_SUCCESS){
return retval;
}
// ---------------------- Game Mode ---------------------- // ---------------------- Game Mode ----------------------
// ID読み込み // ID読み込み
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); retval = s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
// カードIDの比較をして、一致しなければFALSEを返す // カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_scr != s_cbData.id_gam){ if(s_cbData.id_scr != s_cbData.id_gam){
return FALSE; return HOTSW_ID_CHECK_ERROR;
} }
// 常駐モジュール残りを指定先に転送 // 常駐モジュール残りを指定先に転送
HOTSW_LoadStaticModule(); retval = LoadStaticModule();
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
DecryptObjectFile(); DecryptObjectFile();
} }
@ -445,11 +429,9 @@ BOOL HOTSW_LoadCardData(void)
#else #else
OS_UnlockCard(s_cbData.lockID); OS_UnlockCard(s_cbData.lockID);
#endif #endif
// OS_TPrintf("-----------------------------------------------\n");
} }
else{ else{
// OS_TPrintf("Card Not Found\n"); retval = HOTSW_PULLED_OUT_ERROR;
retval = FALSE;
} }
// カードロックIDの開放 // カードロックIDの開放
@ -471,25 +453,32 @@ void* HOTSW_GetRomEmulationBuffer(void)
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* HOTSW_LoadStaticModule関数 * LoadStaticModule関数
* *
* ARM7,9 * ARM7,9
* *
* *
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
void HOTSW_LoadStaticModule(void) static HotSwState LoadStaticModule(void)
{ {
HotSwState retval = HOTSW_SUCCESS;
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
// バナーリード // バナーリード
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
// OS_TPrintf(" - Banner Loading...\n"); // OS_TPrintf(" - Banner Loading...\n");
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(
&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) );
} }
if(IsCardExist()) if(retval != HOTSW_SUCCESS){
return retval;
}
if(HOTSW_IsCardExist())
{ {
SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE; SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
@ -501,18 +490,26 @@ void HOTSW_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);
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&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){
return retval;
}
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);
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.sub_rom_offset, s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
(u32 *)s_cbData.arm7Stc, (u32 *)s_cbData.arm7Stc,
s_cbData.pBootSegBuf->rh.s.sub_size); s_cbData.pBootSegBuf->rh.s.sub_size);
if(retval != HOTSW_SUCCESS){
return retval;
}
// TWLでのみロード // TWLでのみロード
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) { if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
@ -521,26 +518,33 @@ void HOTSW_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);
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
(u32 *)SYSM_CARD_TWL_SECURE_BUF, (u32 *)SYSM_CARD_TWL_SECURE_BUF,
size); size);
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&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);
} }
if(retval != HOTSW_SUCCESS){
return retval;
}
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);
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
(u32 *)s_cbData.arm7Ltd, (u32 *)s_cbData.arm7Ltd,
s_cbData.pBootSegBuf->rh.s.sub_ltd_size); s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
if(retval != HOTSW_SUCCESS){
return retval;
}
// セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー // セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー
{ {
u8 sha1data[DIGEST_SIZE_SHA1]; u8 sha1data[DIGEST_SIZE_SHA1];
@ -561,24 +565,30 @@ void HOTSW_LoadStaticModule(void)
// Arm9常駐モジュール Hash値のチェック // Arm9常駐モジュール Hash値のチェック
if(!CheckArm9HashValue()){ if(!CheckArm9HashValue()){
retval = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm9 Static Module Hash Check Error...\n"); OS_PutString("×Arm9 Static Module Hash Check Error...\n");
} }
// Arm7常駐モジュール Hash値のチェック // Arm7常駐モジュール Hash値のチェック
if(!CheckArm7HashValue()){ if(!CheckArm7HashValue()){
retval = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm7 Static Module Hash Check Error...\n"); OS_PutString("×Arm7 Static Module Hash Check Error...\n");
} }
// Arm9拡張常駐モジュール Hash値のチェック // Arm9拡張常駐モジュール Hash値のチェック
if(!CheckExtArm9HashValue()){ if(!CheckExtArm9HashValue()){
retval = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n");
} }
// Arm7拡張常駐モジュール Hash値のチェック // Arm7拡張常駐モジュール Hash値のチェック
if(!CheckExtArm7HashValue()){ if(!CheckExtArm7HashValue()){
retval = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n");
} }
} }
return retval;
} }
@ -661,7 +671,7 @@ static void GenVA_VB_VD(void)
* *
* *
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
static void LoadTable(void) static HotSwState LoadTable(void)
{ {
u32 temp; u32 temp;
@ -680,6 +690,8 @@ static void LoadTable(void)
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1; temp = reg_HOTSW_MCD1;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -687,7 +699,7 @@ static void LoadTable(void)
Description: Romエミュレーションデータの読み込み Description: Romエミュレーションデータの読み込み
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void ReadRomEmulationData(void) static HotSwState ReadRomEmulationData(void)
{ {
u32 count=0; u32 count=0;
u32 temp; u32 temp;
@ -696,7 +708,7 @@ static void ReadRomEmulationData(void)
// 量産用CPUでは平文アクセス防止のためリードしない // 量産用CPUでは平文アクセス防止のためリードしない
if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) ) if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) )
{ {
return; return HOTSW_SUCCESS;
} }
// MCCMD レジスタ設定 // MCCMD レジスタ設定
@ -719,6 +731,8 @@ static void ReadRomEmulationData(void)
} }
MI_CpuCopyFast(s_cbData.romEmuBuf, (void*)HW_ISD_RESERVED, 32); MI_CpuCopyFast(s_cbData.romEmuBuf, (void*)HW_ISD_RESERVED, 32);
return HOTSW_SUCCESS;
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
@ -726,7 +740,7 @@ static void ReadRomEmulationData(void)
* *
* IDを読み込む関数 * IDを読み込む関数
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
void ReadIDNormal(void) HotSwState ReadIDNormal(void)
{ {
// カード割り込みによるDMAコピー // カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) );
@ -743,6 +757,8 @@ void ReadIDNormal(void)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
@ -810,6 +826,25 @@ static void DecryptObjectFile(void)
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
} }
/* -----------------------------------------------------------------
* HOTSW_IsCardExist関数
*
*
*
* SCFG_MC1のCDETフラグを見ている
* ----------------------------------------------------------------- */
BOOL HOTSW_IsCardExist(void)
{
u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift());
if( !(reg_MI_MC1 & mask) ){
return TRUE;
}
else{
return FALSE;
}
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* IsSwap関数 * IsSwap関数
* *
@ -827,25 +862,6 @@ static BOOL IsSwap(void)
} }
} }
/* -----------------------------------------------------------------
* IsCardExist関数
*
*
*
* SCFG_MC1のCDETフラグを見ている
* ----------------------------------------------------------------- */
static BOOL IsCardExist(void)
{
u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift());
if( !(reg_MI_MC1 & mask) ){
return TRUE;
}
else{
return FALSE;
}
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* GetMcSlotShift関数 * GetMcSlotShift関数
* *
@ -853,7 +869,7 @@ static BOOL IsCardExist(void)
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
static u32 GetMcSlotShift(void) static u32 GetMcSlotShift(void)
{ {
return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT);
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
@ -968,10 +984,10 @@ static void McThread(void *arg)
{ {
#pragma unused( arg ) #pragma unused( arg )
u32 currentId_g = UNDEF_CODE; u32 hotswCount = UNDEF_CODE;
BOOL isPulledOut = TRUE; BOOL isPulledOut = TRUE;
BOOL retval; HotSwState retval;
HotSwMessage *msg; OSMessage *msg;
while(1){ while(1){
OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
@ -989,12 +1005,11 @@ static void McThread(void *arg)
} }
// カードが挿さってたら // カードが挿さってたら
if(IsCardExist()){ if(HOTSW_IsCardExist()){
// 前の状態が挿し // 前の状態が挿し
if(!isPulledOut){ if(!isPulledOut){
(void)s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); // 抜き差しがなかったか判定
if(currentId_g == s_cbData.id_gam){ if(CARDi_IsPulledOutEx(hotswCount)){
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) { if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
@ -1026,27 +1041,30 @@ static void McThread(void *arg)
// カードデータロード完了フラグ // カードデータロード完了フラグ
SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE; SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE;
OS_PutString("ok!\n");
break; break;
} }
} }
// 挿し回数を取得
hotswCount = CARDi_GetSlotResetCount();
// HotSwをbusy状態にする // HotSwをbusy状態にする
SetHotSwState(TRUE); SetHotSwState(TRUE);
// カード読み込み開始 // カード読み込み開始
retval = HOTSW_LoadCardData(); retval = LoadCardData();
// HotSwをfree状態にする // HotSwをfree状態にする
SetHotSwState(FALSE); SetHotSwState(FALSE);
// GameモードでのIDを登録する
currentId_g = s_cbData.id_gam;
// 状態フラグを更新 // 状態フラグを更新
isPulledOut = !retval; isPulledOut = (retval == HOTSW_SUCCESS) ? FALSE : TRUE;
// カード読み込み失敗してたら、後処理する // カード読み込み失敗してたら、後処理する
if(!retval){ if(retval != HOTSW_SUCCESS){
OS_TPrintf("ng... retval : %d\n", retval);
// カードロックの開放 // カードロックの開放
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
UnlockExCard(s_cbData.lockID); UnlockExCard(s_cbData.lockID);
@ -1094,10 +1112,6 @@ static void McThread(void *arg)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCard(void) static void InterruptCallbackCard(void)
{ {
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLEDOUT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK);
@ -1122,10 +1136,6 @@ static void InterruptCallbackCardDet(void)
{ {
// SDKのカード状態をリセットする // SDKのカード状態をリセットする
CARDi_ResetSlotStatus(); CARDi_ResetSlotStatus();
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
s_ctData.hotswInsertMsg[s_ctData.idx_insert].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);

View File

@ -33,7 +33,7 @@
Description: DSカードType1のーマルモードのBoot Segment読み込み Description: DSカードType1のーマルモードのBoot Segment読み込み
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadBootSegNormal_ROMEMU(CardBootData *cbd) HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd)
{ {
u32 i,j=0; u32 i,j=0;
u64 page = 0; u64 page = 0;
@ -41,6 +41,10 @@ void ReadBootSegNormal_ROMEMU(CardBootData *cbd)
// u32 n = 0; // u32 n = 0;
for(i=0; i<BOOT_PAGE_NUM; i++){ for(i=0; i<BOOT_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -75,6 +79,8 @@ void ReadBootSegNormal_ROMEMU(CardBootData *cbd)
page++; page++;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -82,12 +88,16 @@ void ReadBootSegNormal_ROMEMU(CardBootData *cbd)
Description: DSカードType1のーマルモードのモード変更 Description: DSカードType1のーマルモードのモード変更
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ChangeModeNormal_ROMEMU(CardBootData *cbd) HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -113,6 +123,8 @@ void ChangeModeNormal_ROMEMU(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
@ -124,8 +136,12 @@ void ChangeModeNormal_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadIDSecure_ROMEMU(CardBootData *cbd) HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// カード割り込みによるDMAコピー // カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
@ -141,6 +157,8 @@ void ReadIDSecure_ROMEMU(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -148,7 +166,7 @@ void ReadIDSecure_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadSegSecure_ROMEMU(CardBootData *cbd) HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
{ {
u32 i,j=0; u32 i,j=0;
u64 page = 0x20; u64 page = 0x20;
@ -156,6 +174,10 @@ void ReadSegSecure_ROMEMU(CardBootData *cbd)
u32 n = 0; u32 n = 0;
for(i=0; i<SECURE_PAGE_NUM; i++){ for(i=0; i<SECURE_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -189,6 +211,8 @@ void ReadSegSecure_ROMEMU(CardBootData *cbd)
} }
page++; page++;
} }
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -196,9 +220,11 @@ void ReadSegSecure_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchONPNGSecure_ROMEMU(CardBootData *cbd) HotSwState SwitchONPNGSecure_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -206,9 +232,11 @@ void SwitchONPNGSecure_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd) HotSwState SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -216,12 +244,16 @@ void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ChangeModeSecure_ROMEMU(CardBootData *cbd) HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -247,6 +279,8 @@ void ChangeModeSecure_ROMEMU(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
@ -258,10 +292,14 @@ void ChangeModeSecure_ROMEMU(CardBootData *cbd)
Description: IDを読み込む Description: IDを読み込む
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadIDGame_ROMEMU(CardBootData *cbd) HotSwState ReadIDGame_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// カード割り込みによるDMAコピー // カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
@ -277,6 +315,8 @@ void ReadIDGame_ROMEMU(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -284,7 +324,7 @@ void ReadIDGame_ROMEMU(CardBootData *cbd)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size) HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
@ -300,6 +340,10 @@ void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア // ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -330,4 +374,6 @@ void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
*((u32 *)buf + counter++) = reg_HOTSW_MCD1; *((u32 *)buf + counter++) = reg_HOTSW_MCD1;
} }
} }
return HOTSW_SUCCESS;
} }

View File

@ -17,11 +17,8 @@ extern "C" {
// 活栓挿抜処理の初期化 // 活栓挿抜処理の初期化
void HOTSW_Init(void); void HOTSW_Init(void);
// カードからデータをロードする。Normalモード→Secureモード→Gameモードを行う // カードの存在判定
BOOL HOTSW_LoadCardData(void); BOOL HOTSW_IsCardExist(void);
// ARM7,9の常駐モジュールを展開する関数
void HOTSW_LoadStaticModule(void);
// Boot Segment バッファの指定 // Boot Segment バッファの指定
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size); void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);