ROMコマンドをハードコーディングではなくマクロを使用するように変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@804 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-03-04 09:01:23 +00:00
parent ff583054a1
commit e2374a245c
5 changed files with 218 additions and 55 deletions

View 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

View File

@ -16,6 +16,7 @@
#include <twl.h>
#include <twl/os/common/format_rom.h>
#include <sysmenu.h>
#include "command.h"
#ifdef __cplusplus
extern "C" {

View File

@ -33,12 +33,27 @@
* ----------------------------------------------------------------- */
HotSwState ReadIDNormal(CardBootData *cbd)
{
GCDCmd64 cndLE, cndBE;
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000090;
reg_HOTSW_MCCMD1 = 0x00000000;
// リトルエンディアンで作って
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 レジスタ設定
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
@ -91,12 +106,9 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
// リトルエンディアンで作って
cndLE.dw = 0x0 << 24;
cndLE.dw |= page << 33;
cndLE.dw = HSWOP_N_OP_RD_PAGE;
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
// ビックエンディアンにする
cndBE.b[0] = cndLE.b[7];
@ -152,14 +164,11 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// ゼロクリア
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
// リトルエンディアンで作って
tempCnd.dw = cbd->vbi << 8;
tempCnd.dw |= vae64 << 32;
tempCnd.dw |= 0x3c00000000000000;
tempCnd.dw = HSWOP_N_OP_CHG_MODE;
tempCnd.dw |= cbd->vbi << HSWOP_N_VBI_SHIFT;
tempCnd.dw |= vae64 << HSWOP_N_VAE_SHIFT;
// ビックエンディアンにする
cnd.b[0] = tempCnd.b[7];
@ -170,7 +179,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
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];
@ -195,11 +204,25 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
* ----------------------------------------------------------------- */
HotSwState LoadTable(void)
{
GCDCmd64 tempCnd, cnd;
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 レジスタ設定
reg_HOTSW_MCCMD0 = 0x0000009f;
reg_HOTSW_MCCMD1 = 0x00000000;
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
@ -271,32 +294,30 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
GCDCmd64 cndLE, cndBE;
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部分
switch(type){
case S_RD_ID:
cndLE.dw |= 0x1000000000000000;
cndLE.dw = HSWOP_S_OP_RD_ID;
break;
case S_PNG_ON:
cndLE.dw |= 0x4000000000000000;
cndLE.dw = HSWOP_S_OP_PNG_ON;
break;
case S_PNG_OFF:
cndLE.dw |= 0x6000000000000000;
cndLE.dw = HSWOP_S_OP_PNG_OFF;
break;
case S_CHG_MODE:
cndLE.dw |= 0xa000000000000000;
cndLE.dw = HSWOP_S_OP_CHG_MODE;
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){
// コマンドの暗号化
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
@ -398,13 +419,11 @@ HotSwState ReadSegSecure(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
cndLE.dw = cbd->vbi;
cndLE.dw |= vae << 20;
cndLE.dw |= segNum << 44;
cndLE.dw |= 0x2000000000000000;
cndLE.dw = HSWOP_S_OP_RD_SEG;
cndLE.dw |= cbd->vbi;
cndLE.dw |= vae << HSWOP_S_VA_SHIFT;
cndLE.dw |= segNum << HSWOP_S_VC_SHIFT;
// コマンドの暗号化
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
@ -604,6 +623,8 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
*---------------------------------------------------------------------------*/
HotSwState ReadIDGame(CardBootData *cbd)
{
GCDCmd64 cndLE, cndBE;
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
@ -611,9 +632,22 @@ HotSwState ReadIDGame(CardBootData *cbd)
// NewDMA転送の準備
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 レジスタ設定
reg_HOTSW_MCCMD0 = 0x000000B8;
reg_HOTSW_MCCMD1 = 0x00000000;
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
@ -653,13 +687,10 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
// NewDMA転送の準備
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 |= 0xB700000000000000;
cndLE.dw = HSWOP_G_OP_RD_PAGE;
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
// ビッグエンディアンに直す(暗号化後)
cndBE.b[7] = cndLE.b[0];
cndBE.b[6] = cndLE.b[1];

View File

@ -316,7 +316,7 @@ static HotSwState LoadCardData(void)
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードタイプを判別をして、使う関数を切替える 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;

View File

@ -53,16 +53,31 @@
*---------------------------------------------------------------------------*/
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
{
GCDCmd64 tempCnd, cnd;
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000090;
reg_HOTSW_MCCMD1 = 0x00000000;
// リトルエンディアンで作って
tempCnd.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 レジスタ設定
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
@ -92,12 +107,10 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
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];
@ -108,7 +121,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
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];
@ -173,7 +186,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
// リトルエンディアンで作って
tempCnd.dw = 0xa000000000000000;
tempCnd.dw = HSWOP_S_OP_CHG_MODE;
// ビックエンディアンにする
cnd.b[0] = tempCnd.b[7];