#ifndef _SDIO_H_ #define _SDIO_H_ #include "global_types.h" #define PLAT_CRANE 1 //used for sd card #define SD1_HOST_CTRL_ADDR 0xD4280000 /*Err code*/ #define MMC_ERR_NONE 0 #define MMC_ERR_CMD_TOUT 1 #define MMC_ERR_DATA_TOUT 2 #define MMC_ERR_DATA_CRC 3 #define MMC_ERR_INVALID 4 #define MMC_ERR_OUTRANGE 5 #define MMC_ERR_IO 6 #define MMC_ERR_INVALIDARG 7 #define MMC_ERR_OUTMEMORY 8 #define STATUS_FAILURE -1 #define ERR_INT ((UINT16)1 << 15) /* Error Interrupt*/ #define CARD_INT ((UINT16)1 << 8) /* Card Interrupt */ #define CARD_REM ((UINT16)1 << 7) /* Card Removal Interrupt */ #define CARD_INS ((UINT16)1 << 6) /* Card Insertion Interrupt */ #define RX_RDY ((UINT16)1 << 5) /* Buffer Read Ready */ #define TX_RDY ((UINT16)1 << 4) /* Buffer Write Ready */ #define SD_DMA_INT ((UINT16)1 << 3) /* DMA interupt */ #define BLK_GAP_EVNT ((UINT16)1 << 2) /* Block Gap Event */ #define XFER_COMP ((UINT16)1 << 1) /* Transfer Complete */ #define CMD_COMP ((UINT16)1 << 0) /* Command Complete */ #define CRC_STATUS_ERR ((UINT16)1 << 15) /* CRC Status Error Returned from Card in Write Transaction*/ #define CPL_TO_ERR ((UINT16)1 << 14) /* Command Completion Signal Timeout Error, for CE-ATA mode only*/ #define AXI_RESP_ERR ((UINT16)1 << 13) /* AXI Bus Response Error */ #define SPI_ERR ((UINT16)1 << 12) /* SPI Mode Error*/ #define ADMA_ERR ((UINT16)1 << 9) /* AMDA Error */ #define AUTO_CMD12_ERR ((UINT16)1 << 8) /* Auto CMD12 Error*/ #define CUR_LIMIT_ERR ((UINT16)1 << 7) /* Current Limit Error*/ #define RD_DATA_END_ERR ((UINT16)1 << 6) /* Read Data End Bit Error*/ #define RD_DATA_CRC_ERR ((UINT16)1 << 5) /* Read Data CRC Error*/ #define DATA_TO_ERR ((UINT16)1 << 4) /* Data Timeout Error*/ #define CMD_IDX_ERR ((UINT16)1 << 3) /* Command Index Error*/ #define CMD_END_BIT_ERR ((UINT16)1 << 2) /* Command End Bit Error*/ #define CMD_CRC_ERR ((UINT16)1 << 1) /* Command CRC Error*/ #define CMD_TO_ERR ((UINT16)1 << 0) /* Command Timeout Error*/ #define SD_ERR_INT_EN_RVD_MASK ((UINT16)0x0c00) /* Mask for SD_ERR_INT_EN/SD_ERR_I_STAT_EN Reserved Bits[11 :10] */ #define SD_ERR_INT_DATA_ERR_MASK (DATA_TO_ERR | RD_DATA_CRC_ERR | RD_DATA_END_ERR) /*DATA Line Error*/ #define SD_ERR_INT_CMD_ERR_MASK (CMD_TO_ERR | CMD_CRC_ERR | CMD_END_BIT_ERR | CMD_IDX_ERR) /* CMD Line Error*/ #define SD0_HOST_PMU_AXI_CLOCK 0xd4282854 #define SD1_HOST_PMU_AXI_CLOCK 0xd4282858 #define SD2_HOST_PMU_AXI_CLOCK 0xd42828E0 #define APB_CLOCK_UNIT_PHYSICAL_BASE 0xD4015000 #define APBC_GPIO_CLK_RST_offset 0x0008 #define SD_SYSADDR_LOW_offset 0x00 #define SD_SYSADDR_HIGH_offset 0x02 #define SD_BLOCK_SIZE_offset 0x04 #define SD_BLOCK_COUNT_offset 0x06 #define SD_ARG_LOW_offset 0x08 #define SD_ARG_HIGH_offset 0x0A #define SD_TRANSFER_MODE_offset 0x0C #define SD_CMD_offset 0x0E #define SD_RESP_0_offset 0x10 #define SD_RESP_1_offset 0x12 #define SD_RESP_2_offset 0x14 #define SD_RESP_3_offset 0x16 #define SD_RESP_4_offset 0x18 #define SD_RESP_5_offset 0x1A #define SD_RESP_6_offset 0x1C #define SD_RESP_7_offset 0x1E #define SD_BUF_PORT_0_offset 0x20 #define SD_BUF_PORT_1_offset 0x22 #define SD_PRESENT_STAT_0_offset 0x24 #define SD_PRESENT_STAT_1_offset 0x26 #define SD_HOST_CTRL_offset 0x28 #define SDHCI_POWER_CONTROL 0x29 #define SD_BGAP_CTRL_offset 0x2A #define SD_CLOCK_CTRL_offset 0x2C #define SD_SW_RESET_CTRL_offset 0x2E #define SD_NORM_INTR_STS_offset 0x30 #define SD_ERR_INTR_STS_offset 0x32 #define SD_NORM_INTR_STS_EBLE_offset 0x34 #define SD_ERR_INTR_STS_EBLE_offset 0x36 #define SD_NORM_INTR_STS_INTR_EBLE_offset 0x38 #define SD_ERR_INTR_STS_INTR_EBLE_offset 0x3A #define SD_ADMA_SYS_ADDR_offset 0x58 #define SD_ADMA_SYS_ADDR2_offset 0x5C #define SD_CE_ATA_1_offset 0xE8 #define SD_PAD_IO_SETUP 0xEC #define SDHCI_WAKE_UP_CONTROL 0x2B #define SDHCI_ACMD12_ERR 0x3C #define SDHCI_SLOT_INT_STATUS 0xFC #define SDHCI_HOST_CTRL2 0X3E #define SDHCI_PRESET_VALUE_FOR_SDR50 0x6A #ifdef PLAT_CRANE #define SD_CLOCK_AND_BURST_SIZE_SETUP_offset 0x104 #define SDHCI_TX_CFG 0X11C #define SDHCI_MMC_CTRL 0x114 #define SDHCI_RX_CFG_REG 0x118 #else #define SD_CLOCK_AND_BURST_SIZE_SETUP_offset 0x10A #define SD_FIFO_PARA_offset 0x104 #define SDHCI_TX_CFG 0X118 #define SDHCI_RX_CFG_REG 0x114 #endif #define SDHCI_MAX_CURRENT 0x48 #define SDHCI_HOST_VERSION 0xFE #define SDHCI_VENDOR_VER_MASK 0xFF00 #define SDHCI_VENDOR_VER_SHIFT 8 #define SDHCI_SPEC_VER_MASK 0x00FF #define SDHCI_SPEC_VER_SHIFT 0 #define SDHCI_SPEC_100 0 #define SDHCI_SPEC_200 1 #define SDHCI_SPEC_300 2 #define SDHCI_CLOCK_CARD_EN 0x0004 #define SDHCI_CLOCK_INT_STABLE 0x0002 #define SDHCI_CLOCK_INT_EN 0x0001 #define SDHCI_CAPABILITIES 0x40 #define SDHCI_CAPABILITIES2 0x42 #define SDHCI_CAPABILITIES3 0x44 #define SDHCI_CAPABILITIES4 0x46 #define SDIO_CCCR_UHS 0x14 #define SDR50_SUPPORT 1<<0 #define SDR104_SUPPORT 1<<1 #define DDR50_SUPPORT 1<<2 #define SDIO_CCCR_DRIVE_STRENGTH 0x15 #define SDIO_STTx_MASK 0x07 #define SDIO_DRIVE_SDTA (1<<0) #define SDIO_DRIVE_SDTC (1<<1) #define SDIO_DRIVE_SDTD (1<<2) #define SDIO_DRIVE_DTSx_MASK 0x03 #define SDIO_DRIVE_DTSx_SHIFT 4 #define SDIO_DTSx_SET_TYPE_B (0< (b)) ? (a) : (b)) #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif typedef struct _sdio_cccr { unsigned int sdio_vsn; unsigned int multi_block:1, low_speed:1, wide_bus:1, high_power:1, high_speed:1; }sdio_cccr; /* * SDIO function CIS tuple (unknown to the core) */ struct sdio_func_tuple { struct sdio_func_tuple *next; unsigned char code; unsigned char size; unsigned char data[0]; }; typedef int (tpl_parse_t)(UINT8, const unsigned char *, unsigned); struct cis_tpl { unsigned char code; unsigned char min_size; tpl_parse_t *parse; }; int cistpl_manfid(UINT8, const unsigned char *buf, unsigned size); int cistpl_funce(UINT8, const unsigned char *buf, unsigned size); static const struct cis_tpl cis_tpl_list[] = { { 0x15, 3, 0/*cistpl_vers_1*/ }, { 0x20, 4, cistpl_manfid }, { 0x21, 2, 0/*cistpl_funcid*/ }, { 0x22, 0, cistpl_funce }, }; struct sdio_func { unsigned int num; /* function number */ unsigned max_blksize; /* maximum block size */ unsigned cur_blksize; /* current block size */ unsigned char class; /* standard interface class */ unsigned int vendor; /* vendor id */ unsigned int device; /* device id */ }; typedef struct _sd_scr { unsigned char sda_vsn; unsigned char sd_security; unsigned char sd_bus_width; unsigned char sd_cmd23_avail; unsigned char sd_cmd20_avail; }sd_scr; typedef struct _function_group { unsigned short access_mode; unsigned short cmd_system; unsigned short driver_strength; unsigned short current_limit; unsigned short max_current; unsigned short g1_busy_stat; unsigned short g2_busy_stat; unsigned short g3_busy_stat; unsigned short g4_busy_stat; unsigned char g1_switch_res; unsigned char g2_switch_res; unsigned char g3_switch_res; unsigned char g4_switch_res; }function_group; #define FUNCTION_BLOCKSIZE 512 #define MAXFUNCTION 8 #define VENDORID (0x02df) #define DEVICEID (0x912d) #define SINGLE_BLOCK_SIZE_SHIFT 9 #define SINGLE_BLOCK_SIZE 0x200 extern UINT32 SD_CTRL_BASE_ADDR; int sdio_init(int sd_slot, int wifi_pwr_en, int wifi_int_host, int wifi_pwr_reset, int host_wakeup_wifi, int sys_clk_32k); int sdcard_init(void); BOOL SDWork(void); UINT32 sdcard_get_blknum(void); void eeSDDumpPrepare(void); int sdcard_init_internal(void); BOOL sdcard_transmit_status(void); int get_sdcard_log_partition_status(void); int eeSDDump_status_get_internal(void); void eeSDDumpPrepareInternal(void); void SulogSDMakeDirInternal(void); void SulogSDMakeDir(void); BOOL sdcard_is_ready(void); BOOL sdcard_is_ready_internal(void); BOOL sdcard_transmit_status_internal(void); UINT32 sdcard_read_singleblk_internal(UINT32 base, UINT32 buffer, UINT32 loop); UINT32 sdcard_write_singleblk_internal(UINT32 base, UINT32 buffer, UINT32 loop); UINT32 sdcard_read_multiblks(UINT32 base, UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_write_multiblks(UINT32 base, UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_write_mass_storage(UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_read_mass_storage(UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_read_multiblks_internal(UINT32 base, UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_write_multiblks_internal(UINT32 base, UINT32 buffer, UINT32 loop, UINT32 blk_cnt); UINT32 sdcard_read_singleblk(UINT32 base, UINT32 buffer, UINT32 loop); UINT32 sdcard_write_singleblk(UINT32 base, UINT32 buffer, UINT32 loop); int sdcard_fat_is_ok_internal(void); #endif //_SDIO_H_