2018-07-04 22:55:27 +02:00
|
|
|
#ifndef FUSEE_SDMMC_H
|
|
|
|
#define FUSEE_SDMMC_H
|
|
|
|
|
|
|
|
#include "sdmmc_core.h"
|
|
|
|
|
|
|
|
/* Structure for storing the MMC CID (adapted from Linux headers) */
|
|
|
|
typedef struct {
|
|
|
|
uint32_t manfid;
|
|
|
|
uint8_t prod_name[8];
|
|
|
|
uint8_t prv;
|
|
|
|
uint32_t serial;
|
|
|
|
uint16_t oemid;
|
|
|
|
uint16_t year;
|
|
|
|
uint8_t hwrev;
|
|
|
|
uint8_t fwrev;
|
|
|
|
uint8_t month;
|
|
|
|
} mmc_cid_t;
|
|
|
|
|
|
|
|
/* Structure for storing the MMC CSD (adapted from Linux headers) */
|
|
|
|
typedef struct {
|
|
|
|
uint8_t structure;
|
|
|
|
uint8_t mmca_vsn;
|
|
|
|
uint16_t cmdclass;
|
|
|
|
uint16_t taac_clks;
|
|
|
|
uint32_t taac_ns;
|
|
|
|
uint32_t c_size;
|
|
|
|
uint32_t r2w_factor;
|
|
|
|
uint32_t max_dtr;
|
|
|
|
uint32_t erase_size; /* In sectors */
|
|
|
|
uint32_t read_blkbits;
|
|
|
|
uint32_t write_blkbits;
|
|
|
|
uint32_t capacity;
|
|
|
|
uint32_t read_partial:1,
|
|
|
|
read_misalign:1,
|
|
|
|
write_partial:1,
|
|
|
|
write_misalign:1,
|
|
|
|
dsr_imp:1;
|
|
|
|
} mmc_csd_t;
|
|
|
|
|
|
|
|
/* Structure for storing the MMC extended CSD (adapted from Linux headers) */
|
|
|
|
typedef struct {
|
|
|
|
uint8_t rev;
|
|
|
|
uint8_t erase_group_def;
|
|
|
|
uint8_t sec_feature_support;
|
|
|
|
uint8_t rel_sectors;
|
|
|
|
uint8_t rel_param;
|
|
|
|
uint8_t part_config;
|
|
|
|
uint8_t cache_ctrl;
|
|
|
|
uint8_t rst_n_function;
|
|
|
|
uint8_t max_packed_writes;
|
|
|
|
uint8_t max_packed_reads;
|
|
|
|
uint8_t packed_event_en;
|
|
|
|
uint32_t part_time; /* Units: ms */
|
|
|
|
uint32_t sa_timeout; /* Units: 100ns */
|
|
|
|
uint32_t generic_cmd6_time; /* Units: 10ms */
|
|
|
|
uint32_t power_off_longtime; /* Units: ms */
|
|
|
|
uint8_t power_off_notification; /* state */
|
|
|
|
uint32_t hs_max_dtr;
|
|
|
|
uint32_t hs200_max_dtr;
|
|
|
|
uint32_t sectors;
|
|
|
|
uint32_t hc_erase_size; /* In sectors */
|
|
|
|
uint32_t hc_erase_timeout; /* In milliseconds */
|
|
|
|
uint32_t sec_trim_mult; /* Secure trim multiplier */
|
|
|
|
uint32_t sec_erase_mult; /* Secure erase multiplier */
|
|
|
|
uint32_t trim_timeout; /* In milliseconds */
|
|
|
|
uint32_t partition_setting_completed; /* enable bit */
|
|
|
|
uint64_t enhanced_area_offset; /* Units: Byte */
|
|
|
|
uint32_t enhanced_area_size; /* Units: KB */
|
|
|
|
uint32_t cache_size; /* Units: KB */
|
|
|
|
uint32_t hpi_en; /* HPI enablebit */
|
|
|
|
uint32_t hpi; /* HPI support bit */
|
|
|
|
uint32_t hpi_cmd; /* cmd used as HPI */
|
|
|
|
uint32_t bkops; /* background support bit */
|
|
|
|
uint32_t man_bkops_en; /* manual bkops enable bit */
|
|
|
|
uint32_t auto_bkops_en; /* auto bkops enable bit */
|
|
|
|
uint32_t data_sector_size; /* 512 bytes or 4KB */
|
|
|
|
uint32_t data_tag_unit_size; /* DATA TAG UNIT size */
|
|
|
|
uint32_t boot_ro_lock; /* ro lock support */
|
|
|
|
uint32_t boot_ro_lockable;
|
|
|
|
uint32_t ffu_capable; /* Firmware upgrade support */
|
|
|
|
uint32_t cmdq_en; /* Command Queue enabled */
|
|
|
|
uint32_t cmdq_support; /* Command Queue supported */
|
|
|
|
uint32_t cmdq_depth; /* Command Queue depth */
|
|
|
|
uint8_t fwrev[8]; /* FW version */
|
|
|
|
uint8_t raw_exception_status; /* 54 */
|
|
|
|
uint8_t raw_partition_support; /* 160 */
|
|
|
|
uint8_t raw_rpmb_size_mult; /* 168 */
|
|
|
|
uint8_t raw_erased_mem_count; /* 181 */
|
|
|
|
uint8_t strobe_support; /* 184 */
|
|
|
|
uint8_t raw_ext_csd_structure; /* 194 */
|
|
|
|
uint8_t raw_card_type; /* 196 */
|
|
|
|
uint8_t raw_driver_strength; /* 197 */
|
|
|
|
uint8_t out_of_int_time; /* 198 */
|
|
|
|
uint8_t raw_pwr_cl_52_195; /* 200 */
|
|
|
|
uint8_t raw_pwr_cl_26_195; /* 201 */
|
|
|
|
uint8_t raw_pwr_cl_52_360; /* 202 */
|
|
|
|
uint8_t raw_pwr_cl_26_360; /* 203 */
|
|
|
|
uint8_t raw_s_a_timeout; /* 217 */
|
|
|
|
uint8_t raw_hc_erase_gap_size; /* 221 */
|
|
|
|
uint8_t raw_erase_timeout_mult; /* 223 */
|
|
|
|
uint8_t raw_hc_erase_grp_size; /* 224 */
|
|
|
|
uint8_t raw_sec_trim_mult; /* 229 */
|
|
|
|
uint8_t raw_sec_erase_mult; /* 230 */
|
|
|
|
uint8_t raw_sec_feature_support; /* 231 */
|
|
|
|
uint8_t raw_trim_mult; /* 232 */
|
|
|
|
uint8_t raw_pwr_cl_200_195; /* 236 */
|
|
|
|
uint8_t raw_pwr_cl_200_360; /* 237 */
|
|
|
|
uint8_t raw_pwr_cl_ddr_52_195; /* 238 */
|
|
|
|
uint8_t raw_pwr_cl_ddr_52_360; /* 239 */
|
|
|
|
uint8_t raw_pwr_cl_ddr_200_360; /* 253 */
|
|
|
|
uint8_t raw_bkops_status; /* 246 */
|
|
|
|
uint8_t raw_sectors[4]; /* 212 - 4 bytes */
|
|
|
|
uint8_t pre_eol_info; /* 267 */
|
|
|
|
uint8_t device_life_time_est_typ_a; /* 268 */
|
|
|
|
uint8_t device_life_time_est_typ_b; /* 269 */
|
|
|
|
uint32_t feature_support;
|
|
|
|
} mmc_ext_csd_t;
|
|
|
|
|
|
|
|
/* Structure for storing the SD SCR (adapted from Linux headers) */
|
|
|
|
typedef struct {
|
|
|
|
uint8_t sda_vsn;
|
|
|
|
uint8_t sda_spec3;
|
|
|
|
uint8_t bus_widths;
|
|
|
|
uint8_t cmds;
|
|
|
|
} sd_scr_t;
|
|
|
|
|
|
|
|
/* Structure for storing the SD SSR (adapted from Linux headers) */
|
|
|
|
typedef struct {
|
|
|
|
uint8_t dat_bus_width;
|
|
|
|
uint8_t secured_mode;
|
|
|
|
uint16_t sd_card_type;
|
|
|
|
uint8_t speed_class;
|
|
|
|
uint8_t uhs_speed_grade;
|
|
|
|
uint8_t uhs_au_size;
|
|
|
|
uint8_t video_speed_class;
|
|
|
|
uint8_t app_perf_class;
|
|
|
|
} sd_ssr_t;
|
|
|
|
|
|
|
|
/* Structure describing a SDMMC device's context. */
|
|
|
|
typedef struct {
|
|
|
|
/* Underlying driver context. */
|
|
|
|
sdmmc_t *sdmmc;
|
|
|
|
|
|
|
|
bool is_180v;
|
|
|
|
bool is_block_sdhc;
|
|
|
|
uint32_t rca;
|
|
|
|
mmc_cid_t cid;
|
|
|
|
mmc_csd_t csd;
|
|
|
|
mmc_ext_csd_t ext_csd;
|
|
|
|
sd_scr_t scr;
|
|
|
|
sd_ssr_t ssr;
|
|
|
|
} sdmmc_device_t;
|
|
|
|
|
|
|
|
int sdmmc_device_sd_init(sdmmc_device_t *device, sdmmc_t *sdmmc, SdmmcBusWidth bus_width, SdmmcBusSpeed bus_speed);
|
|
|
|
int sdmmc_device_mmc_init(sdmmc_device_t *device, sdmmc_t *sdmmc, SdmmcBusWidth bus_width, SdmmcBusSpeed bus_speed);
|
|
|
|
int sdmmc_device_read(sdmmc_device_t *device, uint32_t sector, uint32_t num_sectors, void *data);
|
|
|
|
int sdmmc_device_write(sdmmc_device_t *device, uint32_t sector, uint32_t num_sectors, void *data);
|
|
|
|
int sdmmc_device_finish(sdmmc_device_t *device);
|
2018-07-19 22:07:53 +02:00
|
|
|
int sdmmc_mmc_select_partition(sdmmc_device_t *device, SdmmcPartitionNum partition);
|
2018-07-04 22:55:27 +02:00
|
|
|
|
|
|
|
#endif
|