#ifndef _MMC_H
#define _MMC_H
#include <device_manager.h>
#define MMC_BUS_MODULE_NAME "bus_managers/mmc/driver_v1"
struct IOOperation;
enum {
CARD_TYPE_MMC,
CARD_TYPE_SD,
CARD_TYPE_SDHC,
CARD_TYPE_UHS1,
CARD_TYPE_UHS2,
CARD_TYPE_SDIO
};
enum SD_COMMANDS {
SD_GO_IDLE_STATE = 0,
SD_ALL_SEND_CID = 2,
SD_SEND_RELATIVE_ADDR = 3,
SD_SELECT_DESELECT_CARD = 7,
SD_SEND_IF_COND = 8,
SD_SEND_CSD = 9,
SD_STOP_TRANSMISSION = 12,
SD_READ_SINGLE_BLOCK = 17,
SD_READ_MULTIPLE_BLOCKS = 18,
SD_WRITE_SINGLE_BLOCK = 24,
SD_WRITE_MULTIPLE_BLOCKS = 25,
SD_ERASE_WR_BLK_START = 32,
SD_ERASE_WR_BLK_END = 33,
SD_ERASE = 38,
SD_APP_CMD = 55,
SD_IO_ABORT = 52,
};
enum SDHCI_APPLICATION_COMMANDS {
SD_SET_BUS_WIDTH = 6,
SD_SEND_OP_COND = 41,
};
typedef struct mmc_bus_interface {
driver_module_info info;
status_t (*set_clock)(void* controller, uint32_t kilohertz);
status_t (*execute_command)(void* controller, uint8_t command,
uint32_t argument, uint32_t* result);
status_t (*do_io)(void* controller, uint8_t command,
IOOperation* operation, bool offsetAsSectors);
void (*set_scan_semaphore)(void* controller, sem_id sem);
void (*set_bus_width)(void* controller, int width);
} mmc_bus_interface;
typedef struct mmc_device_interface {
driver_module_info info;
status_t (*execute_command)(device_node* node, void* cookie, uint16_t rca,
uint8_t command, uint32_t argument, uint32_t* result);
status_t (*do_io)(device_node* controller, void* cookie, uint16_t rca,
uint8_t command, IOOperation* operation, bool offsetAsSectors);
void (*set_bus_width)(device_node* controller, void* cookie, int width);
} mmc_device_interface;
const char* const kMmcRcaAttribute = "mmc/rca";
const char* const kMmcTypeAttribute = "mmc/type";
#endif