(更新:Akabane Jumpei) NDmaを使って、カードデータをバッファに転送するよう変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@376 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2007-12-19 05:56:04 +00:00
parent a1cb200812
commit 4175e2dae7
7 changed files with 190 additions and 231 deletions

View File

@ -29,7 +29,7 @@ TWL_PROC = ARM7
SRCDIR = ./src
INCDIR = ./include
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c customNDma.c
TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a

View File

@ -0,0 +1,20 @@
#ifndef __CUSTOM_NDMA_H__
#define __CUSTOM_NDMA_H__
#include <twl.h>
#ifdef __cplusplus
extern "C" {
#endif
// ===========================================================================
// Function Describe
// ===========================================================================
// ƒJ<C692>[ƒh
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif // __CUSTOM_NDMA_H__

View File

@ -15,10 +15,10 @@ extern "C" {
// ===========================================================================
// Function Describe
// ===========================================================================
// ■ ノーマルモードのコマンド ■
// DSカードType2のRomエミュレーションデータの読み込み
void ReadRomEmulationData_DSType2(CardBootData *cbd);
// ■ ノーマルモードのコマンド ■
// DSカードType2のーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_DSType2(CardBootData *cbd);

View File

@ -0,0 +1,52 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File:
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <customNDma.h>
// Define data --------------------------------------------------------------
#define NDMA_BLOCK_WORD_COUNT_1 0x0
#define NDMA_NO_INTERVAL_NORMAL_SCALE 0x0
#define NDMA_TOTAL_WORD_COUNT_1 0x1
#define NDMA_WORD_COUNT_1 0x1
#define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." );
// ===========================================================================
// Function Describe
// ===========================================================================
// custom CARD DMA
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size)
{
u32 contData;
OSIntrMode enabled = OS_DisableInterrupts();
//--- Assert
ASSERT_DMANO( ndmaNo );
//---- confirm DMA free
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){}
//---- set up registers
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_DAD_WOFFSET ) = (u32)dest;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_TCNT_WOFFSET ) = (u32)(size/4);
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1;
//---- decide control register
contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE;
contData |= (MI_NDMA_SRC_FIX | MI_NDMA_DEST_INC | MI_NDMA_DEST_RELOAD_DISABLE);
contData |= MI_NDMA_TIMING_CARD_B;
//---- set interrupt enable
contData |= MI_NDMA_IF_ENABLE;
//---- start
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) = contData;
(void)OS_RestoreInterrupts( enabled );
}

View File

