You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
12 KiB
309 lines
12 KiB
/* vxbFtSdCtrl.h - SD card driver */
|
|
|
|
/*
|
|
*
|
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it;
|
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
*/
|
|
|
|
#ifndef __INCvxbFtSdCtrlh
|
|
#define __INCvxbFtSdCtrlh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#define FT_SDHC_NAME "ftSdhci"
|
|
|
|
#define SDHC_MAX_RW_SECTORS 512
|
|
/* SDCI CMD_SETTING_REG */
|
|
#define SDCI_CMD_ADTC_MASK (0x00008000) /* ADTC*/
|
|
#define SDCI_CMD_CICE_MASK (0x00000010) /**/
|
|
#define SDCI_CMD_CRCE_MASK (0x00000008) /**/
|
|
#define SDCI_CMD_RES_NONE_MASK (0x00000000) /* no response */
|
|
#define SDCI_CMD_RES_LONG_MASK (0x00000001) /* long response */
|
|
#define SDCI_CMD_RES_SHORT_MASK (0x00000002) /* short response */
|
|
|
|
|
|
|
|
/* SDCI_NORMAL_ISR mask */
|
|
#define SDCI_NORMAL_ISR_CC (0x1 << 0) /* R */
|
|
#define SDCI_NORMAL_ISR_CR (0x1 << 1) /* R */
|
|
#define SDCI_NORMAL_ISR_CI (0x1 << 2) /* R */
|
|
#define SDCI_NORMAL_ISR_TIMEOUT (0x1 << 3) /* R */
|
|
|
|
|
|
#define SDCI_SD_DRV_VALUE 0
|
|
#define SDCI_SD_SAMP_VALUE_MAX 50
|
|
#define SDCI_SD_SAMP_VALUE_MIN 0
|
|
|
|
#define SDCI_TIMEOUT_DATA_VALUE 2000000
|
|
|
|
|
|
#define SDCI_TIMEOUT_CMD_VALUE 0xFFFFFFFF
|
|
#define SDCI_POWER_ON 1
|
|
#define SDCI_POWER_OFF 0
|
|
|
|
#define SDCI_CMD_TIMEOUT 10
|
|
#define SDCI_DAT_TIMEOUT 5000
|
|
#define SDCI_CMD_TYPE_ADTC 0x2
|
|
|
|
#define SDCI_F_MIN 400000
|
|
#define SDCI_F_MAX 30000000
|
|
|
|
/* SDCI_NORMAL_ISER mask */
|
|
#define SDCI_SDCI_NORMAL_ISER_ECC_EN (0x1 << 0) /* RW */
|
|
#define SDCI_SDCI_NORMAL_ISER_ECR (0x1 << 1) /* RW */
|
|
#define SDCI_SDCI_NORMAL_ISER_EEI_EN (0x1 << 15) /* RW */
|
|
|
|
|
|
|
|
/* SDCI_SOFTWARE mask */
|
|
#define SDCI_SOFTWARE_SRST (0x1 << 0) /* RW */
|
|
#define SDCI_SOFTWARE_BDRST (0x1 << 2) /* RW */
|
|
#define SDCI_SOFTWARE_CFCLF (0x1 << 3) /* RW */
|
|
|
|
|
|
/* SDCI_STATUS mask */
|
|
#define SDCI_STATUS_CMD_BUSY (0x0 << 0) /* R */
|
|
#define SDCI_STATUS_CMD_READY (0x1 << 0) /* R */
|
|
#define SDCI_STATUS_IDIE (0x1 << 12) /* R */
|
|
|
|
|
|
/* SDCI NORMAL_INT_STATUS_REG */
|
|
#define SDCI_NORMAL_EI_STATUS (0x00008000) /* command error */
|
|
#define SDCI_NORMAL_CR_STATUS (0x00000002) /* card remove */
|
|
#define SDCI_NORMAL_CC_STATUS (0x00000001) /* command done */
|
|
|
|
#define MMC_CMD_ALL_SEND_CID 2
|
|
|
|
|
|
|
|
#define SDCI_CONTROLLER ( 0x00) /* the controller config reg */
|
|
#define SDCI_ARGUMENT (0x04) /* the argument reg */
|
|
#define SDCI_COMMAND (0x08) /* the command reg */
|
|
#define SDCI_CLOCK_D (0x0c) /* the clock divide reg */
|
|
#define SDCI_SOFTWARE (0x10) /* the controller reset reg */
|
|
#define SDCI_POWER (0x14) /* THE POWRE CONTROL REG */
|
|
#define SDCI_TIMEOUT_CMD (0x18) /* the cmd timeout config reg */
|
|
#define SDCI_TIMEOUT_DATA (0x1c)
|
|
|
|
#define SDCI_NORMAL_ISER (0x20) /* the normal ISR config reg */
|
|
#define SDCI_ERROR_ISER (0x24) /* the erroe ISR config reg */
|
|
#define SDCI_BD_ISER (0x28) /* the BD ISR config reg */
|
|
#define SDCI_SD_DRV (0x30) /* the SD card driving phase position reg */
|
|
#define SDCI_SD_SAMP (0x34) /* the SD card sampling phase position reg */
|
|
#define SDCI_SD_SEN (0x38) /* the SD card detection reg */
|
|
#define SDCI_HDS_AXI (0x3c) /* AIX boundary config reg */
|
|
#define SDCI_BD_RX (0x40) /* the BD rx addr reg */
|
|
#define SDCI_BD_TX ( 0x60) /* the BD tx addr reg */
|
|
#define SDCI_BLK_CNT (0x80) /* the r/w block num reg */
|
|
#define SDCI_NORMAL_ISR ( 0xC0) /* the normal ISR status reg */
|
|
|
|
#define SDCI_ERROR_ISR (0xC4) /* the error ISR status reg */
|
|
#define SDCI_BD_ISR ( 0xC8) /* the BD ISR status reg */
|
|
|
|
#define SDCI_STATUS (0xD0) /* the status reg */
|
|
#define SDCI_BLOCK ( 0xD4) /* the block len reg */
|
|
#define SDCI_RESP0 ( 0xE0) /* response reg0 */
|
|
#define SDCI_RESP1 ( 0xE4) /* response reg1 */
|
|
#define SDCI_RESP2 ( 0xE8) /* response reg2 */
|
|
#define SDCI_RESP3 ( 0xEC) /* response reg3 */
|
|
|
|
#define SD_BLOCK_SIZE 512
|
|
#define MMC_DATA_WRITE BIT(8)
|
|
#define MMC_DATA_READ BIT(9)
|
|
/* Extra flags used by CQE */
|
|
#define MMC_DATA_QBR BIT(10) /* CQE queue barrier*/
|
|
#define MMC_DATA_PRIO BIT(11) /* CQE high priority */
|
|
#define MMC_DATA_REL_WR BIT(12) /* Reliable write */
|
|
#define MMC_DATA_DAT_TAG BIT(13) /* Tag request */
|
|
#define MMC_DATA_FORCED_PRG BIT(14) /* Forced programming */
|
|
|
|
|
|
#define MMC_GO_IDLE_STATE 0 /* bc */
|
|
#define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */
|
|
#define MMC_ALL_SEND_CID 2 /* bcr R2 */
|
|
#define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */
|
|
#define MMC_SET_DSR 4 /* bc [31:16] RCA */
|
|
#define MMC_SLEEP_AWAKE 5 /* ac [31:16] RCA 15:flg R1b */
|
|
#define MMC_SWITCH 6 /* ac [31:0] See below R1b */
|
|
#define MMC_SELECT_CARD 7 /* ac [31:16] RCA R1 */
|
|
#define MMC_SEND_EXT_CSD 8 /* adtc R1 */
|
|
#define MMC_SEND_CSD 9 /* ac [31:16] RCA R2 */
|
|
#define MMC_SEND_CID 10 /* ac [31:16] RCA R2 */
|
|
#define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */
|
|
#define MMC_STOP_TRANSMISSION 12 /* ac R1b */
|
|
#define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */
|
|
#define MMC_BUS_TEST_R 14 /* adtc R1 */
|
|
#define MMC_GO_INACTIVE_STATE 15 /* ac [31:16] RCA */
|
|
#define MMC_BUS_TEST_W 19 /* adtc R1 */
|
|
#define MMC_SPI_READ_OCR 58 /* spi spi_R3 */
|
|
#define MMC_SPI_CRC_ON_OFF 59 /* spi [0:0] flag spi_R1 */
|
|
|
|
|
|
/* SDCI ERROR_INT_STATUS_REG */
|
|
#define SDCI_ERROR_CNR_ERROR_STATUS (0x00000010) /**/
|
|
#define SDCI_ERROR_CIR_ERROR_STATUS (0x00000008) /**/
|
|
#define SDCI_ERROR_CCRCE_ERROR_STATUS (0x00000002) /**/
|
|
#define SDCI_ERROR_CTE_ERROR_STATUS (0x00000001) /**/
|
|
|
|
|
|
/* SDCI BD_ISR_REG */
|
|
#define SDCI_BD_DAIS_ERROR_STATUS (0x00008000) /* */
|
|
#define SDCI_BD_RESPE_STATUS (0x00000100) /* */
|
|
#define SDCI_BD_DATFRAX_ERROR_STATUS (0x00000080) /* */
|
|
#define SDCI_BD_NRCRC_ERROR_STATUS (0x00000040) /* */
|
|
#define SDCI_BD_TRE_ERROR_STATUS (0x00000020) /* */
|
|
#define SDCI_BD_CMDE_ERROR_STATUS (0x00000010) /* */
|
|
#define SDCI_BD_DTE_ERROR_STATUS (0x00000008) /* */
|
|
#define SDCI_BD_TRS_STATUS (0x00000001) /* */
|
|
|
|
|
|
#ifdef SDCI_BDINT_MODE_0
|
|
#define SDCI_BD_ISR_TRS (0x1 << 0) /* R */
|
|
#else
|
|
#define SDCI_BD_ISR_TRS_W (0x1 << 0) /* R */ /*the hardware update*/
|
|
#define SDCI_BD_ISR_TRS_R (0x1 << 8) /* R */ /*the hardware update*/
|
|
#endif
|
|
#define SDCI_BD_ISR_EDTE (0x1 << 3) /* R */
|
|
|
|
|
|
/* SDCI_HDS_AXI mask */
|
|
#define SDCI_HDS_AXI_AWDOMAIN (0x1 << 0) /* RW */
|
|
#define SDCI_HDS_AXI_ARDOMAIN (0x1 << 12) /* RW */
|
|
#define SDCI_HDS_AXI_AWCACHE (0x6 << 24) /* RW */
|
|
#define SDCI_HDS_AXI_ARCACHE (0xB << 28) /* RW */
|
|
|
|
/* SDCI_STATUS mask */
|
|
#define SDCI_STATUS_CMD_BUSY (0x0 << 0) /* R */
|
|
#define SDCI_STATUS_CMD_READY (0x1 << 0) /* R */
|
|
#define SDCI_STATUS_IDIE (0x1 << 12) /* R */
|
|
|
|
|
|
/* SDCI_NORMAL_ISR mask */
|
|
#define SDCI_NORMAL_ISR_CC (0x1 << 0) /* R */
|
|
#define SDCI_NORMAL_ISR_CR (0x1 << 1) /* R */
|
|
|
|
#define SDCI_NORMAL_ISR_TIMEOUT (0x1 << 3) /* R */
|
|
|
|
|
|
/* SDCI_ERROR_ISER mask */
|
|
#define SDCI_ERROR_ISER_ECTE_EN (0x1 << 0) /* RW */
|
|
|
|
/* SDCI_ERROR_ISR mask */
|
|
#define SDCI_ERROR_ISR_CTE (0x1 << 0) /* R */
|
|
|
|
/* SDCI_BD_ISER mask */
|
|
#ifdef SDCI_BDINT_MODE_0
|
|
#define SDCI_BD_ISER_ETRS_EN (0x1 << 0) /* RW */
|
|
#else
|
|
#define SDCI_BD_ISER_ETRS_EN (0x1 << 8) /* RW */ /*the hardware update*/
|
|
#endif
|
|
|
|
|
|
#define MMC_APP_CMD 55
|
|
#define SD_APP_SET_BUS_WIDTH 6
|
|
|
|
#define SDCI_CMD_INDEX_MASK (0x00003F00)
|
|
#define SDCI_CMD_INDEX_SHIFT (8)
|
|
|
|
|
|
#define MMC_RSP_PRESENT (1 << 0)
|
|
#define MMC_RSP_136 (1 << 1) /* 136 bit response */
|
|
#define MMC_RSP_CRC (1 << 2) /* expect valid crc */
|
|
#define MMC_RSP_BUSY (1 << 3) /* card may send busy */
|
|
#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */
|
|
|
|
#define SDCI_SDCI_NORMAL_ISER_ECC_EN (0x1 << 0)
|
|
#define SDCI_BD_ISER_ETRS_EN (0x1 << 8)
|
|
|
|
#define SDCI_SOURCE_CLOCK_RATE 48000000
|
|
|
|
/* SDCI SOFTWARE_RESET_REG */
|
|
#define SDCI_RESET_CFCLF (0x00000008) /* 0 */
|
|
#define SDCI_BDRST (0x00000004) /* DMA BD set */
|
|
#define SDCI_SRST (0x00000001) /* soft reset controller */
|
|
|
|
/*irq */
|
|
#define IRQ_err 0x1<<15
|
|
#define IRQ_CMD_FT 0X1<<0
|
|
#define IRQ_DMA
|
|
#define IRQ_REMOVE 0X1<<1
|
|
|
|
#define MMC_CMD23_ARG_REL_WR (1 << 31)
|
|
#define MMC_CMD23_ARG_PACKED ((0 << 31) | (1 << 30))
|
|
#define MMC_CMD23_ARG_TAG_REQ (1 << 29)
|
|
|
|
unsigned int flags; /* expected response type */
|
|
|
|
|
|
#define MMC_CMD_MASK (3 << 5) /* non-SPI command type */
|
|
#define MMC_CMD_AC (0 << 5)
|
|
#define MMC_CMD_ADTC (1 << 5)
|
|
#define MMC_CMD_BC (2 << 5)
|
|
#define MMC_CMD_BCR (3 << 5)
|
|
|
|
#define MMC_RSP_SPI_S1 (1 << 7) /* one status byte */
|
|
#define MMC_RSP_SPI_S2 (1 << 8) /* second byte */
|
|
#define MMC_RSP_SPI_B4 (1 << 9) /* four data bytes */
|
|
#define MMC_RSP_SPI_BUSY (1 << 10) /* card may send busy */
|
|
|
|
#define SDCI_SDCI_NORMAL_ISER_ECI (0x1 << 2)
|
|
|
|
/* SDHC driver control */
|
|
|
|
typedef struct ftsdhcDrvCtrl
|
|
{
|
|
SD_HOST_CTRL sdHostCtrl;
|
|
VXB_DEVICE_ID pDev;
|
|
void * regBase;
|
|
void * regHandle;
|
|
struct vxbSdioInt * pIntInfo;
|
|
UINT32 intSts;
|
|
UINT32 intMask;
|
|
} FTSDHC_DEV_CTRL;
|
|
/* register low level access routines */
|
|
|
|
#define FTSDHC_BAR(p) ((FTSDHC_DEV_CTRL *)(p)->pDrvCtrl)->regBase
|
|
#define FTSDHC_HANDLE(p) ((FTSDHC_DEV_CTRL *)(p)->pDrvCtrl)->regHandle
|
|
|
|
#define CSR_READ_4(pDev, addr) \
|
|
vxbRead32(FTSDHC_HANDLE(pDev), \
|
|
(UINT32 *)((char *)FTSDHC_BAR(pDev) + addr))
|
|
|
|
#define CSR_WRITE_4(pDev, addr, data) \
|
|
vxbWrite32(FTSDHC_HANDLE(pDev), \
|
|
(UINT32 *)((char *)FTSDHC_BAR(pDev) + addr), data)
|
|
#define CSR_SETBIT_4(pDev, offset, val) \
|
|
CSR_WRITE_4(pDev, offset, CSR_READ_4(pDev, offset) | (val))
|
|
|
|
#define CSR_CLRBIT_4(pDev, offset, val) \
|
|
CSR_WRITE_4(pDev, offset, CSR_READ_4(pDev, offset) & (UINT32)(~(val)))
|
|
|
|
void sdhcCtrlInstInit(VXB_DEVICE_ID);
|
|
void sdhcCtrlInstInit2 (VXB_DEVICE_ID);
|
|
STATUS sdhcCtrlInstConnect (SD_HOST_CTRL * pSdHostCtrl);
|
|
STATUS sdhcCtrlIsr (VXB_DEVICE_ID);
|
|
STATUS sdhcCtrlCmdIssue (VXB_DEVICE_ID, SD_CMD *);
|
|
STATUS sdhcCtrlCmdPrepare (VXB_DEVICE_ID, SD_CMD *);
|
|
STATUS sdhcCtrlCmdIssuePoll (VXB_DEVICE_ID, SD_CMD *);
|
|
STATUS sdhcCtrlInit (VXB_DEVICE_ID);
|
|
STATUS sdhcInterruptInfo (VXB_DEVICE_ID, UINT32 *);
|
|
STATUS sdhcDevControl (VXB_DEVICE_ID, pVXB_DEVCTL_HDR);
|
|
|
|
void sdhcCtrlBusWidthSetup (VXB_DEVICE_ID, UINT32);
|
|
void sdhcCtrlCardMonTaskPoll (VXB_DEVICE_ID);
|
|
void ftsdhcCtrlClkFreqSetup (VXB_DEVICE_ID, UINT32);
|
|
BOOL sdhcCtrlCardWpCheck (VXB_DEVICE_ID);
|
|
BOOL sdhcCtrlCardInsertSts (VXB_DEVICE_ID);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCvxbFtSdCtrlh */
|
|
|
|
|