Go to the documentation of this file.
24 #ifndef SDCARD_SPI_INTERNAL_H
25 #define SDCARD_SPI_INTERNAL_H
39 #define SD_POWERSEQUENCE_CLOCK_COUNT 74
41 #define SD_CARD_PREINIT_CLOCK_PERIOD_US 10
42 #define SD_CARD_WAIT_AFTER_POWER_UP_US 1000
45 #define SD_R1_RESPONSE_PARAM_ERROR (1<<6)
46 #define SD_R1_RESPONSE_ADDR_ERROR (1<<5)
47 #define SD_R1_RESPONSE_ERASE_SEQ_ERROR (1<<4)
48 #define SD_R1_RESPONSE_CMD_CRC_ERROR (1<<3)
49 #define SD_R1_RESPONSE_ILLEGAL_CMD_ERROR (1<<2)
50 #define SD_R1_RESPONSE_ERASE_RESET (1<<1)
51 #define SD_R1_RESPONSE_IN_IDLE_STATE (0x01)
52 #define SD_INVALID_R1_RESPONSE (1<<7)
54 #define R1_VALID(X) (((X) >> 7) == 0)
55 #define R1_PARAM_ERR(X) ((((X) &SD_R1_RESPONSE_PARAM_ERROR) != 0))
56 #define R1_ADDR_ERR(X) ((((X) &SD_R1_RESPONSE_ADDR_ERROR) != 0))
57 #define R1_ERASE_ERR(X) ((((X) &SD_R1_RESPONSE_ERASE_SEQ_ERROR) != 0))
58 #define R1_CMD_CRC_ERR(X) ((((X) &SD_R1_RESPONSE_CMD_CRC_ERROR) != 0))
59 #define R1_ILL_CMD_ERR(X) ((((X) &SD_R1_RESPONSE_ILLEGAL_CMD_ERROR) != 0))
60 #define R1_IDLE_BIT_SET(X) (((X) &SD_R1_RESPONSE_IN_IDLE_STATE) != 0)
61 #define R1_ERROR(X) (R1_PARAM_ERR(X) || R1_ADDR_ERR(X) || R1_ERASE_ERR(X) || \
62 R1_CMD_CRC_ERR(X) || R1_ILL_CMD_ERR(X))
65 #define DATA_RESPONSE_IS_VALID(X) (((X) & 0x11) == 0x01)
66 #define DATA_RESPONSE_ACCEPTED(X) (((X) & 0x0E) == (1<<2))
67 #define DATA_RESPONSE_CRC_ERR(X) (((X) & 0x0E) == 0x0A)
68 #define DATA_RESPONSE_WRITE_ERR(X) (((X) & 0x0E) == 0x0C)
71 #define OCR_VOLTAGE_3_2_TO_3_3 (1L << 20)
72 #define OCR_VOLTAGE_3_3_TO_3_4 (1L << 21)
75 #define OCR_CCS (1L << 30)
78 #define OCR_POWER_UP_STATUS (1L << 31)
82 #define SYSTEM_VOLTAGE (OCR_VOLTAGE_3_2_TO_3_3 | OCR_VOLTAGE_3_2_TO_3_3)
86 #define SD_CMD_PREFIX_MASK (1<<6)
108 #define SD_CMD_8_VHS_2_7_V_TO_3_6_V 0x01
109 #define SD_CMD_8_CHECK_PATTERN 0xB5
110 #define SD_CMD_NO_ARG 0x00000000
111 #define SD_ACMD_41_ARG_HC 0x40000000
112 #define SD_CMD_59_ARG_EN 0x00000001
113 #define SD_CMD_59_ARG_DIS 0x00000000
116 #define SD_DATA_TOKEN_CMD_17_18_24 0xFE
117 #define SD_DATA_TOKEN_CMD_25 0xFC
118 #define SD_DATA_TOKEN_CMD_25_STOP 0xFD
120 #define SD_SIZE_OF_CID_AND_CSD_REG 16
121 #define SD_SIZE_OF_SD_STATUS 64
122 #define SD_BLOCKS_FOR_REG_READ 1
123 #define SD_GET_CSD_STRUCTURE(CSD_RAW_DATA) ((CSD_RAW_DATA)[0] >> 6)
126 #define SD_CSD_VUNSUPPORTED -1
137 #ifndef INIT_CMD_RETRY_US
138 #define INIT_CMD_RETRY_US (250 * US_PER_MS)
140 #ifndef INIT_CMD0_RETRY_US
141 #define INIT_CMD0_RETRY_US (100UL)
143 #ifndef R1_POLLING_RETRY_US
144 #define R1_POLLING_RETRY_US (100 * US_PER_MS)
146 #ifndef SD_DATA_TOKEN_RETRY_US
147 #define SD_DATA_TOKEN_RETRY_US (100 * US_PER_MS)
149 #ifndef SD_WAIT_FOR_NOT_BUSY_US
150 #define SD_WAIT_FOR_NOT_BUSY_US (250 * US_PER_MS)
152 #ifndef SD_BLOCK_READ_CMD_RETRY_US
153 #define SD_BLOCK_READ_CMD_RETRY_US (100UL)
155 #ifndef SD_BLOCK_WRITE_CMD_RETRY_US
156 #define SD_BLOCK_WRITE_CMD_RETRY_US (100UL)
163 #define SD_CSD_V2_C_SIZE_BLOCK_MULT 1024
168 #ifndef SD_CARD_SPI_MODE
169 #define SD_CARD_SPI_MODE SPI_MODE_0
175 #ifndef SD_CARD_SPI_SPEED_PREINIT
176 #define SD_CARD_SPI_SPEED_PREINIT SPI_CLK_400KHZ
182 #ifndef SD_CARD_SPI_SPEED_POSTINIT
183 #define SD_CARD_SPI_SPEED_POSTINIT SPI_CLK_10MHZ
189 #define SD_CARD_DUMMY_BYTE (0xFF)
194 #define SDCARD_SPI_IEC_KIBI (1024L)
199 #define SDCARD_SPI_SI_KILO (1000L)
207 SD_INIT_SPI_POWER_SEQ,
210 SD_INIT_CARD_UNKNOWN,
211 SD_INIT_SEND_ACMD41_HCS,
219 SD_INIT_SET_MAX_SPI_SPEED,
uint8_t sdcard_spi_send_cmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us)
Sends a cmd to the sd card.
Low-level SPI peripheral driver interface definition.
sd_init_fsm_state_t
SD card driver internal states.
SD status register (see section 4.10.2 in SD-Spec v5.00)
sd_rw_response_t sdcard_spi_read_sds(sdcard_spi_t *card, sd_status_t *sd_status)
Gets the SD status of the card.
sd_rw_response_t
sdcard_spi r/w-operation return values
uint32_t sdcard_spi_get_sector_count(sdcard_spi_t *card)
Gets the sector count of the card.
Public interface for the sdcard_spi driver.
uint8_t sdcard_spi_send_acmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us)
Sends an acmd to the sd card.
uint32_t sdcard_spi_get_au_size(sdcard_spi_t *card)
Gets the allocation unit size of the card.
Low-level GPIO peripheral driver interface definitions.
Device descriptor for sdcard_spi.