mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-14 11:15:23 +00:00
All SD cards require SD CMD0 (reset) and CMD8 (send IF cond) at boot. Add this portion of the initialization flow to SD subsystem, as well as query command to check if card is SDIO. Signed-off-by: Daniel DeGrasse <daniel.degrasse@nxp.com>
68 lines
1.2 KiB
C
68 lines
1.2 KiB
C
/*
|
|
* Copyright 2022 NXP
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* Common utility functions for SD subsystem
|
|
*/
|
|
|
|
#ifndef ZEPHYR_SUBSYS_SD_UTILS_H_
|
|
#define ZEPHYR_SUBSYS_SD_UTILS_H_
|
|
|
|
#include <zephyr/zephyr.h>
|
|
#include <zephyr/sd/sd.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* Custom SD return codes. Used internally to indicate conditions that may
|
|
* not be errors, but are abnormal return conditions
|
|
*/
|
|
enum sd_return_codes {
|
|
SD_RETRY = 1,
|
|
SD_NOT_SDIO = 2,
|
|
SD_RESTART = 3,
|
|
};
|
|
|
|
/* Delay function for SD subsystem */
|
|
static inline void sd_delay(unsigned int millis)
|
|
{
|
|
k_msleep(millis);
|
|
}
|
|
|
|
/*
|
|
* Helper function to retry sending command to SD card
|
|
* Will retry command if return code equals SD_RETRY
|
|
*/
|
|
static inline int sd_retry(int(*cmd)(struct sd_card *card),
|
|
struct sd_card *card,
|
|
int retries)
|
|
{
|
|
int ret = -ETIMEDOUT;
|
|
|
|
while (retries-- >= 0) {
|
|
/* Try cmd */
|
|
ret = cmd(card);
|
|
/**
|
|
* Functions have 3 possible responses:
|
|
* 0: success
|
|
* SD_RETRY: retry command
|
|
* other: does not retry
|
|
*/
|
|
if (ret != SD_RETRY) {
|
|
break;
|
|
}
|
|
}
|
|
return ret == SD_RETRY ? -ETIMEDOUT : ret;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_SUBSYS_SD_UTILS_H_ */
|