twl_wrapsdk/build/libraries/devices/sdmc/ARM7/sdif_ip.h
Shirait 4fe5688d29 add SD driver and FATFS library (tentative)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@96 4ee2a332-4b2b-5046-8439-1ba90f034370
2007-05-30 10:22:28 +00:00

350 lines
20 KiB
C
Raw 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.

/*
** Copyright (c) 2000-2001 Matsushita Electric Industrial Co., Ltd.
** All Rights Reserved.
*/
/*
** $Module SDカードアクセスモジュール・インクルード
** $Filename SD_CARD_IP.H
** $Version 1.0 版
** $Date 01/02/16
** $Log 01/02/16 rev1.0作成
** 松下電器産業(株)半導体開発本部
*/
#ifndef __SD_CARD_IP_H__
#define __SD_CARD_IP_H__
//#define IO3 0 /* Insert Remove SW = FALSE IO3 = TRUE */
//#define MAX_SD_CLOCK_4M 0 /* MAX SD Clock 4.608MHz */
//#define MAX_SD_CLOCK_9M 1 /* MAX SD Clock 9.216MHz */
/*---------------------------------------------
ラッパーレジスタのビット制御(フラグ定義)
---------------------------------------------*/
/* SD_CNTレジスタ */
#define SDIF_CNT_USEDTC (0x0001) /* DTC使用フラグ (R/W) */
#define SDIF_CNT_USEFIFO (0x0002) /* FIFO使用フラグ (R/W) */
#define SDIF_CNT_FULL (0x0100) /* FIFO FULLフラグ (RO) */
#define SDIF_CNT_NEMP (0x0200) /* FIFO NOT EMPTYフラグ (RO) */
#define SDIF_CNT_FCLR (0x0400) /* FIFO クリアフラグ (WO) */
#define SDIF_CNT_FFIE (0x0800) /* FIFO FULLで割り込み (R/W) */
#define SDIF_CNT_FEIE (0x1000) /* FIFO EMPTYで割り込み (R/W) */
#define SDCARD_UseFifoFlag ((*SDIF_CNT) & SDIF_CNT_USEFIFO)
/*-------------------------------------
レジスタのビット制御(フラグ定義)
-------------------------------------*/
/* SD_CMDレジスタ*/
#define SD_CMD_CMD 0x0000 /* SDカードへの通常アクセス(CMD) */
#define SD_CMD_ACMD 0x0040 /* SDカードへのセキュリティアクセス(ACMD) */
/* SD_STOPレジスタ */
#define SD_STOP_STP 0x0001 /* データ転送終了を知らせる */
#define SD_STOP_SEC_ENABLE 0x0100 /* SD_SECCNTレジスタ有効セクタカウントレジスタ */
/* SD_SECCNTレジスタ */
#define SD_SECCNT_END 0x0000 /* SD_SECCNTレジスタ カウントチェック */
/* SD_SIZEレジスタ */
#define SD_SIZE_DATA_LENGTH_1B 0x0001 /* SDカード転送データサイズ 1Bytes */
#define SD_SIZE_DATA_LENGTH_2B 0x0002 /* SDカード転送データサイズ 2Bytes */
#define SD_SIZE_DATA_LENGTH_4B 0x0004 /* SDカード転送データサイズ 4Bytes */
#define SD_SIZE_DATA_LENGTH_8B 0x0008 /* SDカード転送データサイズ 8Bytes (SCR) */
#define SD_SIZE_DATA_LENGTH_16B 0x0010 /* SDカード転送データサイズ 16Bytes */
#define SD_SIZE_DATA_LENGTH_32B 0x0020 /* SDカード転送データサイズ 32Bytes */
#define SD_SIZE_DATA_LENGTH_64B 0x0040 /* SDカード転送データサイズ 64Bytes (SD_Status) */
#define SD_SIZE_DATA_LENGTH_128B 0x0080 /* SDカード転送データサイズ 128Bytes */
#define SD_SIZE_DATA_LENGTH_256B 0x0100 /* SDカード転送データサイズ 256Bytes */
#define SD_SIZE_DATA_LENGTH_512B 0x0200 /* SDカード転送データサイズ 512Bytes (データ) */
/* SD_OPTIONレジスタ */
#define SD_OPTION_WIDTH_1BIT 0x8000 /* ビット幅の選択 1bit幅 */
#define SD_OPTION_MSEL_C2NOUSE 0x4000 /* C2モジュール未使用 */
#define SD_CD_DETECT_TIME 0xFFF0 /* CD 検出タイムだけをクリアするためのマスク */
/* SD_INFO2レジスタ */
#define SD_INFO2_ERR_ILA 0x8000 /* イリーガルアクセスエラー */
#define SD_INFO2_BWE 0x0200 /* SDカードから512byteのデータ書込み要求 */
#define SD_INFO2_BRE 0x0100 /* SDカードから512byteのデータ読込み要求 */
#define SD_INFO2_ERR_ALLCLR 0x807F /* SD Card エラーレジスタクリア */
#define SD_INFO2_ERR_SDDAT0 0x0080 /* SD Card Busy bit */
#define SD_INFO2_ERR_RESTIMEOUT 0x0040 /* レスポンスタイムアウトエラー */
#define SD_INFO2_ERR_UNDERFLOW 0x0020 /* FIFO アンダーフローエラー */
#define SD_INFO2_ERR_OVERFLOW 0x0010 /* FIFO オーバーフローエラー */
#define SD_INFO2_ERR_TIMEOUT 0x0008 /* レスポンス以外のタイムアウトエラー */
#define SD_INFO2_ERR_END 0x0004 /* フレーム終了認識できないときのENDエラー */
#define SD_INFO2_ERR_CRC 0x0002 /* CRC エラー */
#define SD_INFO2_ERR_CMD 0x0001 /* CMDエラー */
#define SD_INFO2_RW_SET 0x0300 /* SDカード Read/Write 要求割込み要因チェック */
#define SD_INFO2_ERROR_SET 0x807F /* SDカード エラー割込み要因チェック */
/* SD_INFO2_MASKレジスタ */
#define SD_INFO2_MASK_ILA 0x8000 /* イリーガルアクセスエラー割込みマスク */
#define SD_INFO2_MASK_BWE 0x0200 /* SDカードからのデータ書込み要求割込み禁止 */
#define SD_INFO2_MASK_BRE 0x0100 /* SDカードからのデータ読込み要求割込み禁止 */
#define SD_INFO2_MASK_ALLERRMASK 0x807F /* 全エラー割り込み禁止 */
#define SD_INFO2_MASK_EXCEPT_OVERFLOW 0x802F /* 全エラー割り込み禁止 FIFO Overflow Errorを除く */
#define SD_INFO2_MASK_RESTIMEOUT 0x0040 /* Time out 割込みEnable */
#define SD_INFO2_MASK_UNDERFLOW 0x0020 /* FIFO アンダーフロー 割込みEnable */
#define SD_INFO2_MASK_OVERFLOW 0x0010 /* FIFO オーバーフロー 割込みEnable */
#define SD_INFO2_MASK_TIMEOUT 0x0008 /* Time out 割込みEnable */
#define SD_INFO2_MASK_END 0x0004 /* END エラー 割込みEnable */
#define SD_INFO2_MASK_CRC 0x0002 /* CRC エラー 割込みEnable */
#define SD_INFO2_MASK_CMD 0x0001 /* CMD エラー 割込みEnable */
#define SD_INFO2_MASK_ERRSET 0x807F /* SDカード エラー割込み要因チェック */
/* SD_INFO1レジスタ */
#define SD_INFO1_DAT3DETECT 0x0400 /* (IO3検出) card detect(検出=1) : CTRでは使用できない*/
#define SD_INFO1_DAT3INSERT 0x0200 /* (IO3検出) card inserted(挿入=1) : CTRでは使用できない */
#define SD_INFO1_DAT3REMOVE 0x0100 /* (IO3検出) card removed(抜け=1) : CTRでは使用できない */
#define SD_INFO1_DAT3INIT 0x0300 /* (IO3検出) の初期化 */
#define SD_INFO1_WRITEPROTECT 0x0080 /* write protect(書き込み禁止=1) */
#define SD_INFO1_DETECT 0x0020 /* card detect(検出=1) */
#define SD_INFO1_INSERT 0x0010 /* card inserted(挿入=1) */
#define SD_INFO1_REMOVE 0x0008 /* card removed(抜け=1) */
#define SD_INFO1_ALL_END 0x0004 /* R/W access all end */
#define SD_INFO1_RES_END 0x0001 /* Response end */
#define SD_INFO1_INIT 0x0005 /* SD Cardの状態を初期化 */
#define SD_INFO1_SET 0x031D /* SDカード 挿抜 and RWアクセス終了 and レスポンス終了 要求割込み要因チェック */
/* SD_INFO1_MASKレジスタ (0:割り込み許可、1:割り込み禁止)*/
#define SD_INFO1_MASK_DAT3INSERT 0x0200 /* (IO3検出) card inserted(挿入) 割込み禁止 */
#define SD_INFO1_MASK_DAT3REMOVE 0x0100 /* (IO3検出) card removed(抜け) 割込み禁止 */
#define SD_INFO1_MASK_INSERT 0x0010 /* card inserted(挿入) 割込み禁止 */
#define SD_INFO1_MASK_REMOVE 0x0008 /* card removed(抜け) 割込み禁止 */
#define SD_INFO1_MASK_ALL_END 0x0004 /* R/W access all end 割込み禁止 */
#define SD_INFO1_MASK_RES_END 0x0001 /* Response end 割込み禁止 */
/* CC_EXT_MODEレジスタ */
#define CC_EXT_MODE_PIO 0x0000 /* PIOモード */
#define CC_EXT_MODE_DMA 0x0002 /* DMAモード */
/* SOFT_RSTレジスタ */
#define SOFT_RST_SDIF_RST 0x0001 /* SD I/Fモジュールをリセット */
/* SD_CLK_CTRLレジスタ */
#define SD_CLK_CTRL_SDCLKEN 0x0100 /* SDカードクロック出力イネーブル */
#define SD_CLK_CTRL_512 0x0180 /* SDクロックの周波数分周比512*/
#define SD_CLK_CTRL_256 0x0140 /* SDクロックの周波数分周比256*/
#define SD_CLK_CTRL_128 0x0120 /* SDクロックの周波数分周比128*/
#define SD_CLK_CTRL_64 0x0110 /* SDクロックの周波数分周比 64*/
#define SD_CLK_CTRL_32 0x0108 /* SDクロックの周波数分周比 32*/
#define SD_CLK_CTRL_16 0x0104 /* SDクロックの周波数分周比 16*/
#define SD_CLK_CTRL_8 0x0102 /* SDクロックの周波数分周比 8*/
#define SD_CLK_CTRL_4 0x0101 /* SDクロックの周波数分周比 4*/
#define SD_CLK_CTRL_2 0x0100 /* SDクロックの周波数分周比 2*/
/*-------------------------------------
マルチポート対応ビット制御(フラグ定義)
-------------------------------------*/
#define SDCARD_PORT_NO 0x0300 /* カードポート選択数 */
#define SDCARD_PORT_NO_MAX 0x04//0x02 /* カードポート最大選択数 */
#define SDCARD_PORT_NO_MIN 0x01 /* カードポート最小選択数 */
#define SDCARD_PORT_SELECT_NO 0x0001 /* カードポート番号ビット */
#define SDCARD_PORT0 0x0000 /* カードポート番号ビット */
#define SDCARD_PORT1 0x0001 /* カードポート番号ビット */
/* EXT_WPレジスタポート1以降のライトプロテクト */
#define EXT_WP_PORT1 0x0001 /* ポート1write protect(書き込み禁止=1)*/
/* EXT_CDレジスタ */
#define EXT_CD_PORT1_REMOVE 0x0001 /* ポート1 card detect検出=1 */
#define EXT_CD_PORT1_INSERT 0x0002 /* ポート1 card inserted挿入=1 */
#define EXT_CD_PORT1_DETECT 0x0004 /* ポート1 card removed抜け=1 */
/* EXT_CD_DAT3レジスタ */
//#define EXT_CD_PORT1_DAT3INIT 0x0003 /* ポート1 card の状態 (IO3検出) の初期化 */
#define EXT_CD_PORT1_DAT3REMOVE 0x0001 /* ポート1 dat3 card detect検出=1 */
#define EXT_CD_PORT1_DAT3INSERT 0x0002 /* ポート1 dat3 card inserted挿入=1 */
#define EXT_CD_PORT1_DAT3DETECT 0x0004 /* ポート1 dat3 card removed抜け=1) */
/* EXT_CD_DAT3_MASKレジスタ */
#define EXT_CD_MASK_PORT1INSERT 0x0002 /* port1 card inserted(挿入) 割込み禁止 */
#define EXT_CD_MASK_PORT1REMOVE 0x0001 /* port1 card removed(抜け) 割込み禁止 */
#define EXT_CD_MASK_PORT1DAT3INSERT 0x0002 /* port1 (IO3検出) card inserted(挿入) 割込み禁止 */
#define EXT_CD_MASK_PORT1DAT3REMOVE 0x0001 /* port1 (IO3検出) card removed(抜け) 割込み禁止 */
/*-------------------------------------
カードの選択
--------------------------------------*/
#define SDCARD_DETECT_VISUAL_BIT 0x0400 /*** upper layer card detected visual bit ***/
/*-------------------------------------
ライトプロテクト
-------------------------------------*/
#define SDCARD_WP_PERMANENT_BIT 0x0020 /*** permanent write protection ***/
#define SDCARD_WP_TEMPORARY_BIT 0x0010 /*** temporary write protection ***/
/*-------------------------------------
SD or MMCカードコマンド
-------------------------------------*/
#define GO_IDLE_STATE (0) /* resets all cards to idle state */
#define SEND_OP_COND (1) /* Asks all cards in idle state to send their operation conditions */
#define ALL_SEND_CID (2) /* send CID numbers */
#define SEND_RELATIVE_ADDR (3) /* ask the card to publish a new relative address(RCA) */
#define SET_BUS_WIDTH (6) /* ビット幅の選択 */
#define SELECT_CARD (7) /* Command toggles acard between thr Stand-by and Transfer states */
#define SEND_CSD (9) /* addressed card sends its card-specific data(CSD) */
#define STOP_TRANSMISSION (12) /* forces the card to stop transmission */
#define SD_SEND_STATUS (13) /* addressed card sends its status register */
#define SET_BLOCKLEN (16) /* sets the block length */
#define READ_MULTIPLE_BLOCK (18) /* マルチブロックリード */
#define WRITE_MULTIPLE_BLOCK (25) /* マルチブロックライト */
#define APP_CMD (55) /* CMD55 */
#define SD_STATUS (13) /* ACMD13 Send the SD_CARD status */
#define SEND_NUM_WR_SECTORS (22) /* ACMD22 書きこみ完了セクタ数取得 */
#define SD_APP_OP_COND (41) /* ACMD41 */
#define SEND_SCR (51) /* SD configuration register (SCR) */
/* MMCplus, eMMCの定義 */
#define EXT_CSD_ACCESS (6)
/* Extended Commandの定義 */
#define EXT_NORMAL (0)
#define EXT_SDIO (0x4000)
#define EXT_COM_R3 (0x0700)
#define EXT_CMD (0x00C0)
#define SEND_IF_COND (8) /* Physical Layer 2.0 で追加されたコマンド */
#define SEND_IF_COND_EXT (EXT_SDIO | EXT_COM_R3 | EXT_CMD | SEND_IF_COND)
/*-------------------------------------
IP レジスタアクセス マクロ関数
-------------------------------------*/
#define SD_OrFPGA(reg,value) ((reg) |= (value));
#define SD_AndFPGA(reg,value) ((reg) &= (value));
#define SD_SetFPGA(reg,value) ((reg) = (value));
#define SD_GetFPGA(dest,reg) ((dest) = (reg));
/***********************************************************************
構造体定数
***********************************************************************/
typedef union{
u32 dat;
struct {
u16 low;
u16 high;
} dt2word;
} LELONG;
/*-------------------------------------
その他(ビット制御)
-------------------------------------*/
#define RSP_R3_OCR31 0x8000 /* Use OCR Busy bit Check */
#define RSP_R3_OCR_VDD 0x0030 /* Use OCR VDD bit Check (3.2-3.3v,3.3-3.4v is OK)*/
/*--- SCR[0]に対する4bitバス幅対応フラグのマスク ---*/
//SCRのbit50に相当するが、SCRとSD_STATUSはMSBから送られてくることを考慮してある
#define SCR_DAT_BUS_WIDTH_4BIT 0x0400 /* SCR DAT Bus width supported 4bit */
/*--- 127bitCSD (CSD[0]CSD[7])関連 ---*/
#define CSD_VDD_R_CURR_MIN 0x0038 /* "VDD_R_CURR_MIN" (for CSD[3]) */
#define CSD_VDD_R_CURR_MAX 0x0007 /* "VDD_R_CURR_MAX" (for CSD[3]) */
#define CSD_VDD_W_CURR_MIN 0xE000 /* "VDD_W_CURR_MIN" (for CSD[2]) */
#define CSD_VDD_W_CURR_MAX 0x1C00 /* "VDD_W_CURR_MAX" (for CSD[2]) */
#define CSD_READ_BL_LEN 0x0F00 /* "READ_BL_LEN" (for CSD[4])*/
#define CSD_WRITE_BL_LEN_BIT_25_24 0x0003 /* "WRITE_BL_LEN" (for CSD[1])*/
#define CSD_WRITE_BL_LEN_BIT_23_22 0xC000 /* "WRITE_BL_LEN" (for CSD[0]*/
#define CSD_READ_BL_PARTIAL 0x0080 /* "READ_BL_PARTIAL" (for CSD[4]) */
#define CSD_TRANSFER_RATE 0x0700 /* "Transfer rate unit" of "TRAN_SPEED" (for CSD[5]) */
#define CSD_TRAN_SPEED_100K 0x0000 /* 100Kbit/s (for CSD Transfer rate) */
#define CSD_TRAN_SPEED_1M 0x0001 /* 1Mbit/s (for CSD Transfer rate) */
#define CSD_TRAN_SPEED_10M 0x0002 /* 10Mbit/s (for CSD Transfer rate) */
#define CSD_TRAN_SPEED_100M 0x0003 /* 100Mbit/s (for CSD Transfer rate) */
#define CSD_TRAN_SPEED_OTHER 0x0004 /* Reserve (for CSD Transfer rate) */
#define CSD_C_SIZE_MULT 0x0380 /* RSP2 の bit[49:47] */
#define CSD_C_SIZE_BIT_73_72 0x0003 /* RSP3 の bit[73:72](C_SIZE) */
#define CSD_C_SIZE_BIT_71_62 0xFFC0 /* RSP3 の bit[71:62](C_SIZE) */
//SDHC(CSD format version2)の場合
#define CSD_C_SIZE_BIT_69_56 0x3FFF /* SD_CSD[3] */
#define CSD_C_SIZE_BIT_55_48 0xFF00 /* SD_CSD[2] */
#define CSD_STRUCT_BIT_127_126 0x00C0 /* SD_CSD[7] */
//#define VDD_R_CURR_MIN 0x0000 /* CSD max read current@VDD min */
//#define VDD_R_CURR_MAX 0x0007 /* CSD max read current@VDD max */
//#define VDD_W_CURR_MIN 0x0000 /* CSD max write current@VDD min */
//#define VDD_W_CURR_MAX 0x0007 /* CSD max write current@VDD max */
/*--- R1レスポンスの card status(32bit)に対するマスク ---*/
#define RSP_R1_STATUS_ERR 0xF9FF0008 /* R1レスポンスのカードステータスのチェック */
#define SDCARD_STATUS_OUT_OF_RANGE 0x80000000 /* Card Status OUT_OF_RANGE のチェック */
#define RSP_R1_CURRENT_STATE 0x1E00 /* CARD current state */
/*-------------------------------------------------------*/
/* レスポンスのRSP0 & RSP_R1_CURRENT_STATEを1ビット右シフトした値に対するフラグ */
#define CURRENT_STATE_DATA 0x0500 /* CARD current state data */
#define CURRENT_STATE_RCV 0x0600 /* CARD current state rcv */
/* カードステータス */
#define SD_MEMORY_CARD 0x00FF /* SD_CARD_TYPE SD memory card */
/*-------------------------------------
プロトタイプ宣言
-------------------------------------*/
void SD_Init(void); /* SD Cardインターフェース部をリセット&初期設定 */
void SD_EnableInfo(void); /* SD Card 挿抜 割り込みイネーブル・ディスエーブル */
u16 SD_Command(u16 ucCommand); /* SDカードコマンド送出 */
u16 SD_AppCommand(void); /* SDカード RCA = 1をセット後 CMD55 発行 */
u16 SD_AppOpCond(void); /* ACMD41 発行 busyでなくなるまで繰り返し */
u16 SD_SendOpCond(void); /* CMD1 発行 busyでなくなるまで繰り返し */
u16 SD_SendIfCond(void); /* CMD8 発行 (SDHCのみ反応してくる) */
u16 SD_SendRelativeAddr(void); /* CMD3 発行 正常終了時 RCA<-ResのRCA */
u16 SD_SelectCard(void); /* CMD7 発行 Command toggles acard between the Stand-by and Transfer states */
u16 SD_SetBlockLength(u32 ulBlockLength); /* ブロックレングス(1セクタの転送量)の設定 */
u16 SD_SendCID(void); /* card identification data の取得コマンド発行 */
u16 SD_SendCSD(void); /* card-specific data の取得コマンド発行 */
u16 SD_SendSCR(void); /* SD register の取得コマンド発行 */
u16 SD_SDStatus(void); /* SD STATUS の取得コマンド発行 */
u16 SD_SendStatus(void); /* SD status register の取得コマンド発行 */
u16 SD_MultiReadBlock(u32 ulOffset); /* マルチセクタリードコマンド発行 */
u16 SD_ClockDivSet(u16 usTranSpeed); /* カードの動作クロック設定 */
void SD_EnableClock( void); /* SDカードのクロック有効 */
void SD_DisableClock( void); /* SDカードのクロック無効省電力 */
u16 SD_SelectBitWidth(s16 b4bit); /* ビット幅の選択 */
u16 MMCP_WriteBusWidth(s16 b4bit);
u16 MMCP_BusTest( BOOL readflag);
s16 SD_FPGA_irq(void); /* カード転送要求時のFPGAの制御 */
void SD_StopTransmission(void); /* カード転送終了をFPGAに通知する。 */
void SD_TransEndFPGA(void); /* カード転送の終了処理(割り込みマスクを戻す) */
u16 SD_CheckStatus(BOOL bRead); /* Normal response command カードステータスのチェック */
u16 SD_SwapByte(u16 *data); /* 上位byte、下位byteを入れ替える関数 */
void SD_EnableSeccnt( u32 ulSDCARD_SectorCount); /* SD_SECCNTレジスタ有効化&値設定 */
void SD_DisableSeccnt( void); /* SD_SECCNTレジスタ無効化 */
void SD_SetErr(u16 Error); /* エラーステータスを設定する */
void SD_ClrErr(u16 Error); /* エラーステータスをクリアする */
BOOL SD_CheckFPGAReg(u16 reg,u16 value); /* IPレジスタにフラグが立っているか判定 */
void SD_TransReadyFPGA(void); /* 転送処理準備FPGA設定 */
u16 SD_TransCommand(u16 ucCommand); /* 命令発行処理 */
u16 SD_MultiWriteBlock(u32 ulOffset); /* マルチセクタライトコマンド発行 */
u16 SD_SendNumWRSectors(void); /* ACMD22 書きこみ完了セクタ数取得コマンド発行 */
#endif /* __SD_CARD_IP_H__ */