mirror of
https://github.com/rvtr/ntr_bootrom.git
synced 2025-10-31 07:11:11 -04:00
425 lines
18 KiB
C
425 lines
18 KiB
C
//====================================================================
|
||
// IrisCardDefine.h
|
||
// IRIS カード定数
|
||
//
|
||
// Copyright (C) 2003,2004 NINTENDO Co.,Ltd.
|
||
//====================================================================
|
||
#ifndef _IRIS_CARD_DEFINE_H
|
||
#define _IRIS_CARD_DEFINE_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
|
||
// カードアクセス・コントロールレジスタ構造体
|
||
typedef struct {
|
||
u16 latency1:13; // レイテンシ1のサイクル数
|
||
u16 dataScramble_on:1; // データスクランブル ON
|
||
u16 scrambleUnit_on:1; // スクランブル回路 ON
|
||
u16 initScramblePN:1; // スクランブルPNデータ初期化
|
||
|
||
u16 latency2:6; // レイテンシ2のサイクル数
|
||
u16 cmdScramble_on:1; // コマンドスクランブル ON
|
||
u16 dataReady:1; // データ レディ
|
||
|
||
u16 pages:3; // ページ数
|
||
u16 clockType:1; // クロックタイプ(150ns/240ns)
|
||
u16 clockInLatency:1; // レイテンシ期間にクロック供給
|
||
u16 reset:1; // リセット信号
|
||
u16 accessMode:1; // アクセスモード
|
||
u16 start:1; // スタート
|
||
} CardCnt;
|
||
|
||
|
||
// カードコントロール・パラメータ構造体
|
||
typedef struct {
|
||
u32 dmaNo; // DMA番号
|
||
u32 cardCnt; // カードコントロール
|
||
u32 op[2]; // コマンド
|
||
} CardCtrlParam;
|
||
|
||
|
||
// カード非同期読み込み関数型宣言
|
||
typedef void (* ReadCardAsyncFuncp)(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
|
||
|
||
// カード割り込み関数型宣言
|
||
typedef void (* CardIntrFuncp)(void);
|
||
|
||
// カード割り込みワーク構造体
|
||
typedef struct {
|
||
u8 *romp; // ROMアドレス
|
||
u8 *ramp; // RAMアドレス
|
||
s32 restSize; // 残りサイズ
|
||
s32 blockSize; // ブロックサイズ
|
||
CardCtrlParam param; // カードアクセス・パラメータ構造体
|
||
ReadCardAsyncFuncp AsyncFuncp; // カード読み込み関数
|
||
// u32 pad; // 予約
|
||
} CardIntrWork;
|
||
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードDMA
|
||
//----------------------------------------------------------------------
|
||
|
||
#define DmaReadCard(dmaNo, destp) \
|
||
\
|
||
DmaSet(dmaNo, REG_CARD_DATA, destp, ( \
|
||
DMA_ENABLE | DMA_TIMMING_CARD | \
|
||
DMA_SRC_FIX | DMA_DEST_INC | \
|
||
DMA_CONTINUOUS_ON | \
|
||
DMA_32BIT_BUS | (1)))
|
||
|
||
#define DmaWriteCard(dmaNo, srcp) \
|
||
\
|
||
DmaSet(dmaNo, srcp, REG_CARD_DATA, ( \
|
||
DMA_ENABLE | DMA_TIMMING_CARD | \
|
||
DMA_SRC_INC | DMA_DEST_FIX | \
|
||
DMA_CONTINUOUS_ON | \
|
||
DMA_32BIT_BUS | (1)))
|
||
|
||
//・カード-メモリ間のDMA転送を行います。
|
||
//
|
||
//・引数:
|
||
// dmaNo DMA番号
|
||
// srcp ソースアドレス
|
||
// destp デスティネーションアドレス
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードのデータ転送はレディか?
|
||
//----------------------------------------------------------------------
|
||
|
||
#define IsCardDataReady() \
|
||
\
|
||
(*(vu32 *)REG_CARDCNT & CARD_DATA_READY)
|
||
|
||
//・カードのデータ転送はレディかどうかを返します。
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードデータ待ち
|
||
//----------------------------------------------------------------------
|
||
|
||
#define WaitCardData() \
|
||
{ \
|
||
while (!IsCardDataReady()) ; \
|
||
}
|
||
|
||
//・カードデータ転送の終了を待ちます。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードはビジーか?
|
||
//----------------------------------------------------------------------
|
||
|
||
#define IsCardBusy() \
|
||
\
|
||
(*(vu32 *)REG_CARDCNT & CARD_START)
|
||
|
||
//・カードがビジーかどうかを返します。
|
||
|
||
//----------------------------------------------------------------------
|
||
// カード待ち
|
||
//----------------------------------------------------------------------
|
||
|
||
#define WaitCard() \
|
||
{ \
|
||
while (IsCardBusy()) ; \
|
||
}
|
||
|
||
//・カードの終了を待ちます。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ獲得(NORMALモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define GetCardCnt4Normal() \
|
||
\
|
||
(GetCardCnt4Game() & CARD_SCRAMBLE_CLEAR_MASK)
|
||
|
||
//・NORMALモードのコントロールパラメータを獲得します。
|
||
//・スクランブルの設定はクリアします。
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ獲得(SECUREモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define GetCardCnt4Secure() \
|
||
\
|
||
(*(vu32 *)MROMCNT_SECURE_BUF & (CARD_CLOCK_TYPE | CARD_LATENCY_MASK))
|
||
|
||
//・SECUREモードのコントロールパラメータを獲得します。
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ獲得(GAMEモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define GetCardCnt4Game() \
|
||
\
|
||
(*(vu32 *)MROMCNT_GAME_BUF)
|
||
|
||
//・GAMEモードのコントロールパラメータを獲得します。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ セット(NORMALモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define SetCardCnt4Normal(param) \
|
||
\
|
||
(*(vu32 *)MROMCNT_GAME_BUF = param)
|
||
|
||
//・GAMEモードのコントロールパラメータをセットします。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ セット(SECUREモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define SetCardCnt4Secure(param) \
|
||
\
|
||
(*(vu32 *)MROMCNT_SECURE_BUF = param)
|
||
|
||
//・SECUREモードのコントロールパラメータをセットします。
|
||
|
||
//----------------------------------------------------------------------
|
||
// コントロールパラメータ セット(GAMEモード)
|
||
//----------------------------------------------------------------------
|
||
|
||
#define SetCardCnt4Game(param) \
|
||
\
|
||
(*(vu32 *)MROMCNT_GAME_BUF = param)
|
||
|
||
//・GAMEモードのコントロールパラメータをセットします。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// レイテンシ2をレイテンシ1へ加算
|
||
//----------------------------------------------------------------------
|
||
|
||
#define AddLatency2ToLatency1(param) \
|
||
\
|
||
( (((param) & CARD_LATENCY2_CYCLES_MASK) \
|
||
>> CARD_LATENCY2_CYCLES_SHIFT) \
|
||
+ ((param) & ~CARD_LATENCY2_CYCLES_MASK) \
|
||
)
|
||
|
||
//・カードの終了を待ちます。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// ROMエリア・マップ
|
||
//----------------------------------------------------------------------
|
||
|
||
#define MROM_SECURE_AREA 0x4000 // SECUREエリア
|
||
#define MROM_GAME_AREA 0x8000 // GAMEエリア
|
||
|
||
//----------------------------------------------------------------------
|
||
// ROMエリア・サイズ
|
||
//----------------------------------------------------------------------
|
||
|
||
#define MROM_SEGMENT_SIZE 0x1000 // セグメントサイズ
|
||
#define MROM_SECURE_SIZE 0x4000 // SECUREエリアサイズ
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// メモリ・マップ
|
||
//----------------------------------------------------------------------
|
||
|
||
#define MROMCNT_GAME_BUF (ROM_HEADER_BUF + 0x60) // GAMEモード・コントロールデータ
|
||
#define MROMCNT_SECURE_BUF (ROM_HEADER_BUF + 0x64) // SECUREモード・コントロールデータ
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// レジスタ・アドレス
|
||
//----------------------------------------------------------------------
|
||
|
||
#define REG_CARDMST_SPI_CNT (REG_BASE + 0x1a0) // カードマスター&SPIコントロール
|
||
|
||
#define REG_CARD_MASTER_CNT (REG_BASE + 0x1a1) // カードマスターコントロール
|
||
|
||
#define REG_CARD_SPI_CNT (REG_BASE + 0x1a0) // カードSPIコントロール
|
||
#define REG_CARD_SPI_DATA (REG_BASE + 0x1a2) // データ
|
||
|
||
#define REG_CARDCNT (REG_BASE + 0x1a4) // カードコントロール
|
||
#define REG_CARD_CMD (REG_BASE + 0x1a8) // コマンド設定
|
||
#define REG_CARD_DATA (REG_BASE + 0x100010) // データ
|
||
|
||
#define REG_CARD_PN_INIT (REG_BASE + 0x1b0) // カードPNデータ初期値
|
||
#define REG_CARD_PNA_INIT_L (REG_BASE + 0x1b0)
|
||
#define REG_CARD_PNB_INIT_L (REG_BASE + 0x1b4)
|
||
#define REG_CARD_PNA_INIT_H (REG_BASE + 0x1b8)
|
||
#define REG_CARD_PNB_INIT_H (REG_BASE + 0x1ba)
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カード マスターコントロール
|
||
//----------------------------------------------------------------------
|
||
|
||
#define CARDMST_SEL_DEVICE 0x20 // デバイス選択
|
||
#define CARDMST_SEL_ROM 0x00 // マスクROM/3Dメモリ選択
|
||
#define CARDMST_SEL_SPI 0x20 // SPI選択
|
||
|
||
#define CARDMST_IF_ENABLE 0x40 // 割り込み要求 許可
|
||
#define CARDMST_ENABLE 0x80 // カードイネーブル
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードSPI コントロール
|
||
//----------------------------------------------------------------------
|
||
|
||
#define CARDSPI_SCK_MASK 0x03 // シフトクロック数
|
||
|
||
#define CARDSPI_SCK_SHIFT 0
|
||
|
||
#define CARDSPI_SCK_4M 0x00 // シフトクロック 4MHz選択
|
||
#define CARDSPI_SCK_2M 0x01 // 2MHz選択
|
||
#define CARDSPI_SCK_1M 0x02 // 1MHz選択
|
||
#define CARDSPI_SCK_524K 0x03 // 524KHz選択
|
||
|
||
#define CARDSPI_INV_CS 0x40 // 通信終了時に/CSダウン維持
|
||
#define CARDSPI_BUSY 0x80 // ビジー
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// カードアクセス コントロール
|
||
//----------------------------------------------------------------------
|
||
|
||
#define CARD_LATENCY1_CYCLES_MASK 0x00001fff // レイテンシ1のサイクル数
|
||
#define CARD_LATENCY2_CYCLES_MASK 0x003f0000 // レイテンシ2のサイクル数
|
||
#define CARD_LATENCY_MASK 0x003f1fff // 上記を合わせたマスク
|
||
#define CARD_PAGE_COUNT_MASK 0x07000000 // ページ数
|
||
|
||
#define CARD_LATENCY1_CYCLES_SHIFT 0
|
||
#define CARD_LATENCY2_CYCLES_SHIFT 16
|
||
#define CARD_PAGE_COUNT_SHIFT 24
|
||
|
||
// スクランブルフラグ群のセット
|
||
#define CARD_SCRAMBLE_SET_MASK ( CARD_SCRAMBLE_UNIT_ON | CARD_DATA_SCRAMBLE_ON \
|
||
| CARD_CMD_SCRAMBLE_ON)
|
||
// スクランブルフラグ群のクリア
|
||
#define CARD_SCRAMBLE_CLEAR_MASK ( ~(CARD_INIT_SCRAMBLE_PN \
|
||
| CARD_SCRAMBLE_SET_MASK \
|
||
| CARD_CLOCK_IN_LATENCY \
|
||
| CARD_WRITE_MODE))
|
||
|
||
#define CARD_DATA_SCRAMBLE_ON 0x00002000 // データスクランブル ON
|
||
#define CARD_SCRAMBLE_UNIT_ON 0x00004000 // スクランブル回路 ON
|
||
#define CARD_INIT_SCRAMBLE_PN 0x00008000 // スクランブルPNデータ初期化
|
||
#define CARD_CMD_SCRAMBLE_ON 0x00400000 // コマンドスクランブル ON
|
||
|
||
#define CARD_DATA_READY 0x00800000 // データ レディ
|
||
|
||
#define CARD_0_PAGE 0x00000000 // 0ページ
|
||
#define CARD_1_PAGE 0x01000000 // 1ページ
|
||
#define CARD_2_PAGES 0x02000000 // 2ページ
|
||
#define CARD_4_PAGES 0x03000000 // 4ページ
|
||
#define CARD_8_PAGES 0x04000000 // 8ページ
|
||
#define CARD_16_PAGES 0x05000000 // 16ページ
|
||
#define CARD_32_PAGES 0x06000000 // 32ページ
|
||
#define CARD_STATUS 0x07000000 // ステータスリード
|
||
|
||
#define CARD_CLOCK_TYPE 0x08000000 // クロック タイプ
|
||
#define CARD_CLOCK_150NS 0x00000000 // クロックサイクル 150ns
|
||
#define CARD_CLOCK_240NS 0x08000000 // 240ns
|
||
#define CARD_CLOCK_IN_LATENCY 0x10000000 // レイテンシ期間にクロック供給
|
||
#define CARD_RESET_LO 0x00000000 // リセット信号レベル Lo
|
||
#define CARD_RESET_HI 0x20000000 // Hi
|
||
#define CARD_ACCESS_MODE 0x40000000 // アクセス モード
|
||
#define CARD_READ_MODE 0x00000000 // リードモード
|
||
#define CARD_WRITE_MODE 0x40000000 // ライトモード
|
||
#define CARD_START 0x80000000 // スタート
|
||
|
||
// 構造体メンバ用定数
|
||
|
||
#define ST_CARD_0_PAGE 0 // 0ページ
|
||
#define ST_CARD_1_PAGE 1 // 1ページ
|
||
#define ST_CARD_2_PAGES 2 // 2ページ
|
||
#define ST_CARD_4_PAGES 3 // 4ページ
|
||
#define ST_CARD_8_PAGES 4 // 8ページ
|
||
#define ST_CARD_16_PAGES 5 // 16ページ
|
||
#define ST_CARD_32_PAGES 6 // 32ページ
|
||
#define ST_CARD_STATUS 7 // ステータスリード
|
||
|
||
#define ST_CARD_CLOCK_150NS 0 // クロックサイクル 150ns
|
||
#define ST_CARD_CLOCK_240NS 1 // 240ns
|
||
|
||
#define ST_CARD_READ_MODE 0 // リードモード
|
||
#define ST_CARD_WRITE_MODE 1 // ライトモード
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// マスクROMコマンド
|
||
//----------------------------------------------------------------------
|
||
|
||
// NORMALモード
|
||
|
||
#define MROMOP_N_OP_MASK 0xff000000 // コマンドマスク
|
||
|
||
#define MROMOP_N_READ_ID 0x90000000 // ID読み込み
|
||
#define MROMOP_N_READ_PAGES 0x00000000 // ページ群読み込み
|
||
#define MROMOP_N_LOAD_TABLE 0x9f000000 // フラッシュメモリ・テーブル設定
|
||
#define MROMOP_N_CHANGE_MODE 0x3c000000 // SECUREモードへ遷移
|
||
|
||
#define MROMOP_N_READ_ID_PAD_L 0xffffffff
|
||
#define MROMOP_N_READ_ID_PAD_H 0x00ffffff
|
||
#define MROMOP_N_READ_PAGES_PAD_L 0xffffffff
|
||
#define MROMOP_N_READ_PAGES_PAD_H 0x00ffffff
|
||
#define MROMOP_N_READ_PAGES_ADDR_MASK 0x000ffffe
|
||
#define MROMOP_N_CHANGE_SECURE_PAD_L 0xf00000ff
|
||
#define MROMOP_N_CHANGE_SECURE_PAD_H 0x00000000
|
||
|
||
#define MROMOP_N_VAE_MASK_H 0x00ffffff
|
||
|
||
#define MROMOP_N_VBI_SHIFT_L 8
|
||
|
||
// SECUREモード
|
||
|
||
#define MROM_S_LATENCY1_CYCLES_MIN 0x00008f8 // レイテンシ1の最少サイクル数
|
||
#define MROM_S_LATENCY2_CYCLES_MIN 0x0000018 // レイテンシ2の最少サイクル数
|
||
|
||
#define MROMOP_S_OP_MASK 0xf0000000 // コマンドマスク
|
||
|
||
#define MROMOP_S_READ_ID 0x10000000 // ID読み込み
|
||
#define MROMOP_S_READ_SEGMENT 0x20000000 // 暗号セグメント読み込み
|
||
#define MROMOP_S_PNG_ON 0x40000000 // PNジェネレータ ON
|
||
#define MROMOP_S_PNG_OFF 0x60000000 // PNジェネレータ OFF
|
||
#define MROMOP_S_CHANGE_MODE 0xa0000000 // GAMEモードへ遷移
|
||
|
||
#define MROMOP_S_VA_MASK_L 0xfff00000
|
||
#define MROMOP_S_VA_MASK_H 0x00000fff
|
||
#define MROMOP_S_VB_MASK_L 0x000fffff
|
||
#define MROMOP_S_VC_MASK_H 0x0ffff000
|
||
#define MROMOP_S_VD_MASK_L 0xfff00000
|
||
#define MROMOP_S_VD_MASK_H 0x00000fff
|
||
|
||
#define MROMOP_S_VA_SHIFT_L 20
|
||
#define MROMOP_S_VA_SHIFT_H 12
|
||
#define MROMOP_S_VC_SHIFT_H 12
|
||
#define MROMOP_S_VD_SHIFT_L 20
|
||
#define MROMOP_S_VD_SHIFT_H 12
|
||
|
||
// GAMEモード
|
||
|
||
#define MROMOP_G_OP_MASK 0xff000000 // コマンドマスク
|
||
|
||
#define MROMOP_G_READ_ID 0xb8000000 // ID読み込み
|
||
#define MROMOP_G_READ_PAGE 0xb7000000 // ページ読み込み
|
||
|
||
#define MROMOP_G_READ_PAGE_PAD_L 0x00ffffff
|
||
#define MROMOP_G_READ_PAGE_PAD_H 0x00f00000
|
||
#define MROMOP_G_READ_PAGE_MASK_L 0x00ffffff
|
||
#define MROMOP_G_READ_PAGE_MASK_H 0xfffffffe
|
||
#define MROMOP_G_READ_PAGE_ADDR_MASK 0x000ffffe
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
} // extern "C"
|
||
#endif
|
||
|
||
#endif // _IRIS_CARD_DEFINE_H
|