//==================================================================== // 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