mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
コマンドレジスタ設定関数を共通化してコードを整理。
ChangeModeNormal2を追加。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@806 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
b6d9f444c6
commit
0f8a452e0c
@ -16,15 +16,18 @@ extern "C" {
|
|||||||
// Function Describe
|
// Function Describe
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// ■ ノーマルモードのコマンド ■
|
// ■ ノーマルモードのコマンド ■
|
||||||
// DSカードのノーマルモードのID読み込み
|
// ノーマルモードのID読み込み
|
||||||
HotSwState ReadIDNormal(CardBootData *cbd);
|
HotSwState ReadIDNormal(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのノーマルモードのBoot Segment(4Kbyte)読み込み
|
// ノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||||
HotSwState ReadBootSegNormal(CardBootData *cbd);
|
HotSwState ReadBootSegNormal(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードType1のノーマルモードのモード変更
|
// ノーマルモードからセキュアモードへの変更
|
||||||
HotSwState ChangeModeNormal(CardBootData *cbd);
|
HotSwState ChangeModeNormal(CardBootData *cbd);
|
||||||
|
|
||||||
|
// ノーマルモードからセキュア2モードへの変更
|
||||||
|
HotSwState ChangeModeNormal2(CardBootData *cbd);
|
||||||
|
|
||||||
// カード側のKeyTableをロード
|
// カード側のKeyTableをロード
|
||||||
HotSwState LoadTable(void);
|
HotSwState LoadTable(void);
|
||||||
|
|
||||||
@ -33,29 +36,35 @@ HotSwState ReadRomEmulationData(CardBootData *cbd);
|
|||||||
|
|
||||||
|
|
||||||
// ■ セキュアモードのコマンド ■
|
// ■ セキュアモードのコマンド ■
|
||||||
// DSカードのセキュアモードのID読み込み
|
// セキュアモードのID読み込み
|
||||||
HotSwState ReadIDSecure(CardBootData *cbd);
|
HotSwState ReadIDSecure(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのセキュアモードのSecure Segment(16Kbyte)読み込み
|
// セキュアモードのSecure Segment(16Kbyte)読み込み
|
||||||
HotSwState ReadSegSecure(CardBootData *cbd);
|
HotSwState ReadSegSecure(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのセキュアモードのPNジェネレータON
|
// セキュアモードのPNジェネレータON
|
||||||
HotSwState SwitchONPNGSecure(CardBootData *cbd);
|
HotSwState SwitchONPNGSecure(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのセキュアモードのPNジェネレータOFF
|
// セキュアモードのPNジェネレータOFF
|
||||||
HotSwState SwitchOFFPNGSecure(CardBootData *cbd);
|
HotSwState SwitchOFFPNGSecure(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのセキュアモードのモード変更
|
// セキュアモードのモード変更
|
||||||
HotSwState ChangeModeSecure(CardBootData *cbd);
|
HotSwState ChangeModeSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
// ■ ゲームモードのコマンド ■
|
// ■ ゲームモードのコマンド ■
|
||||||
// DSカードのゲームモードのID読み込み
|
// ゲームモードのID読み込み
|
||||||
HotSwState ReadIDGame(CardBootData *cbd);
|
HotSwState ReadIDGame(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードのゲームモードの指定ページ読み込み
|
// ゲームモードの指定ページ読み込み
|
||||||
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
||||||
|
|
||||||
|
|
||||||
|
// ■ 内部関数 ■
|
||||||
|
// LEコマンドをBEへ変換してレジスタへセット
|
||||||
|
void HOTSWi_SetCommand(GCDCmd64 *cndLE);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -17,12 +17,33 @@
|
|||||||
#define ROM_EMULATION_END_OFS 0x180
|
#define ROM_EMULATION_END_OFS 0x180
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
|
static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd);
|
||||||
|
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Function Describe
|
// Function Describe
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
|
||||||
|
void HOTSWi_SetCommand(GCDCmd64 *cndLE)
|
||||||
|
{
|
||||||
|
GCDCmd64 cndBE;
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す
|
||||||
|
cndBE.b[7] = cndLE->b[0];
|
||||||
|
cndBE.b[6] = cndLE->b[1];
|
||||||
|
cndBE.b[5] = cndLE->b[2];
|
||||||
|
cndBE.b[4] = cndLE->b[3];
|
||||||
|
cndBE.b[3] = cndLE->b[4];
|
||||||
|
cndBE.b[2] = cndLE->b[5];
|
||||||
|
cndBE.b[1] = cndLE->b[6];
|
||||||
|
cndBE.b[0] = cndLE->b[7];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
// ■ ノーマルモードのコマンド ■
|
// ■ ノーマルモードのコマンド ■
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
@ -33,7 +54,7 @@
|
|||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
HotSwState ReadIDNormal(CardBootData *cbd)
|
HotSwState ReadIDNormal(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
// カード割り込みによるDMAコピー
|
// カード割り込みによるDMAコピー
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
|
||||||
@ -41,19 +62,8 @@ HotSwState ReadIDNormal(CardBootData *cbd)
|
|||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_RD_ID;
|
cndLE.dw = HSWOP_N_OP_RD_ID;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
@ -71,7 +81,7 @@ HotSwState ReadIDNormal(CardBootData *cbd)
|
|||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
* Name: ReadBootSegNormal
|
* Name: ReadBootSegNormal
|
||||||
*
|
*
|
||||||
* Description: Type1のノーマルモードのBoot Segment読み込み
|
* Description: ノーマルモードのBoot Segment読み込み
|
||||||
*
|
*
|
||||||
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
@ -81,7 +91,7 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
u32 *dst = cbd->pBootSegBuf->word;
|
u32 *dst = cbd->pBootSegBuf->word;
|
||||||
u32 temp;
|
u32 temp;
|
||||||
u64 page = 0;
|
u64 page = 0;
|
||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
if(cbd->cardType == DS_CARD_TYPE_1){
|
if(cbd->cardType == DS_CARD_TYPE_1){
|
||||||
loop = 0x1UL;
|
loop = 0x1UL;
|
||||||
@ -110,19 +120,8 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
||||||
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
|
||||||
|
|
||||||
if(cbd->modeType == HOTSW_MODE1){
|
if(cbd->modeType == HOTSW_MODE1){
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
@ -152,37 +151,43 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
* Name: ChangeModeNormal
|
* Name: ChangeModeNormal
|
||||||
*
|
*
|
||||||
* Description: Type1のノーマルモードのモード変更
|
* Description: ノーマルモードからセキュアモードへの変更
|
||||||
*
|
*
|
||||||
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ChangeModeNormal(CardBootData *cbd)
|
HotSwState ChangeModeNormal(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
GCDCmd64 tempCnd, cnd;
|
return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG_MODE);
|
||||||
u64 vae64 = cbd->vae;
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ChangeModeNorma2
|
||||||
|
*
|
||||||
|
* Description: ノーマルモードからセキュア2モードへの変更
|
||||||
|
*
|
||||||
|
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ChangeModeNormal2(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG2_MODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd)
|
||||||
|
{
|
||||||
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = HSWOP_N_OP_CHG_MODE;
|
cndLE.dw = cmd;
|
||||||
tempCnd.dw |= cbd->vbi << HSWOP_N_VBI_SHIFT;
|
cndLE.dw |= cbd->vbi << HSWOP_N_VBI_SHIFT;
|
||||||
tempCnd.dw |= vae64 << HSWOP_N_VAE_SHIFT;
|
cndLE.dw |= (u64)cbd->vae << HSWOP_N_VAE_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cnd.b[0] = tempCnd.b[7];
|
|
||||||
cnd.b[1] = tempCnd.b[6];
|
|
||||||
cnd.b[2] = tempCnd.b[5];
|
|
||||||
cnd.b[3] = tempCnd.b[4];
|
|
||||||
cnd.b[4] = tempCnd.b[3];
|
|
||||||
cnd.b[5] = tempCnd.b[2];
|
|
||||||
cnd.b[6] = tempCnd.b[1];
|
|
||||||
cnd.b[7] = tempCnd.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
||||||
@ -194,6 +199,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
|
|||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
* LoadTable関数
|
* LoadTable関数
|
||||||
*
|
*
|
||||||
@ -204,25 +210,14 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
|
|||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
HotSwState LoadTable(void)
|
HotSwState LoadTable(void)
|
||||||
{
|
{
|
||||||
GCDCmd64 tempCnd, cnd;
|
GCDCmd64 cndLE;
|
||||||
u32 temp;
|
u32 temp;
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = HSWOP_N_OP_LD_TABLE;
|
cndLE.dw = HSWOP_N_OP_LD_TABLE;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cnd.b[0] = tempCnd.b[7];
|
|
||||||
cnd.b[1] = tempCnd.b[6];
|
|
||||||
cnd.b[2] = tempCnd.b[5];
|
|
||||||
cnd.b[3] = tempCnd.b[4];
|
|
||||||
cnd.b[4] = tempCnd.b[3];
|
|
||||||
cnd.b[5] = tempCnd.b[2];
|
|
||||||
cnd.b[6] = tempCnd.b[1];
|
|
||||||
cnd.b[7] = tempCnd.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
@ -291,7 +286,7 @@ HotSwState ReadRomEmulationData(CardBootData *cbd)
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
||||||
{
|
{
|
||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE;
|
||||||
u64 data;
|
u64 data;
|
||||||
|
|
||||||
// comannd0部分
|
// comannd0部分
|
||||||
@ -322,20 +317,9 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|||||||
// コマンドの暗号化
|
// コマンドの暗号化
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -399,8 +383,7 @@ HotSwState ReadSegSecure(CardBootData *cbd)
|
|||||||
u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf;
|
u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf;
|
||||||
u32 loop, pc, size, interval, i, j=0, k;
|
u32 loop, pc, size, interval, i, j=0, k;
|
||||||
u64 segNum = 4;
|
u64 segNum = 4;
|
||||||
u64 vae = cbd->vae;
|
GCDCmd64 cndLE;
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
if(cbd->cardType == DS_CARD_TYPE_1){
|
if(cbd->cardType == DS_CARD_TYPE_1){
|
||||||
loop = 0x1UL;
|
loop = 0x1UL;
|
||||||
@ -422,25 +405,14 @@ HotSwState ReadSegSecure(CardBootData *cbd)
|
|||||||
|
|
||||||
cndLE.dw = HSWOP_S_OP_RD_SEG;
|
cndLE.dw = HSWOP_S_OP_RD_SEG;
|
||||||
cndLE.dw |= cbd->vbi;
|
cndLE.dw |= cbd->vbi;
|
||||||
cndLE.dw |= vae << HSWOP_S_VA_SHIFT;
|
cndLE.dw |= (u64)cbd->vae << HSWOP_S_VA_SHIFT;
|
||||||
cndLE.dw |= segNum << HSWOP_S_VC_SHIFT;
|
cndLE.dw |= segNum << HSWOP_S_VC_SHIFT;
|
||||||
|
|
||||||
// コマンドの暗号化
|
// コマンドの暗号化
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
// MCCMD レジスタ設定
|
||||||
cndBE.b[7] = cndLE.b[0];
|
HOTSWi_SetCommand(&cndLE);
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
|
|
||||||
if(cbd->cardType == DS_CARD_TYPE_2){
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
@ -623,7 +595,7 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDGame(CardBootData *cbd)
|
HotSwState ReadIDGame(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
@ -635,19 +607,8 @@ HotSwState ReadIDGame(CardBootData *cbd)
|
|||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_G_OP_RD_ID;
|
cndLE.dw = HSWOP_G_OP_RD_ID;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||||
@ -670,7 +631,7 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
|||||||
{
|
{
|
||||||
u32 loop, counter=0;
|
u32 loop, counter=0;
|
||||||
u64 i, page;
|
u64 i, page;
|
||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
page = (u32)(start_addr / PAGE_SIZE);
|
page = (u32)(start_addr / PAGE_SIZE);
|
||||||
loop = (u32)(size / PAGE_SIZE);
|
loop = (u32)(size / PAGE_SIZE);
|
||||||
@ -691,20 +652,9 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
|||||||
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
||||||
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
|
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
// MCCMD レジスタ設定
|
||||||
cndBE.b[7] = cndLE.b[0];
|
HOTSWi_SetCommand(&cndLE);
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||||
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <blowfish.h>
|
#include <blowfish.h>
|
||||||
|
#include <dsCardCommon.h>
|
||||||
#include <romEmulation.h>
|
#include <romEmulation.h>
|
||||||
#include <customNDma.h>
|
#include <customNDma.h>
|
||||||
|
|
||||||
@ -53,7 +54,7 @@
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
GCDCmd64 tempCnd, cnd;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
@ -63,21 +64,10 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
|||||||
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) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = HSWOP_N_OP_RD_ID;
|
cndLE.dw = HSWOP_N_OP_RD_ID;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cnd.b[0] = tempCnd.b[7];
|
|
||||||
cnd.b[1] = tempCnd.b[6];
|
|
||||||
cnd.b[2] = tempCnd.b[5];
|
|
||||||
cnd.b[3] = tempCnd.b[4];
|
|
||||||
cnd.b[4] = tempCnd.b[3];
|
|
||||||
cnd.b[5] = tempCnd.b[2];
|
|
||||||
cnd.b[6] = tempCnd.b[1];
|
|
||||||
cnd.b[7] = tempCnd.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
@ -100,7 +90,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
{
|
{
|
||||||
u32 i,j=0;
|
u32 i,j=0;
|
||||||
u64 page = 0x20;
|
u64 page = 0x20;
|
||||||
GCDCmd64 tempCnd, cnd;
|
GCDCmd64 cndLE;
|
||||||
u32 n = 0;
|
u32 n = 0;
|
||||||
|
|
||||||
for(i=0; i<SECURE_PAGE_NUM; i++){
|
for(i=0; i<SECURE_PAGE_NUM; i++){
|
||||||
@ -109,22 +99,11 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = HSWOP_N_OP_RD_PAGE;
|
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
||||||
tempCnd.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cnd.b[0] = tempCnd.b[7];
|
|
||||||
cnd.b[1] = tempCnd.b[6];
|
|
||||||
cnd.b[2] = tempCnd.b[5];
|
|
||||||
cnd.b[3] = tempCnd.b[4];
|
|
||||||
cnd.b[4] = tempCnd.b[3];
|
|
||||||
cnd.b[5] = tempCnd.b[2];
|
|
||||||
cnd.b[6] = tempCnd.b[1];
|
|
||||||
cnd.b[7] = tempCnd.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
@ -176,31 +155,17 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
|||||||
{
|
{
|
||||||
#pragma unused( cbd )
|
#pragma unused( cbd )
|
||||||
|
|
||||||
GCDCmd64 tempCnd, cnd;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = HSWOP_S_OP_CHG_MODE;
|
cndLE.dw = HSWOP_S_OP_CHG_MODE;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cnd.b[0] = tempCnd.b[7];
|
|
||||||
cnd.b[1] = tempCnd.b[6];
|
|
||||||
cnd.b[2] = tempCnd.b[5];
|
|
||||||
cnd.b[3] = tempCnd.b[4];
|
|
||||||
cnd.b[4] = tempCnd.b[3];
|
|
||||||
cnd.b[5] = tempCnd.b[2];
|
|
||||||
cnd.b[6] = tempCnd.b[1];
|
|
||||||
cnd.b[7] = tempCnd.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
HOTSWi_SetCommand(&cndLE);
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK;
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user