(更新:Akabane Jumpei) カード読み関数のレイテンシを修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@581 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-05 06:09:27 +00:00
parent 9dcbaf83b6
commit f0149494a7
4 changed files with 102 additions and 115 deletions

View File

@ -40,8 +40,8 @@ extern "C" {
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位)
#define ONE_SEGMENT_SIZE 0x1000 // 1 Segmentのサイズ(バイト単位)
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1 Segmentのサイズ(ワード単位)
#define ONE_SEGMENT_SIZE 0x1000 // 1Segmentのサイズ(バイト単位)
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1Segmentのサイズ(ワード単位)
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
@ -94,7 +94,7 @@ extern "C" {
#define START_SHIFT 31
#define START_MASK 0x80000000
#define SCRAMBLE_MASK 0x1840e000
#define SCRAMBLE_MASK 0x406000 // CS SE DSのマスク
#define AddLatency2ToLatency1(param)\
( (((param) & LATENCY2_MASK) \

View File

@ -54,9 +54,11 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ChangeModeNormal_DSType1
Description: DSカードType1のーマルモードのモード変更
* Name: ChangeModeNormal_DSType1
*
* Description: DSカードType1のーマルモードのモード変更
*
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void ChangeModeNormal_DSType1(CardBootData *cbd)
{
@ -85,8 +87,8 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
// MCCNT1 レジスタ設定 (START = 1 に)
reg_HOTSW_MCCNT1 = START_MASK;
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | LATENCY2_MASK & (0x18 << LATENCY2_SHIFT);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -154,9 +156,11 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
/*---------------------------------------------------------------------------*
Name: ReadIDSecure_DSType1
Description:
* Name: ReadIDSecure_DSType1
*
* Description:
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
*---------------------------------------------------------------------------*/
void ReadIDSecure_DSType1(CardBootData *cbd)
{
@ -179,9 +183,9 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ReadSegSecure_DSType1
Description:
* Name: ReadSegSecure_DSType1
*
* Description:
*---------------------------------------------------------------------------*/
void ReadSegSecure_DSType1(CardBootData *cbd)
{
@ -235,9 +239,9 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: SwitchONPNGSecure_DSType1
Description:
* Name: SwitchONPNGSecure_DSType1
*
* Description:
*---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType1(CardBootData *cbd)
{
@ -256,9 +260,9 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: SwitchOFFPNGSecure_DSType1
Description:
* Name: SwitchOFFPNGSecure_DSType1
*
* Description:
*---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
{
@ -277,9 +281,11 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ChangeModeSecure_DSType1
Description:
* Name: ChangeModeSecure_DSType1
*
* Description:
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void ChangeModeSecure_DSType1(CardBootData *cbd)
{
@ -302,9 +308,9 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
// ■ ゲームモードのコマンド ■
// ■------------------------------------■
/*---------------------------------------------------------------------------*
Name: ReadIDGame_DSType1
Description: IDを読み込む
* Name: ReadIDGame_DSType1
*
* Description: IDを読み込む
*---------------------------------------------------------------------------*/
void ReadIDGame_DSType1(CardBootData *cbd)
{

View File

@ -35,9 +35,9 @@ static void SetMCSCR(void);
/*---------------------------------------------------------------------------*
* Name: ReadBootSegNormal_DSType2
*
* Description: DSカードType2のーマルモードのBoot Segment読み込み (Page0 7)
*
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=1page
* Description: DSカードType2のーマルモードのBoot Segment読み込み
*
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType2(CardBootData *cbd)
{
@ -82,9 +82,11 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ChangeModeNormal_DSType2
Description: DSカードType1のーマルモードのモード変更
* Name: ChangeModeNormal_DSType2
*
* Description: DSカードType2のーマルモードのモード変更
*
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
// Type1と同じ
@ -150,13 +152,16 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
/*---------------------------------------------------------------------------*
Name: ReadIDSecure_DSType2
Description: SCRAMBLE_MASK -> CS SE DS
* Name: ReadIDSecure_DSType2
*
* Description: SCRAMBLE_MASK -> CS SE DS
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
*---------------------------------------------------------------------------*/
void ReadIDSecure_DSType2(CardBootData *cbd)
{
u32 scrambleMask;
// スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
@ -165,8 +170,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
SetSecureCommand(S_RD_ID, cbd);
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -174,13 +178,9 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// スクランブルの設定
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask;
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -190,12 +190,11 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ReadSegSecure_DSType2
Description: Secure領域を読み込む関数
4
Secure領域全部を読み込んでいる
* Name: ReadSegSecure_DSType2
*
* Description: Secure領域を読み込む関数
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page
*---------------------------------------------------------------------------*/
void ReadSegSecure_DSType2(CardBootData *cbd)
{
@ -204,6 +203,9 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
u64 vae = cbd->vae;
GCDCmd64 cndLE, cndBE;
// スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
for(i=0; i<SECURE_SEGMENT_NUM; i++){
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -231,8 +233,7 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -246,8 +247,7 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | PC_MASK & (0x1 << PC_SHIFT) | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -265,18 +265,22 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: SwitchONPNGSecure_DSType2
Description:
* Name: SwitchONPNGSecure_DSType2
*
* Description: PNジェネレータをONにする
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType2(CardBootData *cbd)
{
// スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd);
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -286,9 +290,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -297,18 +300,22 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: SwitchOFFPNGSecure_DSType2
Description:
* Name: SwitchOFFPNGSecure_DSType2
*
* Description: PNジェネレータをOFFする
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
{
// スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd);
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -317,9 +324,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -329,18 +335,22 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
}
/*---------------------------------------------------------------------------*
Name: ChangeModeSecure_DSType2
Description:
* Name: ChangeModeSecure_DSType2
*
* Description: Gameモードに移行する
*
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/
void ChangeModeSecure_DSType2(CardBootData *cbd)
{
// スクランブルの設定
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
// コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd);
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -350,8 +360,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -373,9 +382,11 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
/*---------------------------------------------------------------------------*
Name: ReadPageGame_DSType1
Description:
* Name: ReadPageGame_DSType1
*
* Description:
*
* CT=150ns Latency1=0x657 Latency2=0x1 Pagecount=1page
*---------------------------------------------------------------------------*/
void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{

View File

@ -170,10 +170,10 @@ void HOTSW_Init(void)
#ifdef SDK_ARM7
// チャッタリングカウンタの値を設定
reg_MI_MC1 = (u32)((reg_MI_MC1 & 0xffff) | 0xc80000);
reg_MI_MC1 = (u32)((reg_MI_MC1 & 0xffff) | 0xe00000);
// Counter-Aの値を設定
reg_MI_MC2 = 0xc8;
reg_MI_MC2 = 0xe0;
#else
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
@ -398,13 +398,6 @@ BOOL HOTSW_LoadCardData(void)
// デバッグ出力
// ShowRomHeaderData();
}
// ※最終的にはカードIDをHW_BOOT_CHECK_INFO_BUFに入れないと、アプリ起動後のカード抜け処理が上手く動作しないので注意。
// 今はスロットBを使用しているので、ーケアでOK.
// *(u32 *)HW_BOOT_CHECK_INFO_BUF = s_cbData.id_gam;
// *(u32 *)HW_RED_RESERVED = s_cbData.id_gam;
// SYSMi_GetWork()->nCardID = s_cbData.id_gam;
OS_TPrintf("-----------------------------------------------\n\n");
}
else{
@ -417,28 +410,6 @@ BOOL HOTSW_LoadCardData(void)
OS_TPrintf( "Load Card Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
// [TODO:]暫定処置。ちゃんとした流れでLauncher側に渡すようにする。
// MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
// SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
//#ifdef DEBUG_USED_CARD_SLOT_B_
// SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
//#endif
/*
{
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isBusyHotSW = 0;
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus;
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0;
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0;
// HOTSW_Finalize();
}
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
}
*/
return retval;
}
@ -797,8 +768,6 @@ static BOOL IsCardExist(void)
*---------------------------------------------------------------------------*/
static void McPowerOn(void)
{
// OS_TPrintf("Slot State : %08x\n", reg_MI_MC1);
if((reg_MI_MC1 & SLOT_STATUS_MODE_SELECT_MSK) == SLOT_STATUS_MODE_00){
// SCFG_MC1 の Slot Status の M1,M0 を 01 にする
reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_01);
@ -815,8 +784,6 @@ static void McPowerOn(void)
// 27ms待ち
OS_Sleep(27);
// OS_TPrintf("MC Power ON\n");
}
}
@ -833,6 +800,9 @@ static void McPowerOff(void)
// SCFG_MC1 の Slot Status の M1,M0 が 00 になるまでポーリング
while((reg_MI_MC1 & SLOT_STATUS_MODE_SELECT_MSK) != SLOT_STATUS_MODE_00){}
// 100ms待ち [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。
OS_Sleep(100);
}
}