/***************************************************************************//**
 * @file    drv_sdcard.h
 * @brief   Memory card driver (SPI mode) of RT-Thread RTOS for using EFM32
 *  USART module
 *  COPYRIGHT (C) 2012, RT-Thread Development Team
 * @author  onelife
 * @version 1.0
 *******************************************************************************
 * @section License
 * The license and distribution terms for this file may be found in the file
 *  LICENSE in this distribution or at http://www.rt-thread.org/license/LICENSE
 *******************************************************************************
 * @section Change Logs
 * Date         Author      Notes
 * 2011-05-13   onelife     Initial creation for using EFM32 USART module
 * 2011-07-07   onelife     Modify initialization function to return error code
 ******************************************************************************/
#ifndef __DEV_SDCARD_H__
#define __DEV_SDCARD_H__

/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define EFM32_SDCLK_LOW         (100000)
#if defined(EFM32_GXXX_DK)
#define EFM32_SDCLK_HIGH        (16000000)
#elif defined(EFM32GG_DK3750)
#define EFM32_SDCLK_HIGH        (19000000)
#endif

#if (EFM32_SDCLK_HIGH > (EFM32_HFXO_FREQUENCY/2))
#error "EFM32 SPI clock should not be more than (EFM32_HFXO_FREQUENCY/2)"
#endif

#define SD_SPEED_LOW            (0)
#define SD_SPEED_HIGH           (1)
#define SD_WAIT_PERIOD          (RT_TICK_PER_SECOND)

#define SD_SECTOR_SIZE_SHIFT    (9)
#define SD_SECTOR_SIZE          (1 << SD_SECTOR_SIZE_SHIFT)
#define SD_BLOCK_SIZE_CSD       (16)
#define SD_BLOCK_SIZE_CID       (16)
#define SD_BLOCK_SIZE_OCR       (4)
#define SD_BLOCK_SIZE_SDSTAT    (64)

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

/* Definitions for MMC/SDC command */
#define CMD0                    (0)         /* GO_IDLE_STATE */
#define CMD1                    (1)         /* SEND_OP_COND */
#define ACMD41                  (41|0x80)   /* SEND_OP_COND (SDC) */
#define CMD8                    (8)         /* SEND_IF_COND */
#define CMD9                    (9)         /* SEND_CSD */
#define CMD10                   (10)        /* SEND_CID */
#define CMD12                   (12)        /* STOP_TRANSMISSION */
#define ACMD13                  (13|0x80)   /* SD_STATUS (SDC) */
#define CMD16                   (16)        /* SET_BLOCKLEN */
#define CMD17                   (17)        /* READ_SINGLE_BLOCK */
#define CMD18                   (18)        /* READ_MULTIPLE_BLOCK */
#define CMD23                   (23)        /* SET_BLOCK_COUNT */
#define ACMD23                  (23|0x80)   /* SET_WR_BLK_ERASE_COUNT (SDC) */
#define CMD24                   (24)        /* WRITE_BLOCK */
#define CMD25                   (25)        /* WRITE_MULTIPLE_BLOCK */
#define CMD41                   (41)        /* SEND_OP_COND (ACMD) */
#define CMD55                   (55)        /* APP_CMD */
#define CMD58                   (58)        /* READ_OCR */

/* Exported functions ------------------------------------------------------- */
rt_err_t efm_spiSd_init(void);
void efm_spiSd_deinit(void);

#endif /* __DEV_SDCARD_H__ */