zephyr/subsys/sd/sd_utils.h
Daniel DeGrasse 3e8bbee9ed sd: Add common SD initialization code
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>
2022-04-29 14:21:36 -05:00

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_ */