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.
trezor-firmware/core/embed/trezorhal/sdcard-set_clr_card_detect.h

62 lines
2.0 KiB

#include "stm32f4xx_ll_sdmmc.h"
// this function is adapted from stm32f4xx_ll_sdmmc.c
static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD,
uint32_t Timeout) {
/* 8 is the number of required instructions cycles for the below loop
statement. The Timeout is expressed in ms */
register uint32_t count = Timeout * (SystemCoreClock / 8U / 1000U);
do {
if (count-- == 0U) {
return SDMMC_ERROR_TIMEOUT;
}
} while (!__SDIO_GET_FLAG(
SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT));
if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) {
__SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT);
return SDMMC_ERROR_CMD_RSP_TIMEOUT;
} else if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL)) {
__SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL);
return SDMMC_ERROR_CMD_CRC_FAIL;
}
/* Check response received is of desired command */
if (SDIO_GetCommandResponse(SDIOx) != SD_CMD) {
return SDMMC_ERROR_CMD_CRC_FAIL;
}
/* Clear all the static flags */
__SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS);
/* We have received response, retrieve it for analysis */
uint32_t response_r1 = SDIO_GetResponse(SDIOx, SDIO_RESP1);
if ((response_r1 & SDMMC_OCR_ERRORBITS) == SDMMC_ALLZERO) {
return SDMMC_ERROR_NONE;
} else {
return SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
}
}
// this function is inspired by functions in stm32f4xx_ll_sdmmc.c
uint32_t SDMMC_CmdSetClrCardDetect(SDIO_TypeDef *SDIOx, uint32_t Argument) {
SDIO_CmdInitTypeDef sdmmc_cmdinit;
uint32_t errorstate = SDMMC_ERROR_NONE;
sdmmc_cmdinit.Argument = (uint32_t)Argument;
sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_SET_CLR_CARD_DETECT;
sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT;
sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO;
sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE;
SDIO_SendCommand(SDIOx, &sdmmc_cmdinit);
errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SD_APP_SET_CLR_CARD_DETECT,
SDIO_CMDTIMEOUT);
return errorstate;
}