@ -1,11 +1,12 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File:
File: dsCardType1.c
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <blowfish.h>
#include <dsCardType1.h>
#include <customNDma.h>
// Function prototype -------------------------------------------------------
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
@ -33,10 +34,9 @@ static void SetMCSCR(void);
*---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType1(CardBootData *cbd)
{
#pragma unused( cbd )
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE );
u32 i = 0;
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000000;
reg_HOTSW_MCCMD1 = 0x00000000;
@ -47,12 +47,9 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*(cbd->pBootSegBuf->word + i++) = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
/*---------------------------------------------------------------------------*
@ -90,11 +87,9 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
@ -137,7 +132,7 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
break;
}
// コマンドの暗号化
// コマンドの暗号化
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
// ビッグエンディアンに直す(暗号化後)
@ -163,6 +158,9 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadIDSecure_DSType1(CardBootData *cbd)
{
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
// コマンド作成・設定
SetSecureCommand(S_RD_ID, cbd);
@ -170,12 +168,9 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
// (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_scr = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -194,6 +189,9 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
GCDCmd64 cndLE, cndBE;
for(i=0; i<4; i++){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE );
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
cndLE.dw = cbd->vbi;
@ -223,11 +221,8 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// 読み込みセグメント番号インクリメント
segNum++;
@ -251,9 +246,8 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -273,9 +267,8 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -295,9 +288,8 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -314,6 +306,9 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadIDGame_DSType1(CardBootData *cbd)
{
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x000000B8;
reg_HOTSW_MCCMD1 = 0x00000000;
@ -321,12 +316,9 @@ void ReadIDGame_DSType1(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 1));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_gam = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
/*---------------------------------------------------------------------------*
@ -348,6 +340,9 @@ void ReadPageGame_DSType1(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++){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -373,10 +368,7 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
}

View File

@ -1,11 +1,12 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File:
File: dsCardType2.c
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <blowfish.h>
#include <dsCardType2.h>
#include <customNDma.h>
// Define Data --------------------------------------------------------------
#define SECURE_SEGMENT_NUM 4
@ -14,7 +15,6 @@
#define ROM_EMULATION_START_OFS 0x160
#define ROM_EMULATION_END_OFS 0x180
// Function prototype -------------------------------------------------------
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
static void SetMCSCR(void);
@ -73,14 +73,15 @@ void ReadRomEmulationData_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType2(CardBootData *cbd)
{
#pragma unused( cbd )
u32 i = 0;
u32 *dst = cbd->pBootSegBuf->word;
u64 page = 0;
GCDCmd64 cndLE, cndBE;
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -105,13 +106,10 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*dst++ = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
page++;
}
}
@ -189,7 +187,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadIDSecure_DSType2(CardBootData *cbd)
{
OSTick start;
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
// コマンド作成・設定
SetSecureCommand(S_RD_ID, cbd);
@ -199,8 +198,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
// 25ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
@ -210,10 +208,8 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_scr = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -229,12 +225,10 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadSegSecure_DSType2(CardBootData *cbd)
{
u32 i,j;
u32 *dst = cbd->pSecureSegBuf ;
u32 i,j=0,k;
u64 segNum = 4;
u64 vae = cbd->vae;
GCDCmd64 cndLE, cndBE;
OSTick start;
for(i=0; i<SECURE_SEGMENT_NUM; i++){
// ゼロクリア
@ -270,11 +264,13 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
// 25ms待ち (latencyで設定できる以上のwaitが必要だから)
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
for(j=0; j<ONE_SEGMENT_PAGE_NUM; j++){
for(k=0; k<ONE_SEGMENT_PAGE_NUM; k++){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pSecureSegBuf + (PAGE_WORD_SIZE * j), PAGE_SIZE );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
@ -284,13 +280,13 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*dst++ = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// 転送済みページ数
j++;
}
// 読み込みセグメント番号インクリメント
segNum++;
@ -306,8 +302,6 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void SwitchONPNGSecure_DSType2(CardBootData *cbd)
{
OSTick start;
// コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd);
@ -318,10 +312,9 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
// 25ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
@ -330,7 +323,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -343,8 +337,6 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
{
OSTick start;
// コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd);
@ -355,10 +347,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
// 25ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
@ -367,7 +358,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -380,8 +372,6 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ChangeModeSecure_DSType2(CardBootData *cbd)
{
OSTick start;
// コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd);
@ -392,10 +382,9 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
// 25ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
@ -404,7 +393,8 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -429,8 +419,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
*---------------------------------------------------------------------------*/
void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size)
{
u32 loop;
u32 *b = (u32 *)buf;
u32 loop, counter=0;
u64 i, page;
GCDCmd64 cndLE, cndBE;
@ -442,6 +431,9 @@ void ReadPageGame_DSType2(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++){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
@ -463,14 +455,11 @@ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size)
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 1 に)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 1540 に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 1540));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*b++ = reg_HOTSW_MCD1;
}
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
}

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File: Card.c
File: hotsw.c
Copyright 2007 Nintendo. All rights reserved.
@ -13,22 +13,17 @@
#include <twl.h>
#include <twl/os/common/format_rom.h>
//#include <istdbglib.h>
#include <nitro/card/types.h>
#include <sysmenu.h>
#include <hotswTypes.h>
#include <blowfish.h>
#include <dsCardType1.h>
#include <dsCardType2.h>
#include <customNDma.h>
// define -------------------------------------------------------------------
#define STACK_SIZE 1024 // スタックサイズ
#define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
#define ML_THREAD_PRIO 12 // Boot Segment読み込み終わったら起動する。カードブートスレッドより優先度低。
#define DEBUG_CARD_TYPE 1 // DS Card Type1 = 0 DS Card Type2 = 1
#define UNDEF_CODE 0xe7ffdeff // 未定義コード
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
@ -44,8 +39,6 @@ static void InterruptCallbackCardDet(void);
static void InterruptCallbackCardData(void);
static void McThread(void *arg);
static void StaticModuleLoadThread(void *arg);
static void LoadStaticModule_Secure(void);
static void McPowerOn(void);
static void SetMCSCR(void);
@ -53,9 +46,6 @@ static void GenVA_VB_VD(void);
static void LoadTable(void);
static void ReadIDNormal(void);
static void DecryptObjectFile(void);
static void ReadPageNormalFromDebugger(u32 page, void* buf);
static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest);
static void ShowRegisterData(void);
static void ShowRomHeaderData(void);
@ -192,8 +182,6 @@ BOOL HOTSW_Boot(void)
// ---------------------- Normal Mode ----------------------
// カードID読み込み
ReadIDNormal();
ShowRomHeaderData();
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
if(s_cbData.id_nml & 0x80000000){
@ -267,9 +255,6 @@ BOOL HOTSW_Boot(void)
// Secure領域のSegment読み込み
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
// Arm9の常駐モジュールを指定先に転送
LoadStaticModule_Secure();
// ゲームモードに移行
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
@ -487,71 +472,26 @@ static void LoadTable(void)
*
* IDを読み込む関数
* ----------------------------------------------------------------- */
static void ReadIDNormal(void)
void ReadIDNormal(void)
{
// MCCMD レジスタ設定
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000090;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 2320));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
s_cbData.id_nml = reg_HOTSW_MCD1;
}
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 0));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
/* -----------------------------------------------------------------
* ReadPageNormalFromDebugger関数
*
* Romエミュレーション情報を読む
* ----------------------------------------------------------------- */
void ReadPageNormalFromDebugger(u32 page, void* buf)
{
GCDCmd64 le , be;
u64 page_data = page;
// u32 i=0;
// ゼロクリア
MI_CpuClear8(&le, sizeof(GCDCmd64));
// コマンド作成
le.dw = (page_data << 33);
// ビッグエンディアンに直す
be.b[7] = le.b[0];
be.b[6] = le.b[1];
be.b[5] = le.b[2];
be.b[4] = le.b[3];
be.b[3] = le.b[4];
be.b[2] = le.b[5];
be.b[1] = le.b[6];
be.b[0] = le.b[7];
// MCCMD レジスタ設定
reg_MI_MCCMD0_B = *(u32*)be.b;
reg_MI_MCCMD1_B = *(u32*)&be.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に)
reg_MI_MCCNT1_B = (u32)((reg_MI_MCCNT1_B & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 20));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_MI_MCCNT1_B & START_FLG_MASK){
while(!(reg_MI_MCCNT1_B & READY_FLG_MASK)){}
*( ((u32 *)buf)++ ) = reg_MI_MCD1_B;
}
}
/* -----------------------------------------------------------------
* DecryptObjectFile関数
*
@ -613,7 +553,8 @@ static void DecryptObjectFile(void)
}
else{
OS_PutString("▼ DecryptObjectFile : Error...\n");
// CpuClearFast32(UNDEF_CODE, pEncBuf, size); // 未定義コードでクリア
MI_NDmaFill( HOTSW_DMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア
}
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
}
@ -624,15 +565,11 @@ static void DecryptObjectFile(void)
*
*
*
* SCFG_MC1のSlot
*
* 10 ()
Slot A if((reg_MI_MC1 & 0x0c) == 0x08)
Slot B if((reg_MI_MC1 & 0xc0) == 0x80)
* SCFG_MC1のCDETフラグを見ている
* ----------------------------------------------------------------- */
static BOOL IsCardExist(void)
{
if((reg_MI_MC1 & SLOT_STATUS_MODE_SELECT_MSK) == SLOT_STATUS_MODE_10){
if(!(reg_MI_MC1 & SLOT_STATUS_CDET_MSK)){
return TRUE;
}
else{
@ -655,71 +592,36 @@ static void McThread(void *arg)
}
}
/* -----------------------------------------------------------------
* StaticModuleLoadThread
* ----------------------------------------------------------------- */
static void StaticModuleLoadThread(void *arg)
{
#pragma unused( arg )
while(1){
OS_SleepThread(NULL);
}
}
static void LoadStaticModule_Secure(void)
{
if(s_cbData.pBootSegBuf->rh.s.main_size >= SECURE_SEGMENT_SIZE){
MI_DmaCopy32(1, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_ram_address, SECURE_SEGMENT_SIZE);
}
else{
MI_DmaCopy32(1, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_ram_address, s_cbData.pBootSegBuf->rh.s.main_size);
}
}
/* -----------------------------------------------------------------
* McPowerOn関数
* ----------------------------------------------------------------- */
static void McPowerOn(void)
{
OSTick start;
// SCFG_MC1 の Slot Status の M1,M0 を 11 にする
reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | 0xc0);
// 10ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){}
OS_Sleep(10);
// SCFG_MC1 の Slot Status の M1,M0 を 00 にする
reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | 0x00);
// 10ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){}
OS_Sleep(10);
// SCFG_MC1 の Slot Status の M1,M0 を 01 にする
reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_01);
// 10ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){}
OS_Sleep(10);
// SCFG_MC1 の Slot Status の M1,M0 を 10 にする
reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_10);
// 10ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){}
OS_Sleep(10);
// リセットをhighに (RESB = 1にする)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) |
CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0));
CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0));
// 10ms待ち
start = OS_GetTick();
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){}
OS_Sleep(10);
OS_TPrintf("MC Power ON\n");
}
@ -801,8 +703,11 @@ static void InterruptCallbackCardDet(void)
// カードB データ転送終了
static void InterruptCallbackCardData(void)
{
// データ転送終了待ちまで寝ていたのを起こす
OS_WakeupThreadDirect(&s_MCThread);
#ifdef USE_SLOT_A
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA);
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA);
#else
OS_SetIrqCheckFlagEx(OS_IE_CARD_B_DATA);
#endif
@ -858,7 +763,7 @@ static void SetInterrupt(void)
*---------------------------------------------------------------------------*/
static void ShowRomHeaderData(void)
{
OS_TPrintf("Debug Data -------------------------------\n");
OS_TPrintf("\nDebug Data -------------------------------\n");
OS_TPrintf("1. Normal Mode ID : 0x%08x\n" , s_cbData.id_nml);
OS_TPrintf("2. Secure Mode ID : 0x%08x\n" , s_cbData.id_scr);
OS_TPrintf("3. Game Mode ID : 0x%08x\n" , s_cbData.id_gam);
@ -877,6 +782,7 @@ static void ShowRomHeaderData(void)
OS_TPrintf("sub entry addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_entry_address);
OS_TPrintf("sub ram addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ram_address);
OS_TPrintf("sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_size);
OS_TPrintf("------------------------------------------\n\n");
}
/*---------------------------------------------------------------------------*