blob: 081843ccd9f49ce81b8914b7e1453d4588f2d46f [file] [log] [blame]
/*This file is prepared for Doxygen automatic documentation generation.*/
/*! \file *********************************************************************
*
* \brief SD/MMC card driver using an MCI interface.
*
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
* - Supported devices: All AVR32 devices with an MCI module can be used.
* - AppNote:
*
* \author Atmel Corporation: http://www.atmel.com \n
* Support and FAQ: http://support.atmel.no/
*
******************************************************************************/
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an Atmel
* AVR product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
*/
#ifndef _SD_MMC_MCI_H_
#define _SD_MMC_MCI_H_
/*_____ I N C L U D E S ____________________________________________________*/
#include "conf_access.h"
#if SD_MMC_MCI_0_MEM == DISABLE && SD_MMC_MCI_1_MEM == DISABLE
#error sd_mmc_mci.h is #included although SD_MMC_MCI_x_MEM are all disabled
#endif
#include "compiler.h"
#include "mci.h"
#include "sd_mmc_cmd.h"
/*_____ M A C R O S ________________________________________________________*/
//! Number of bits for addresses within sectors.
#define SD_MMC_SECTOR_BITS 9
//! Sector size in bytes.
#define SD_MMC_SECTOR_SIZE (1 << SD_MMC_SECTOR_BITS)
/*_____ D E F I N I T I O N ________________________________________________*/
//! Card identification
#define UNKNOWN_CARD 0x00
#define MMC_CARD 0x01
#define SD_CARD 0x02
#define MMC_CARD_V4 0x04
#define SD_CARD_V2 0x08
#define SD_CARD_HC 0x10
#define MMC_CARD_HC 0x20
//! Card state
#define CARD_UNINSTALLED 0
#define CARD_INSTALLED 1
//! OCR register
#define OCR_MSK_BUSY 0x80000000 // Busy flag
#define OCR_MSK_HC 0x40000000 // High Capacity flag
#define OCR_MSK_VOLTAGE_3_2V_3_3V 0x00100000 // Voltage 3.2V to 3.3V flag
#define OCR_MSK_VOLTAGE_ALL 0x00FF8000 // All Voltage flag
//! RCA register
#define RCA_RESERVE_ADR 0x00000000
#define RCA_MSK_ADR 0xFFFF0000
#define RCA_DEFAULT_ADR 0x0001FFFF // It can be changed
//! CSD register
#define CSD_REG_SIZE 0x10
#define CSD_STRUCT_1_0 0x00
#define CSD_STRUCT_1_1 0x40
#define CSD_STRUCT_1_2 0x80
#define CSD_STRUCT_SUP 0xC0
#define CSD_MSK_STRUCT 0xC0
#define CSD_SPEC_VER_1_0 0x00
#define CSD_SPEC_VER_1_4 0x04
#define CSD_SPEC_VER_2_0 0x08
#define CSD_SPEC_VER_3_1 0x0C
#define CSD_SPEC_VER_4_0 0x10
#define CSD_MSK_SPEC_VER 0x3C
#define CSD_MSK_RBP 0x80
#define CSD_MSK_WBM 0x40
#define CSD_MSK_RBM 0x20
#define CSD_MSK_RBL 0x0F
#define CSD_MSK_CSH 0x03
#define CSD_MSK_CSL 0xC0
#define CSD_MSK_CSM 0x07
#define CSD_MSK_CSMH 0x03
#define CSD_MSK_CSML 0x80
#define CSD_MSK_WBL 0x03
#define CSD_MSK_WBH 0xC0
#define CSD_MSK_WBP 0x20
#define CSD_BLEN_2048 11
#define CSD_BLEN_512 9
//! MMC Status Mask
#define MMC_STBY_STATE_MSK ((U32)0x01D81E00)
#define MMC_STBY_STATE ((U32)0x00000600) // stby state
#define MMC_DATA_STATE_MSK ((U32)0xE0040E00)
#define MMC_DATA_STATE ((U32)0x00000A00) // data state
#define MMC_RCV_STATE_MSK ((U32)0xE0020E00)
#define MMC_RCV_STATE ((U32)0x00000A00) // rcv state
#define MMC_TRAN_STATE_MSK ((U32)0xE0020E00)
#define MMC_TRAN_STATE ((U32)0x00000800) // tran state
//! Flag error of "Card Status" in R1
#define CS_FLAGERROR_RD_WR (CS_ADR_OUT_OF_RANGE|CS_ADR_MISALIGN|CS_BLOCK_LEN_ERROR|CS_ERASE_SEQ_ERROR|CS_ILLEGAL_COMMAND|CS_CARD_ERROR)
#define CS_ADR_OUT_OF_RANGE (1<<31)
#define CS_ADR_MISALIGN (1<<30)
#define CS_BLOCK_LEN_ERROR (1<<29)
#define CS_ERASE_SEQ_ERROR (1<<28)
#define CS_ERASE_PARAM (1<<27)
#define CS_WP_VIOLATION (1<<26)
#define CS_CARD_IS_LOCKED (1<<25)
#define CS_LOCK_UNLOCK_ (1<<24)
#define CS_COM_CRC_ERROR (1<<23)
#define CS_ILLEGAL_COMMAND (1<<22)
#define CS_CARD_ECC_FAILED (1<<21)
#define CS_CARD_ERROR (1<<20)
#define CS_EXEC_ERROR (1<<19)
#define CS_UNDERRUN (1<<18)
#define CS_OVERRUN (1<<17)
#define CS_CIDCSD_OVERWRITE (1<<16)
#define CS_WP_ERASE_SKIP (1<<15)
#define CS_ERASE_RESET (1<<13)
#define CS_READY_FOR_DATA (1<<8)
#define CS_SWITCH_ERROR (1<<7)
#define CS_APP_CMD (1<<5)
//! SD bus width
#define SD_BUS_1_BIT MCI_BUS_SIZE_1_BIT
#define SD_BUS_4_BIT MCI_BUS_SIZE_4_BIT
#define SD_BUS_8_BIT MCI_BUS_SIZE_8_BIT
// MMC commands (taken from MMC reference)
#define MMC_GO_IDLE_STATE 0 ///< initialize card to SPI-type access
#define MMC_SEND_OP_COND 1 ///< set card operational mode
#define MMC_CMD2 2 ///< illegal in SPI mode !
#define MMC_SEND_CSD 9 ///< get card's CSD
#define MMC_SEND_CID 10 ///< get card's CID
#define MMC_SEND_STATUS 13
#define MMC_SET_BLOCKLEN 16 ///< Set number of bytes to transfer per block
#define MMC_READ_SINGLE_BLOCK 17 ///< read a block
#define MMC_WRITE_BLOCK 24 ///< write a block
#define MMC_PROGRAM_CSD 27
#define MMC_SET_WRITE_PROT 28
#define MMC_CLR_WRITE_PROT 29
#define MMC_SEND_WRITE_PROT 30
#define SD_TAG_WR_ERASE_GROUP_START 32
#define SD_TAG_WR_ERASE_GROUP_END 33
#define MMC_TAG_SECTOR_START 32
#define MMC_TAG_SECTOR_END 33
#define MMC_UNTAG_SECTOR 34
#define MMC_TAG_ERASE_GROUP_START 35 ///< Sets beginning of erase group (mass erase)
#define MMC_TAG_ERASE_GROUP_END 36 ///< Sets end of erase group (mass erase)
#define MMC_UNTAG_ERASE_GROUP 37 ///< Untag (unset) erase group (mass erase)
#define MMC_ERASE 38 ///< Perform block/mass erase
#define SD_SEND_OP_COND_ACMD 41 ///< Same as MMC_SEND_OP_COND but specific to SD (must be preceeded by CMD55)
#define MMC_LOCK_UNLOCK 42 ///< To start a lock/unlock/pwd operation
#define SD_APP_CMD55 55 ///< Use before any specific command (type ACMD)
#define MMC_CRC_ON_OFF 59 ///< Turns CRC check on/off
// R1 Response bit-defines
#define MMC_R1_BUSY 0x80 ///< R1 response: bit indicates card is busy
#define MMC_R1_PARAMETER 0x40
#define MMC_R1_ADDRESS 0x20
#define MMC_R1_ERASE_SEQ 0x10
#define MMC_R1_COM_CRC 0x08
#define MMC_R1_ILLEGAL_COM 0x04
#define MMC_R1_ERASE_RESET 0x02
#define MMC_R1_IDLE_STATE 0x01
// Data Start tokens
#define MMC_STARTBLOCK_READ 0xFE ///< when received from card, indicates that a block of data will follow
#define MMC_STARTBLOCK_WRITE 0xFE ///< when sent to card, indicates that a block of data will follow
#define MMC_STARTBLOCK_MWRITE 0xFC
// Data Stop tokens
#define MMC_STOPTRAN_WRITE 0xFD
// Data Error Token values
#define MMC_DE_MASK 0x1F
#define MMC_DE_ERROR 0x01
#define MMC_DE_CC_ERROR 0x02
#define MMC_DE_ECC_FAIL 0x04
#define MMC_DE_OUT_OF_RANGE 0x04
#define MMC_DE_CARD_LOCKED 0x04
// Data Response Token values
#define MMC_DR_MASK 0x1F
#define MMC_DR_ACCEPT 0x05
#define MMC_DR_REJECT_CRC 0x0B
#define MMC_DR_REJECT_WRITE_ERROR 0x0D
// Arguments of MMC_SWITCH command
#define MMC_SWITCH_WRITE ((U8)03)
#define MMC_SWITCH_BUS_WIDTH ((U8)183)
#define MMC_SWITCH_HIGH_SPEED ((U8)185)
#define MMC_SWITCH_CMD_SET ((U8)03)
#define MMC_SWITCH_VAL_LS ((U8)00)
#define MMC_SWITCH_VAL_HS ((U8)01)
#define MMC_SWITCH_VAL_1BIT ((U8)00)
#define MMC_SWITCH_VAL_4BIT ((U8)01)
#define MMC_SWITCH_VAL_8BIT ((U8)02)
// Arguments of MMC_LOCK_UNLOCK command
#define CMD_FULL_ERASE 0x08
#define CMD_UNLOCK 0x00
#define CMD_CLEAR 0x02
#define CMD_LOCK 0x01
/*_____ D E C L A R A T I O N ______________________________________________*/
typedef struct
{
union
{
unsigned int cardStatus;
struct
{
unsigned int outOfRange :1;
unsigned int addressserror :1;
unsigned int blockLenError :1;
unsigned int eraseSeqErro :1;
unsigned int eraseParam :1;
unsigned int wpViolation :1;
unsigned int cardIsLocked :1;
unsigned int lockUnlockFailed :1;
unsigned int comCrcError :1;
unsigned int illegalCommand :1;
unsigned int cardEccFailed :1;
unsigned int ccError :1;
unsigned int error :1;
unsigned int :2;
unsigned int csdOverwrite :1;
unsigned int wpEraseSkip :1;
unsigned int cardEccDisabled :1;
unsigned int eraseReset :1;
unsigned int currentState :4;
unsigned int readyForData :1;
unsigned int :2;
unsigned int appCmd :1;
unsigned int :1;
unsigned int akeSeqError :1;
unsigned int :3;
};
};
}card_status_t;
typedef struct
{
union
{
unsigned int ocr;
struct
{
unsigned int busy :1;
unsigned int ccs :1;
unsigned int :6;
unsigned int vRange :9;
unsigned int :15;
};
};
}ocr_t;
typedef struct
{
//CDS[0]
unsigned int csdStructure :2;
unsigned int :6;
unsigned int taac :8;
unsigned int nsac :8;
unsigned int tranSpeed :8;
//CSD[1]
unsigned int ccc :12;
unsigned int readBlLen :4;
unsigned int readBlePartial :1;
unsigned int writeBlkMisalign :1;
unsigned int readBlkMisalign :1;
unsigned int dsrImp :1;
unsigned int :2;
unsigned int deviceSizeH :10;
//CSD[2]
unsigned int deviceSizeL :2;
unsigned int vddRCurrMin :3;
unsigned int vddRCurrMax :3;
unsigned int vddWCurrMin :3;
unsigned int vddWCurrMax :3;
unsigned int cSizeMult :3;
unsigned int eraseBlkEn :1;
unsigned int sectorSize :7;
unsigned int wpGrpSize :7;
//CSD[3]
unsigned int wpGrpEnable :1;
unsigned int :2;
unsigned int r2wFactor :3;
unsigned int writeBlLen :4;
unsigned int writeBlPartial :1;
unsigned int :5;
unsigned int fileFormatGrp :1;
unsigned int copy :1;
unsigned int permWriteProtect :1;
unsigned int tmpWriteProtect :1;
unsigned int fileFormat :2;
unsigned int :2;
unsigned int crc :7;
unsigned int :1;
}csd_v1_t;
typedef struct
{
//CDS[0]
unsigned int csdStructure :2;
unsigned int :6;
unsigned int taac :8;
unsigned int nsac :8;
unsigned int tranSpeed :8;
//CSD[1]
unsigned int ccc :12;
unsigned int readBlLen :4;
unsigned int readBlePartial :1;
unsigned int writeBlkMisalign :1;
unsigned int readBlkMisalign :1;
unsigned int dsrImp :1;
unsigned int :6;
unsigned int deviceSizeH :6;
//CSD[2]
unsigned int deviceSizeL :16;
unsigned int :1;
unsigned int eraseBlkEn :1;
unsigned int sectorSize :7;
unsigned int wpGrpSize :7;
//CSD[3]
unsigned int wpGrpEnable :1;
unsigned int :2;
unsigned int r2wFactor :3;
unsigned int writeBlLen :4;
unsigned int writeBlPartial :1;
unsigned int :5;
unsigned int fileFormatGrp :1;
unsigned int copy :1;
unsigned int permWriteProtect :1;
unsigned int tmpWriteProtect :1;
unsigned int fileFormat :2;
unsigned int :2;
unsigned int crc :7;
unsigned int :1;
}csd_v2_t;
typedef struct
{
union
{
unsigned int csd[4];
union
{
csd_v1_t csd_v1;
csd_v2_t csd_v2;
};
};
}csd_t;
typedef struct
{
union
{
unsigned int cid[4];
struct
{
unsigned int mid :8; // Manufacturer ID
unsigned int oid :16; // OEM/Application ID
unsigned int pnmh :32; // Product name high bits
unsigned int pnml :8; // Product name low bits
unsigned int prv :8; // Product revision
unsigned int psn :32; // Product serial number
unsigned int :4;
unsigned int mdt :12; // Manufacturing date
unsigned int crc :7; // CRC7 Checksum
unsigned int :1;
};
};
}cid_t;
typedef struct
{
union
{
unsigned int rep1[2];
struct
{
unsigned int startBit :1;
unsigned int transBit :1;
unsigned int cmdIndex :6;
card_status_t cardStatus;
unsigned int crc7 :6;
unsigned int endBit :1;
unsigned int pad :16;
};
};
}rep1_t;
typedef struct
{
union
{
unsigned int rep2[5];
struct
{
union
{
cid_t cid;
csd_t csd;
};
unsigned int endBit :1;
unsigned int pad :32;
};
};
}rep2_t;
typedef struct
{
union
{
unsigned int rep3[2];
struct
{
unsigned int startBit :1;
unsigned int transBit :1;
unsigned int :6;
ocr_t ocr;
unsigned int :7;
unsigned int endBit :1;
unsigned int pad :16;
};
};
}rep3_t;
//_____ D E C L A R A T I O N S ____________________________________________
/*! \name Control Functions
*/
//! @{
/*! \brief Initializes the MCI driver.
*
* \param card_slot Card slot number.
* \param pbb_hz MCI module input clock frequency (PBA clock, Hz).
* \param cpu_hz CPU clock, Hz.
*
* \retval OK Success.
* \retval KO Failure.
*/
extern Bool sd_mmc_mci_init(unsigned char card_slot, long pbb_hz, long cpu_hz);
/*! \brief Initializes the SD/MMC card.
*
* \param card_slot Card slot number.
*
* \retval OK Success.
* \retval KO Failure.
*/
extern Bool sd_mmc_mci_card_init(unsigned char card_slot);
/*! \brief Performs a card check presence.
*
* \param slot SD/MMC Slot Card Selected.
* \retval TRUE Card Present
* \retval FALSE Card Unpresent.
*/
extern Bool is_sd_mmc_mci_card_present(U8 slot);
/*! \brief Performs a card check protection.
*
* \param slot SD/MMC Slot Card Selected.
* \retval TRUE Card Protected
* \retval FALSE Card Unprotected.
*/
extern Bool is_sd_mmc_mci_card_protected(U8 slot);
/*! \brief Performs a memory check.
*
* \param slot SD/MMC Slot Card Selected.
* \retval OK Success.
* \retval KO Failure.
*/
extern Bool sd_mmc_mci_mem_check(U8 slot);
/*! \brief Opens a DF memory in read mode at a given sector.
*
* \param slot SD/MMC Slot Card Selected.
* \param sector Start sector.
* \param nb_sector Number of sector.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note Sector may be page-unaligned (depending on the DF page size).
*/
extern Bool sd_mmc_mci_read_open(U8 slot, U32 sector, U16 nb_sector);
/*! \brief Opens a DF memory in read mode at a given sector. DMA will be used.
*
* \param slot SD/MMC Slot Card Selected.
* \param sector Start sector.
* \param ram pointer on ram buffer.
* \param nb_sector Number of sector.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note Sector may be page-unaligned (depending on the DF page size).
*/
extern Bool sd_mmc_mci_dma_read_open(U8 slot, U32 sector, void* ram, U16 nb_sector );
/*! \brief Unselects the current DF memory.
* \param slot SD/MMC Slot Card Selected.
*
* \retval OK Success.
* \retval KO Failure.
*/
extern Bool sd_mmc_mci_read_close(U8 slot);
/*! \brief This function opens a DF memory in write mode at a given sector.
*
* \param slot SD/MMC Slot Card Selected.
* \param sector Start sector.
* \param nb_sector Number of sector.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note Sector may be page-unaligned (depending on the SD/MMC page size).
*
*/
extern Bool sd_mmc_mci_write_open(U8 slot, U32 sector, U16 nb_sector);
/*! \brief This function opens a DF memory in write mode at a given sector. DMA will be used.
*
* \param slot SD/MMC Slot Card Selected.
* \param sector Start sector.
* \param nb_sector Number of sector.
* \param ram pointer on ram buffer.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note Sector may be page-unaligned (depending on the SD/MMC page size).
*
*/
extern Bool sd_mmc_mci_dma_write_open(U8 slot, U32 sector, const void* ram, U16 nb_sector);
/*! \brief Fills the end of the current logical sector and launches page programming.
* \param slot SD/MMC Slot Card Selected.
*
* \retval OK Success.
* \retval KO Failure.
*/
extern Bool sd_mmc_mci_write_close(U8 slot);
//! @}
/*! \name Multiple-Sector Access Functions
*/
//! @{
/*! \brief Reads \a nb_sector sectors from DF memory.
*
* Data flow is: SD/MMC -> callback.
*
* \param slot SD/MMC Slot Card Selected.
* \param nb_sector Number of contiguous sectors to read.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note First call must be preceded by a call to the \ref sd_mmc_mci_read_open
* function.
*
*/
extern Bool sd_mmc_mci_read_multiple_sector(U8 slot, U16 nb_sector);
/*! \brief Callback function invoked after each sector read during
* \ref sd_mmc_mci_read_multiple_sector.
*
* \param psector Pointer to read sector.
*/
extern void sd_mmc_mci_read_multiple_sector_callback(const void *psector);
/*! \brief Writes \a nb_sector sectors to SD/MMC memory.
*
* Data flow is: callback -> SD/MMC.
*
* \param slot SD/MMC Slot Card Selected.
* \param nb_sector Number of contiguous sectors to write.
*
* \retval OK Success.
* \retval KO Failure.
*
* \note First call must be preceded by a call to the \ref sd_mmc_mci_write_open
* function.
*
*/
extern Bool sd_mmc_mci_write_multiple_sector(U8 slot, U16 nb_sector);
/*! \brief Callback function invoked before each sector write during
* \ref sd_mmc_mci_write_multiple_sector.
*
* \param psector Pointer to sector to write.
*/
extern void sd_mmc_mci_write_multiple_sector_callback(void *psector);
/*! \brief Reads nb_sector SD/MMC sector to a RAM buffer.
*
* Data flow is: SD/MMC -> RAM.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
* \param nb_sector Number of sector to read.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_read_multiple_sector_2_ram(U8 slot, void *ram, U32 nb_sector);
/*! \brief Reads nb_sector SD/MMC sector to a RAM buffer, using the DMA.
*
* Data flow is: SD/MMC -> RAM.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
* \param nb_sector Number of sector to read.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_dma_read_multiple_sector_2_ram(U8 slot, void *ram, U32 nb_sector);
/*! \brief Writes nb_sector SD/MMC sector from a RAM buffer.
*
* Data flow is: RAM -> SD/MMC.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
* \param nb_sector Number of sector to write.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_write_multiple_sector_from_ram(U8 slot, const void *ram, U32 nb_sector);
/*! \brief Writes nb_sector SD/MMC sector from a RAM buffer, using the DMA.
*
* Data flow is: RAM -> SD/MMC.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
* \param nb_sector Number of sector to write.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_dma_write_multiple_sector_from_ram(U8 slot, const void *ram, U32 nb_sector);
//! @}
/*! \name Single-Sector Access Functions
*/
//! @{
/*! \brief Reads 1 SD/MMC sector to a RAM buffer.
*
* Data flow is: SD/MMC -> RAM.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_read_sector_2_ram(U8 slot, void *ram);
/*! \brief Reads 1 SD/MMC sector to a RAM buffer, using the DMA.
*
* Data flow is: SD/MMC -> RAM.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_dma_read_sector_2_ram(U8 slot, void *ram);
/*! \brief Writes 1 SD/MMC sector from a RAM buffer.
*
* Data flow is: RAM -> SD/MMC.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_write_sector_from_ram(U8 slot, const void *ram);
/*! \brief Writes 1 SD/MMC sector from a RAM buffer, using the DMA.
*
* Data flow is: RAM -> SD/MMC.
*
* \param slot SD/MMC Slot Card Selected.
* \param ram Pointer to RAM buffer.
*
* \retval OK Success.
* \retval KO Failure.
*
*/
extern Bool sd_mmc_mci_dma_write_sector_from_ram(U8 slot, const void *ram);
//! @}
/*! \name Protection Access Functions
*/
//! @{
/*! \brief This function sends lock/unlock commands for sd or mmc.
*
* \param slot SD/MMC Slot Card Selected.
* \param cmd CMD_FULL_ERASE ; CMD_LOCK ; CMD_UNLOCK..
* \param pwd_len password length in bytes (limited to 253).
* \param password the password content.
*
*
* \retval TRUE Command successfull.
* \retval FALSE Command failed.
*
*/
extern Bool sd_mmc_mci_lock_unlock (U8 slot, U8 cmd, U8 pwd_len, U8 * password);
/*! \brief Get sd status register and look if card is locked by a password.
*
* \param slot SD/MMC Slot Card Selected.
*
* \retval TRUE Card is locked.
* \retval FALSE Card is unlocked.
*
*/
extern Bool is_sd_mmc_mci_locked(U8 slot);
/*! \brief Get sd status register and look if the lock/unlock command was ok.
*
* \param slot SD/MMC Slot Card Selected.
*
* \retval TRUE Lock/Unlock failed.
* \retval FALSE Lock/Unlock was successfull.
*
*/
extern Bool sd_mmc_mci_lock_unlock_failed(U8 slot);
/*! \brief ask mmc status register.
*
* \param slot SD/MMC Slot Card Selected.
*
* \retval TRUE Success.
* \retval FALSE Failure.
*
*/
extern Bool sd_mmc_mci_cmd_send_status(U8 slot);
//! @}
#endif // _SD_MMC_MCI_H_