driver: usdhc: add option to disable 1.8v

When 1.8V is disabled, sdhc can only
communicate at low speed. But this can
save the external circuit for switching
between 3.3V and 1.8V, which is very
practical in costdown scenarios.

Signed-off-by: Frank Li <lgl88911@163.com>
This commit is contained in:
Frank Li 2021-04-11 21:50:21 +08:00 committed by Kumar Gala
commit 42333dc282
2 changed files with 20 additions and 5 deletions

View file

@ -388,6 +388,8 @@ struct usdhc_config {
uint8_t detect_pin;
gpio_dt_flags_t detect_flags;
bool no_1_8_v;
uint32_t data_timeout;
/* Data timeout value
*/
@ -2339,8 +2341,10 @@ static int usdhc_sd_init(struct usdhc_priv *priv)
/* allow user select the work voltage, if not select,
* sdmmc will handle it automatically
*/
if (USDHC_SUPPORT_V180_FLAG != SDMMCHOST_NOT_SUPPORT) {
app_cmd_41_arg |= SD_OCR_SWITCH_18_REQ_FLAG;
if (priv->config->no_1_8_v == false) {
if (USDHC_SUPPORT_V180_FLAG != SDMMCHOST_NOT_SUPPORT) {
app_cmd_41_arg |= SD_OCR_SWITCH_18_REQ_FLAG;
}
}
/* Check card's supported interface condition. */
@ -2387,9 +2391,12 @@ APP_SEND_OP_COND_AGAIN:
if (cmd->response[0U] & SD_OCR_CARD_CAP_FLAG) {
priv->card_info.card_flags |= SDHC_HIGH_CAPACITY_FLAG;
}
/* 1.8V support */
if (cmd->response[0U] & SD_OCR_SWITCH_18_ACCEPT_FLAG) {
priv->card_info.card_flags |= SDHC_1800MV_FLAG;
if (priv->config->no_1_8_v == false) {
/* 1.8V support */
if (cmd->response[0U] & SD_OCR_SWITCH_18_ACCEPT_FLAG) {
priv->card_info.card_flags |= SDHC_1800MV_FLAG;
}
}
priv->card_info.raw_ocr = cmd->response[0U];
} else {
@ -2831,6 +2838,7 @@ static int disk_usdhc_init(const struct device *dev)
.nusdhc = n, \
DISK_ACCESS_USDHC_INIT_PWR(n) \
DISK_ACCESS_USDHC_INIT_CD(n) \
.no_1_8_v = DT_INST_PROP(n, no_1_8_v), \
.data_timeout = USDHC_DATA_TIMEOUT, \
.endian = USDHC_LITTLE_ENDIAN, \
.read_watermark = USDHC_READ_WATERMARK_LEVEL, \