ntr_bootrom/trunk/IrisMainp/include/private/IrisCardDefine.h

425 lines
18 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//====================================================================
// 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; // データスクランブル
u16 scrambleUnit_on:1; // スクランブル回路
u16 initScramblePN:1; // スクランブルPNデータ初期化
u16 latency2:6; // レイテンシ2のサイクル数
u16 cmdScramble_on:1; // コマンドスクランブル
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 // データスクランブル
#define CARD_SCRAMBLE_UNIT_ON 0x00004000 // スクランブル回路
#define CARD_INIT_SCRAMBLE_PN 0x00008000 // スクランブルPNデータ初期化
#define CARD_CMD_SCRAMBLE_ON 0x00400000 // コマンドスクランブル
#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 // クロックサイクル
#define CARD_CLOCK_240NS 0x08000000 //
#define CARD_CLOCK_IN_LATENCY 0x10000000 // レイテンシ期間にクロック供給
#define CARD_RESET_LO 0x00000000 // リセット信号レベル
#define CARD_RESET_HI 0x20000000 //
#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 // クロックサイクル
#define ST_CARD_CLOCK_240NS 1 //
#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ジェネレータ
#define MROMOP_S_PNG_OFF 0x60000000 // PNジェネレータ
#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