The wait in mci_WaitForEvent will delay all card transactions.

Dependencies:   FATFileSystem

Fork of EALib by EmbeddedArtists AB

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MCIFileSystem.h Source File

MCIFileSystem.h

00001 #ifndef MCIFILESYSTEM_H
00002 #define MCIFILESYSTEM_H
00003 
00004 #include "mbed.h"
00005 #include "FATFileSystem.h"
00006 
00007 /** Access the filesystem on an SD Card using MCI
00008  *
00009  * @code
00010  * #include "mbed.h"
00011  * #include "MCIFileSystem.h"
00012  *
00013  * MCIFileSystem mcifs("mci");
00014  *
00015  * int main() {
00016  *     printf("Please insert a SD/MMC card\n");
00017  *     while(!mcifs.cardInserted()) {
00018  *         wait(0.5);
00019  *     }
00020  *     
00021  *     printf("Found SD/MMC card, writing to /mci/myfile.txt ...\n");
00022  *     
00023  *     FILE *fp = fopen("/mci/myfile.txt", "w");
00024  *     if (fp != NULL) {
00025  *         fprintf(fp, "Hello World!\n");
00026  *         fclose(fp);
00027  *         printf("Wrote to /mci/myfile.txt\n");
00028  *     } else {
00029  *         printf("Failed to open /mci/myfile.txt\n");
00030  *     }
00031  * }
00032  * @endcode
00033  */
00034 class MCIFileSystem : public FATFileSystem {
00035 public:
00036 
00037     /** Create the File System for accessing an SD/MMC Card using MCI
00038      *
00039      * @param name The name used to access the virtual filesystem
00040      * @param cd   The pin connected to the CardDetect line
00041      */
00042     MCIFileSystem(const char* name, PinName cd = p38);
00043 
00044     virtual ~MCIFileSystem();
00045 
00046     virtual int disk_initialize();
00047     virtual int disk_status();
00048     virtual int disk_read(uint8_t * buffer, uint64_t block_number);
00049     virtual int disk_write(const uint8_t * buffer, uint64_t block_number);
00050     virtual int disk_sync();
00051     virtual uint64_t disk_sectors();
00052 
00053     void mci_MCIIRQHandler();
00054     void mci_DMAIRQHandler();
00055 
00056     /** Tests if a SD/MMC card is inserted or not.
00057      *
00058      * @returns
00059      *   True if a card has been inserted,
00060      *   False if no card is inserted or if the card detect pin is unavailable
00061      */
00062     bool cardInserted() const;
00063 
00064 private:
00065 
00066     typedef enum {
00067       CardStatusNumBytes = 4,
00068     } Constants;
00069 
00070     typedef enum {
00071       PowerOff = 0,
00072       PowerUp = 2,
00073       PowerOn = 3,
00074     } power_ctrl_t;
00075 
00076     typedef enum {
00077       SDMMC_IDLE_ST = 0, /*!< Idle state */
00078       SDMMC_READY_ST,    /*!< Ready state */
00079       SDMMC_IDENT_ST,    /*!< Identification State */
00080       SDMMC_STBY_ST,     /*!< standby state */
00081       SDMMC_TRAN_ST,     /*!< transfer state */
00082       SDMMC_DATA_ST,     /*!< Sending-data State */
00083       SDMMC_RCV_ST,      /*!< Receive-data State */
00084       SDMMC_PRG_ST,      /*!< Programming State */
00085       SDMMC_DIS_ST       /*!< Disconnect State */
00086     } CardState;
00087 
00088 
00089     typedef struct {
00090       uint8_t CmdIndex;
00091       uint32_t Data[CardStatusNumBytes];
00092     } response_t;
00093 
00094     /**
00095      * @brief SDC Clock Control Options
00096      */
00097     typedef enum {
00098       SDC_CLOCK_ENABLE         =  8, /*!< Enable SD Card Bus Clock */
00099       SDC_CLOCK_POWER_SAVE     =  9, /*!< Disable SD_CLK output when bus is idle */
00100       SDC_CLOCK_DIVIDER_BYPASS = 10, /*!< Enable bypass of clock divide logic */
00101       SDC_CLOCK_WIDEBUS_MODE   = 11, /*!< Enable wide bus mode (SD_DAT[3:0] is used instead of SD_DAT[0]) */
00102     } ClockControl;
00103 
00104     /**
00105      * @brief SD/MMC Card specific setup data structure
00106      */
00107     typedef struct {
00108       uint32_t response[4];        /*!< Most recent response */
00109       uint32_t cid[4];             /*!< CID of acquired card  */
00110       uint32_t csd[4];             /*!< CSD of acquired card */
00111       uint32_t ext_csd[512 / 4];   /*!< Ext CSD */
00112       uint32_t card_type;          /*!< Card Type */
00113       uint16_t rca;                /*!< Relative address assigned to card */
00114       uint32_t speed;              /*!< Speed */
00115       uint32_t block_len;          /*!< Card sector size */
00116       uint32_t device_size;        /*!< Device Size */
00117       uint32_t blocknr;            /*!< Block Number */
00118       uint32_t clk_rate;           /*!< Clock rate */
00119     } SDMMC_CARD_T;
00120 
00121     typedef enum {
00122       SDC_RET_OK             =  0,
00123       SDC_RET_CMD_FAILED     = -1,
00124       SDC_RET_BAD_PARAMETERS = -2,
00125       SDC_RET_BUS_NOT_IDLE   = -3,
00126       SDC_RET_TIMEOUT        = -4,
00127       SDC_RET_ERR_STATE      = -5,
00128       SDC_RET_NOT_READY      = -6,
00129       SDC_RET_FAILED         = -7,
00130     } ReturnCode;
00131 
00132     void initMCI();
00133 
00134     int32_t     mci_Acquire();
00135     uint32_t    mci_GetCardStatus() const;
00136     CardState   mci_GetCardState() const;
00137     ReturnCode  mci_ReadBlocks(void *buffer, int32_t startBlock, int32_t blockNum);
00138     ReturnCode  mci_WriteBlocks(void *buffer, int32_t startBlock, int32_t blockNum);
00139     void        mci_SetClock(uint32_t freq) const;
00140     void        mci_ClockControl(ClockControl ctrlType, bool enable) const;
00141     void        mci_PowerControl(power_ctrl_t powerMode, uint32_t flag) const;
00142     ReturnCode  mci_ExecuteCmd(uint32_t Command, uint32_t Arg, response_t* pResp) const;
00143     ReturnCode  mci_SendIfCond() const;
00144     ReturnCode  mci_SendOpCond(uint32_t *pOCR) const;
00145     ReturnCode  mci_SendAppOpCond(uint16_t rca, bool hcs, uint32_t *pOcr, bool *pCCS) const;
00146     ReturnCode  mci_GetCID(uint32_t *pCID) const;
00147     ReturnCode  mci_SetAddr(uint16_t addr) const;
00148     ReturnCode  mci_GetAddr(uint16_t *pRCA) const;
00149     ReturnCode  mci_GetCSD(uint16_t rca, uint32_t *pCSD) const;
00150     ReturnCode  mci_SelectCard(uint16_t addr) const;
00151     ReturnCode  mci_GetStatus(uint16_t rca, uint32_t *pStatus) const;
00152     void        mci_ProcessCSD();
00153     ReturnCode  mci_SetBusWidth(uint16_t rca, uint8_t width) const;
00154     ReturnCode  mci_SetTranState(uint16_t rca) const;
00155     ReturnCode  mci_SetBlockLength(uint32_t rca, uint32_t block_len) const;
00156     ReturnCode  mci_SetCardParams() const;
00157     ReturnCode  mci_StopTransmission(uint32_t rca) const;
00158     bool        mci_CheckR1Response(uint32_t resp, ReturnCode* pCheckResult) const;
00159     void        mci_WriteDelay() const;
00160     ReturnCode  mci_SendCmd(uint32_t Command, uint32_t Arg, uint32_t timeout) const;
00161     ReturnCode  mci_SendAppCmd(uint16_t rca) const;
00162     void        mci_SetDataTransfer(uint16_t BlockNum, bool DirFromCard, uint32_t Timeout) const;
00163     void        mci_GetResp(response_t* pResp) const;
00164     uint32_t    mci_GetBits(int32_t start, int32_t end, uint32_t *data) const;
00165     void        mci_SetCommand(uint32_t Cmd, uint32_t Arg) const;
00166     void        mci_ResetCommand() const;
00167     int32_t     mci_IRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt);
00168     int32_t     mci_FIFOIRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt);
00169     void        mci_ReadFIFO(uint32_t *pDst, bool bFirstHalf) const;
00170     void        mci_WriteFIFO(uint32_t *pSrc, bool bFirstHalf) const;
00171                 
00172     void        mci_SetupEventWakeup(uint8_t dmaChannel);
00173     uint32_t    mci_WaitForEvent() const;
00174 
00175     ReturnCode _readBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const;
00176     ReturnCode _writeBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const;
00177 
00178 
00179     uint32_t _Stat;
00180     SDMMC_CARD_T _sdCardInfo;
00181 
00182     DigitalIn* _cardDetect;
00183 
00184     uint8_t _eventDmaChannel;    /*!< DMA Channel used for transfer data */
00185     volatile bool _eventReceived;
00186     volatile bool _eventSuccess;
00187 };
00188 
00189 #endif
00190