#ifndef __SD_H__
#define __SD_H__

#include <stdint.h>

/* SD/MMC Commands */
#define GO_IDLE_STATE           (0x40 + 0)      // CMD0
#define SEND_OP_COND            (0x40 + 1)
#define CMD8                    (0x40 + 8)      // CMD8
#define SEND_CSD                (0x40 + 9)
#define SEND_CID                (0x40 + 10)     // CMD10
#define STOP_TRAN               (0x40 + 12)     // CMD12
#define SET_BLOCKLEN            (0x40 + 16)     // CMD16
#define READ_BLOCK              (0x40 + 17)
#define READ_MULT_BLOCK         (0x40 + 18)
#define WRITE_BLOCK             (0x40 + 24)
#define WRITE_MULT_BLOCK        (0x40 + 25)
#define APP_CMD                 (0x40 + 55)     // CMD55
#define READ_OCR                (0x40 + 58)     // CMD58
#define CRC_ON_OFF              (0x40 + 59)
#define SD_SEND_OP_COND         (0xC0 + 41)     // ACMD41
#define SD_STATUS               (0xC0 + 13)     // ACMD13, SD_STATUS (SDC)
#define SET_WR_BLK_ERASE_COUNT  (0xC0 + 23)     // ACMD23 (SDC)

/* Card type flags (CardType) */
#define CT_NONE             0x00
#define CT_MMC              0x01
#define CT_SD1              0x02
#define CT_SD2              0x04
#define CT_SDC              (CT_SD1|CT_SD2)
#define CT_BLOCK            0x08

/* MMC device configuration */
typedef struct tagSDCFG
{
    uint32_t sernum;        // serial number
    uint32_t size;          // size=sectorsize*sectorcnt
    uint32_t sectorcnt;     //
    uint32_t sectorsize;    // 512
    uint32_t blocksize;     // erase block size
    uint8_t ocr[4];         // OCR
    uint8_t cid[16];        // CID
    uint8_t csd[16];        // CSD
} SDCFG;

void rt_hw_sdcard_init(void);

#endif