(更新: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)読み込み
void ReadBootSegNormal_DSType1(CardBootData *cbd);
HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd);
// DSカードType1のーマルモードのモード変更
void ChangeModeNormal_DSType1(CardBootData *cbd);
HotSwState ChangeModeNormal_DSType1(CardBootData *cbd);
// ■ セキュアモードのコマンド ■
// DSカードType1のセキュアモードのID読み込み
void ReadIDSecure_DSType1(CardBootData *cbd);
HotSwState ReadIDSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_DSType1(CardBootData *cbd);
HotSwState ReadSegSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのPNジェネレータON
void SwitchONPNGSecure_DSType1(CardBootData *cbd);
HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
// DSカードType1のセキュアモードのモード変更
void ChangeModeSecure_DSType1(CardBootData *cbd);
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
// ■ ゲームモードのコマンド ■
// DSカードType1のゲームモードのID読み込み
void ReadIDGame_DSType1(CardBootData *cbd);
HotSwState ReadIDGame_DSType1(CardBootData *cbd);
// 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
} /* extern "C" */

View File

@ -17,7 +17,7 @@ extern "C" {
// ===========================================================================
// ■ ノーマルモードのコマンド ■
// DSカードType2のーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_DSType2(CardBootData *cbd);
HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd);
// DSカードType2のーマルモードのモード変更 (Type1と同じ処理)
#define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1
@ -25,19 +25,19 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd);
// ■ セキュアモードのコマンド ■
// DSカードType2のセキュアモードのID読み込み
void ReadIDSecure_DSType2(CardBootData *cbd);
HotSwState ReadIDSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_DSType2(CardBootData *cbd);
HotSwState ReadSegSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのPNジェネレータON
void SwitchONPNGSecure_DSType2(CardBootData *cbd);
HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd);
// DSカードType2のセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
// 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
// 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
#ifdef __cplusplus

View File

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

View File

@ -18,35 +18,35 @@ extern "C" {
// ■ ノーマルモードのコマンド ■
// Rom EmulationのーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_ROMEMU(CardBootData *cbd);
HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd);
// Rom Emulationのーマルモードのモード変更
void ChangeModeNormal_ROMEMU(CardBootData *cbd);
HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd);
// ■ セキュアモードのコマンド ■
// Rom EmulationのセキュアモードのID読み込み
void ReadIDSecure_ROMEMU(CardBootData *cbd);
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み
void ReadSegSecure_ROMEMU(CardBootData *cbd);
HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのPNジェネレータON
void SwitchONPNGSecure_ROMEMU(CardBootData *cbd);
HotSwState SwitchONPNGSecure_ROMEMU(CardBootData *cbd);
// Rom EmulationのセキュアモードのPNジェネレータOFF
void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd);
HotSwState SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd);
// Rom Emulationのセキュアモードのモード変更
void ChangeModeSecure_ROMEMU(CardBootData *cbd);
HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd);
// ■ ゲームモードのコマンド ■
// DSカードType1のゲームモードのID読み込み
void ReadIDGame_ROMEMU(CardBootData *cbd);
HotSwState ReadIDGame_ROMEMU(CardBootData *cbd);
// 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
} /* extern "C" */

View File

@ -34,8 +34,12 @@ static void SetMCSCR(void);
*
* 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転送の準備
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);
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -60,11 +66,15 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
*
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void ChangeModeNormal_DSType1(CardBootData *cbd)
HotSwState ChangeModeNormal_DSType1(CardBootData *cbd)
{
GCDCmd64 tempCnd, cnd;
u64 vae64 = cbd->vae;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
@ -92,6 +102,8 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
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
*---------------------------------------------------------------------------*/
void ReadIDSecure_DSType1(CardBootData *cbd)
HotSwState ReadIDSecure_DSType1(CardBootData *cbd)
{
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
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++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -187,7 +205,7 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
*
* Description:
*---------------------------------------------------------------------------*/
void ReadSegSecure_DSType1(CardBootData *cbd)
HotSwState ReadSegSecure_DSType1(CardBootData *cbd)
{
u32 i,j=0;
u64 segNum = 4;
@ -195,6 +213,10 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
GCDCmd64 cndLE, cndBE;
for(i=0; i<4; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
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++;
}
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -243,8 +267,12 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
*
* Description:
*---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType1(CardBootData *cbd)
HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd)
{
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd);
@ -257,6 +285,8 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -264,8 +294,12 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
*
* Description:
*---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
{
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd);
@ -278,6 +312,8 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -287,8 +323,12 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
*
* 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);
@ -301,6 +341,8 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
@ -312,8 +354,12 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
*
* Description: IDを読み込む
*---------------------------------------------------------------------------*/
void ReadIDGame_DSType1(CardBootData *cbd)
HotSwState ReadIDGame_DSType1(CardBootData *cbd)
{
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
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);
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -334,7 +382,7 @@ void ReadIDGame_DSType1(CardBootData *cbd)
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;
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);
for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア
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;
}
}
return HOTSW_SUCCESS;
}

View File

@ -39,7 +39,7 @@ static void SetMCSCR(void);
*
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType2(CardBootData *cbd)
HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd)
{
u32 i = 0;
u32 loop = ONE_SEGMENT_PAGE_NUM;
@ -48,6 +48,10 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
GCDCmd64 cndLE, cndBE;
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
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++;
}
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -159,10 +165,16 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
*
* 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転送の準備
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++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -197,7 +211,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page
*---------------------------------------------------------------------------*/
void ReadSegSecure_DSType2(CardBootData *cbd)
HotSwState ReadSegSecure_DSType2(CardBootData *cbd)
{
u32 i,j=0,k;
u64 segNum = 4;
@ -208,6 +222,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
for(i=0; i<SECURE_SEGMENT_NUM; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -263,6 +281,8 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
}
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -272,10 +292,16 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
*
* 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);
@ -298,6 +324,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -307,10 +335,16 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
*
* 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);
@ -333,6 +367,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
@ -342,10 +378,16 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
*
* 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);
@ -368,6 +410,8 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
// コマンドカウンタインクリメント
cbd->vbi++;
return HOTSW_SUCCESS;
}
@ -389,7 +433,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
*
* 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;
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);
for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
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);
}
return HOTSW_SUCCESS;
}

View File

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

View File

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

View File

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