mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ROMコマンドをハードコーディングではなくマクロを使用するように変更。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@804 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
ff583054a1
commit
e2374a245c
118
build/libraries_sysmenu/hotsw/ARM7/include/command.h
Normal file
118
build/libraries_sysmenu/hotsw/ARM7/include/command.h
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - HOTSW - include
|
||||||
|
File: command.h
|
||||||
|
|
||||||
|
Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev: $
|
||||||
|
$Author: $
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef __HOTSW_COMMAND_H__
|
||||||
|
#define __HOTSW_COMMAND_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// NORMAL command
|
||||||
|
|
||||||
|
#define HSWOP_N_OP_MASK 0xff00000000000000ULL
|
||||||
|
#define HSWOP_N_OP_SIZE 8
|
||||||
|
|
||||||
|
#define HSWOP_N_OP_RD_ID 0x9000000000000000ULL
|
||||||
|
#define HSWOP_N_OP_RD_PAGE 0x0000000000000000ULL
|
||||||
|
#define HSWOP_N_OP_WR_PAGE 0x8000000000000000ULL
|
||||||
|
#define HSWOP_N_OP_LD_TABLE 0x9f00000000000000ULL
|
||||||
|
#define HSWOP_N_OP_CHG_MODE 0x3c00000000000000ULL
|
||||||
|
#define HSWOP_N_OP_CHG2_MODE 0x3d00000000000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_N_RD_ID_PAD 0x00ffffffffffffffULL
|
||||||
|
#define HSWOP_N_RD_PAGE_PAD 0x00fffffeff00ffffULL
|
||||||
|
#define HSWOP_N_CHG_MODE_PAD 0x00000000f00000ffULL
|
||||||
|
#define HSWOP_N_CHG2_MODE_PAD HSWOP_N_CHG_MODE_PAD
|
||||||
|
|
||||||
|
#define HSWOP_N_RD_PAGE_ADDR_SHIFT 33
|
||||||
|
#define HSWOP_N_RD_PAGE_ADDR_SIZE 23
|
||||||
|
#define HSWOP_N_RD_PAGE_ADDR_MASK 0x00fffffe00000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_N_VAE_SHIFT 32
|
||||||
|
#define HSWOP_N_VAE_SIZE 24
|
||||||
|
#define HSWOP_N_VAE_MASK 0x00ffffff00000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_N_VBI_SHIFT 8
|
||||||
|
#define HSWOP_N_VBI_SIZE 20
|
||||||
|
#define HSWOP_N_VBI_MASK 0x000000000fffff00ULL
|
||||||
|
|
||||||
|
|
||||||
|
// SECURE command
|
||||||
|
|
||||||
|
#define HSWOP_S_OP_MASK 0xf000000000000000ULL
|
||||||
|
#define HSWOP_S_OP_SIZE 4
|
||||||
|
|
||||||
|
#define HSWOP_S_OP_RD_ID 0x1000000000000000ULL
|
||||||
|
#define HSWOP_S_OP_RD_SEG 0x2000000000000000ULL
|
||||||
|
#define HSWOP_S_OP_PNG_ON 0x4000000000000000ULL
|
||||||
|
#define HSWOP_S_OP_PNG_OFF 0x6000000000000000ULL
|
||||||
|
#define HSWOP_S_OP_CHG_MODE 0xa000000000000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_S_VA_SHIFT HSWOP_S_VB_SIZE
|
||||||
|
#define HSWOP_S_VA_SIZE 24
|
||||||
|
#define HSWOP_S_VA_MASK 0x00000ffffff00000ULL
|
||||||
|
|
||||||
|
#define HSWOP_S_VB_SHIFT 0
|
||||||
|
#define HSWOP_S_VB_SIZE 20
|
||||||
|
#define HSWOP_S_VB_MASK 0x00000000000fffffULL
|
||||||
|
|
||||||
|
#define HSWOP_S_VC_SHIFT (HSWOP_S_VA_SIZE + HSWOP_S_VB_SIZE)
|
||||||
|
#define HSWOP_S_VC_SIZE 16
|
||||||
|
#define HSWOP_S_VC_MASK 0x0ffff00000000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_S_VD_SHIFT HSWOP_S_VA_SHIFT
|
||||||
|
#define HSWOP_S_VD_SIZE HSWOP_S_VA_SIZE
|
||||||
|
#define HSWOP_S_VD_MASK HSWOP_S_VA_MASK
|
||||||
|
|
||||||
|
|
||||||
|
// GAME command
|
||||||
|
|
||||||
|
#define HSWOP_G_OP_MASK 0xff00000000000000ULL
|
||||||
|
#define HSWOP_G_OP_SIZE 8
|
||||||
|
|
||||||
|
#define HSWOP_G_OP_RD_ID 0xb800000000000000ULL
|
||||||
|
#define HSWOP_G_OP_RD_UID 0xb900000000000000ULL
|
||||||
|
#define HSWOP_G_OP_RD_PAGE 0xb700000000000000ULL
|
||||||
|
#define HSWOP_G_OP_RD_CACHE_START 0x5800000000000000ULL
|
||||||
|
#define HSWOP_G_OP_RD_CACHE 0x6000000000000000ULL
|
||||||
|
#define HSWOP_G_OP_RD_CACHE_LAST 0x6800000000000000ULL
|
||||||
|
#define HSWOP_G_OP_WR_PAGE 0x8000000000000000ULL
|
||||||
|
|
||||||
|
#define HSWOP_G_RD_ID_PAD 0x00ffffffffffffffULL
|
||||||
|
#define HSWOP_G_RD_UID_PAD 0x00ffffffffffffffULL
|
||||||
|
#define HSWOP_G_RD_PAGE_PAD 0x00f0000000ffffffULL
|
||||||
|
|
||||||
|
#define HSWOP_G_RD_PAGE_ADDR_SHIFT 33
|
||||||
|
#define HSWOP_G_RD_PAGE_ADDR_SIZE 23
|
||||||
|
#define HSWOP_G_RD_PAGE_ADDR_MASK 0x000ffffe00000000ULL
|
||||||
|
|
||||||
|
|
||||||
|
// ROM ID
|
||||||
|
|
||||||
|
#define HOTSW_ROMID_1TROM_MASK 0x80000000UL
|
||||||
|
#define HOTSW_ROMID_TWLROM_MASK 0x40000000UL
|
||||||
|
#define HOTSW_ROMID_BADBLK_MASK 0x20000000UL
|
||||||
|
#define HOTSW_ROMID_SIZE_MASK 0x0000ff00UL
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __HOTSW_COMMAND_H__ */
|
||||||
|
#endif
|
||||||
@ -16,6 +16,7 @@
|
|||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <twl/os/common/format_rom.h>
|
#include <twl/os/common/format_rom.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
#include "command.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@ -33,12 +33,27 @@
|
|||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
HotSwState ReadIDNormal(CardBootData *cbd)
|
HotSwState ReadIDNormal(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
// カード割り込みによる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) );
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// リトルエンディアンで作って
|
||||||
reg_HOTSW_MCCMD0 = 0x00000090;
|
cndLE.dw = HSWOP_N_OP_RD_ID;
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
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 レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
||||||
|
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);
|
||||||
@ -91,12 +106,9 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = 0x0 << 24;
|
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
||||||
cndLE.dw |= page << 33;
|
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
// ビックエンディアンにする
|
||||||
cndBE.b[0] = cndLE.b[7];
|
cndBE.b[0] = cndLE.b[7];
|
||||||
@ -152,14 +164,11 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
|
|||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = cbd->vbi << 8;
|
tempCnd.dw = HSWOP_N_OP_CHG_MODE;
|
||||||
tempCnd.dw |= vae64 << 32;
|
tempCnd.dw |= cbd->vbi << HSWOP_N_VBI_SHIFT;
|
||||||
tempCnd.dw |= 0x3c00000000000000;
|
tempCnd.dw |= vae64 << HSWOP_N_VAE_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
// ビックエンディアンにする
|
||||||
cnd.b[0] = tempCnd.b[7];
|
cnd.b[0] = tempCnd.b[7];
|
||||||
@ -170,7 +179,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
|
|||||||
cnd.b[5] = tempCnd.b[2];
|
cnd.b[5] = tempCnd.b[2];
|
||||||
cnd.b[6] = tempCnd.b[1];
|
cnd.b[6] = tempCnd.b[1];
|
||||||
cnd.b[7] = tempCnd.b[0];
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
@ -195,11 +204,25 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
|
|||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
HotSwState LoadTable(void)
|
HotSwState LoadTable(void)
|
||||||
{
|
{
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
u32 temp;
|
u32 temp;
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
tempCnd.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 = 0x0000009f;
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
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);
|
||||||
@ -271,32 +294,30 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|||||||
GCDCmd64 cndLE, cndBE;
|
GCDCmd64 cndLE, cndBE;
|
||||||
u64 data;
|
u64 data;
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae;
|
|
||||||
|
|
||||||
cndLE.dw = cbd->vbi;
|
|
||||||
cndLE.dw |= data << 20;
|
|
||||||
|
|
||||||
// comannd0部分
|
// comannd0部分
|
||||||
switch(type){
|
switch(type){
|
||||||
case S_RD_ID:
|
case S_RD_ID:
|
||||||
cndLE.dw |= 0x1000000000000000;
|
cndLE.dw = HSWOP_S_OP_RD_ID;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_PNG_ON:
|
case S_PNG_ON:
|
||||||
cndLE.dw |= 0x4000000000000000;
|
cndLE.dw = HSWOP_S_OP_PNG_ON;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_PNG_OFF:
|
case S_PNG_OFF:
|
||||||
cndLE.dw |= 0x6000000000000000;
|
cndLE.dw = HSWOP_S_OP_PNG_OFF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_CHG_MODE:
|
case S_CHG_MODE:
|
||||||
cndLE.dw |= 0xa000000000000000;
|
cndLE.dw = HSWOP_S_OP_CHG_MODE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae;
|
||||||
|
|
||||||
|
cndLE.dw |= cbd->vbi;
|
||||||
|
cndLE.dw |= data << HSWOP_S_VA_SHIFT;
|
||||||
|
|
||||||
if(!cbd->debuggerFlg){
|
if(!cbd->debuggerFlg){
|
||||||
// コマンドの暗号化
|
// コマンドの暗号化
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
@ -398,13 +419,11 @@ HotSwState ReadSegSecure(CardBootData *cbd)
|
|||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
cndLE.dw = HSWOP_S_OP_RD_SEG;
|
||||||
|
cndLE.dw |= cbd->vbi;
|
||||||
cndLE.dw = cbd->vbi;
|
cndLE.dw |= vae << HSWOP_S_VA_SHIFT;
|
||||||
cndLE.dw |= vae << 20;
|
cndLE.dw |= segNum << HSWOP_S_VC_SHIFT;
|
||||||
cndLE.dw |= segNum << 44;
|
|
||||||
cndLE.dw |= 0x2000000000000000;
|
|
||||||
|
|
||||||
// コマンドの暗号化
|
// コマンドの暗号化
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
@ -604,6 +623,8 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDGame(CardBootData *cbd)
|
HotSwState ReadIDGame(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
@ -611,9 +632,22 @@ HotSwState ReadIDGame(CardBootData *cbd)
|
|||||||
// 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) );
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
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 = 0x000000B8;
|
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
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 |
|
||||||
@ -653,13 +687,10 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
|||||||
// 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 );
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// コマンド作成
|
// コマンド作成
|
||||||
cndLE.dw = (page + i) << 33;
|
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
||||||
cndLE.dw |= 0xB700000000000000;
|
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
cndBE.b[7] = cndLE.b[0];
|
cndBE.b[7] = cndLE.b[0];
|
||||||
cndBE.b[6] = cndLE.b[1];
|
cndBE.b[6] = cndLE.b[1];
|
||||||
|
|||||||
@ -316,7 +316,7 @@ static HotSwState LoadCardData(void)
|
|||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
||||||
s_cbData.cardType = (s_cbData.id_nml & 0x80000000) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1;
|
s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1;
|
||||||
|
|
||||||
{
|
{
|
||||||
u8 i;
|
u8 i;
|
||||||
|
|||||||
@ -53,16 +53,31 @@
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
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) );
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// リトルエンディアンで作って
|
||||||
reg_HOTSW_MCCMD0 = 0x00000090;
|
tempCnd.dw = HSWOP_N_OP_RD_ID;
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
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 レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
|
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);
|
||||||
@ -92,12 +107,10 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = page << 33;
|
tempCnd.dw = HSWOP_N_OP_RD_PAGE;
|
||||||
|
tempCnd.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
// ビックエンディアンにする
|
||||||
cnd.b[0] = tempCnd.b[7];
|
cnd.b[0] = tempCnd.b[7];
|
||||||
@ -108,7 +121,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
cnd.b[5] = tempCnd.b[2];
|
cnd.b[5] = tempCnd.b[2];
|
||||||
cnd.b[6] = tempCnd.b[1];
|
cnd.b[6] = tempCnd.b[1];
|
||||||
cnd.b[7] = tempCnd.b[0];
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
@ -173,7 +186,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
|||||||
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
tempCnd.dw = 0xa000000000000000;
|
tempCnd.dw = HSWOP_S_OP_CHG_MODE;
|
||||||
|
|
||||||
// ビックエンディアンにする
|
// ビックエンディアンにする
|
||||||
cnd.b[0] = tempCnd.b[7];
|
cnd.b[0] = tempCnd.b[7];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user