The wait in mci_WaitForEvent will delay all card transactions.
Fork of EALib by
MCIFileSystem.h@0:0fdadbc3d852, 2013-09-26 (annotated)
- Committer:
- embeddedartists
- Date:
- Thu Sep 26 06:37:02 2013 +0000
- Revision:
- 0:0fdadbc3d852
- Child:
- 3:9d31a3c5013e
First version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
embeddedartists | 0:0fdadbc3d852 | 1 | #ifndef MCIFILESYSTEM_H |
embeddedartists | 0:0fdadbc3d852 | 2 | #define MCIFILESYSTEM_H |
embeddedartists | 0:0fdadbc3d852 | 3 | |
embeddedartists | 0:0fdadbc3d852 | 4 | #include "mbed.h" |
embeddedartists | 0:0fdadbc3d852 | 5 | #include "FATFileSystem.h" |
embeddedartists | 0:0fdadbc3d852 | 6 | |
embeddedartists | 0:0fdadbc3d852 | 7 | /** Access the filesystem on an SD Card using MCI |
embeddedartists | 0:0fdadbc3d852 | 8 | * |
embeddedartists | 0:0fdadbc3d852 | 9 | * @code |
embeddedartists | 0:0fdadbc3d852 | 10 | * #include "mbed.h" |
embeddedartists | 0:0fdadbc3d852 | 11 | * #include "MCIFileSystem.h" |
embeddedartists | 0:0fdadbc3d852 | 12 | * |
embeddedartists | 0:0fdadbc3d852 | 13 | * MCIFileSystem mcifs("mci"); |
embeddedartists | 0:0fdadbc3d852 | 14 | * |
embeddedartists | 0:0fdadbc3d852 | 15 | * int main() { |
embeddedartists | 0:0fdadbc3d852 | 16 | * printf("Please insert a SD/MMC card\n"); |
embeddedartists | 0:0fdadbc3d852 | 17 | * while(!mcifs.cardInserted()) { |
embeddedartists | 0:0fdadbc3d852 | 18 | * wait(0.5); |
embeddedartists | 0:0fdadbc3d852 | 19 | * } |
embeddedartists | 0:0fdadbc3d852 | 20 | * |
embeddedartists | 0:0fdadbc3d852 | 21 | * FILE *fp = fopen("/mci/myfile.txt", "w"); |
embeddedartists | 0:0fdadbc3d852 | 22 | * if (fp != NULL) { |
embeddedartists | 0:0fdadbc3d852 | 23 | * fprintf(fp, "Hello World!\n"); |
embeddedartists | 0:0fdadbc3d852 | 24 | * fclose(fp); |
embeddedartists | 0:0fdadbc3d852 | 25 | * } |
embeddedartists | 0:0fdadbc3d852 | 26 | * } |
embeddedartists | 0:0fdadbc3d852 | 27 | * @endcode |
embeddedartists | 0:0fdadbc3d852 | 28 | */ |
embeddedartists | 0:0fdadbc3d852 | 29 | class MCIFileSystem : public FATFileSystem { |
embeddedartists | 0:0fdadbc3d852 | 30 | public: |
embeddedartists | 0:0fdadbc3d852 | 31 | |
embeddedartists | 0:0fdadbc3d852 | 32 | /** Create the File System for accessing an SD/MMC Card using MCI |
embeddedartists | 0:0fdadbc3d852 | 33 | * |
embeddedartists | 0:0fdadbc3d852 | 34 | * @param name The name used to access the virtual filesystem |
embeddedartists | 0:0fdadbc3d852 | 35 | * @param cd The pin connected to the CardDetect line |
embeddedartists | 0:0fdadbc3d852 | 36 | */ |
embeddedartists | 0:0fdadbc3d852 | 37 | MCIFileSystem(const char* name, PinName cd = p38); |
embeddedartists | 0:0fdadbc3d852 | 38 | |
embeddedartists | 0:0fdadbc3d852 | 39 | virtual ~MCIFileSystem(); |
embeddedartists | 0:0fdadbc3d852 | 40 | |
embeddedartists | 0:0fdadbc3d852 | 41 | virtual int disk_initialize(); |
embeddedartists | 0:0fdadbc3d852 | 42 | virtual int disk_status(); |
embeddedartists | 0:0fdadbc3d852 | 43 | virtual int disk_read(uint8_t * buffer, uint64_t block_number); |
embeddedartists | 0:0fdadbc3d852 | 44 | virtual int disk_write(const uint8_t * buffer, uint64_t block_number); |
embeddedartists | 0:0fdadbc3d852 | 45 | virtual int disk_sync(); |
embeddedartists | 0:0fdadbc3d852 | 46 | virtual uint64_t disk_sectors(); |
embeddedartists | 0:0fdadbc3d852 | 47 | |
embeddedartists | 0:0fdadbc3d852 | 48 | void mci_MCIIRQHandler(); |
embeddedartists | 0:0fdadbc3d852 | 49 | void mci_DMAIRQHandler(); |
embeddedartists | 0:0fdadbc3d852 | 50 | |
embeddedartists | 0:0fdadbc3d852 | 51 | /** Tests if a SD/MMC card is inserted or not. |
embeddedartists | 0:0fdadbc3d852 | 52 | * |
embeddedartists | 0:0fdadbc3d852 | 53 | * @returns |
embeddedartists | 0:0fdadbc3d852 | 54 | * True if a card has been inserted, |
embeddedartists | 0:0fdadbc3d852 | 55 | * False if no card is inserted or if the card detect pin is unavailable |
embeddedartists | 0:0fdadbc3d852 | 56 | */ |
embeddedartists | 0:0fdadbc3d852 | 57 | bool cardInserted() const; |
embeddedartists | 0:0fdadbc3d852 | 58 | |
embeddedartists | 0:0fdadbc3d852 | 59 | private: |
embeddedartists | 0:0fdadbc3d852 | 60 | |
embeddedartists | 0:0fdadbc3d852 | 61 | typedef enum { |
embeddedartists | 0:0fdadbc3d852 | 62 | CardStatusNumBytes = 4, |
embeddedartists | 0:0fdadbc3d852 | 63 | } Constants; |
embeddedartists | 0:0fdadbc3d852 | 64 | |
embeddedartists | 0:0fdadbc3d852 | 65 | typedef enum { |
embeddedartists | 0:0fdadbc3d852 | 66 | PowerOff = 0, |
embeddedartists | 0:0fdadbc3d852 | 67 | PowerUp = 2, |
embeddedartists | 0:0fdadbc3d852 | 68 | PowerOn = 3, |
embeddedartists | 0:0fdadbc3d852 | 69 | } power_ctrl_t; |
embeddedartists | 0:0fdadbc3d852 | 70 | |
embeddedartists | 0:0fdadbc3d852 | 71 | typedef enum { |
embeddedartists | 0:0fdadbc3d852 | 72 | SDMMC_IDLE_ST = 0, /*!< Idle state */ |
embeddedartists | 0:0fdadbc3d852 | 73 | SDMMC_READY_ST, /*!< Ready state */ |
embeddedartists | 0:0fdadbc3d852 | 74 | SDMMC_IDENT_ST, /*!< Identification State */ |
embeddedartists | 0:0fdadbc3d852 | 75 | SDMMC_STBY_ST, /*!< standby state */ |
embeddedartists | 0:0fdadbc3d852 | 76 | SDMMC_TRAN_ST, /*!< transfer state */ |
embeddedartists | 0:0fdadbc3d852 | 77 | SDMMC_DATA_ST, /*!< Sending-data State */ |
embeddedartists | 0:0fdadbc3d852 | 78 | SDMMC_RCV_ST, /*!< Receive-data State */ |
embeddedartists | 0:0fdadbc3d852 | 79 | SDMMC_PRG_ST, /*!< Programming State */ |
embeddedartists | 0:0fdadbc3d852 | 80 | SDMMC_DIS_ST /*!< Disconnect State */ |
embeddedartists | 0:0fdadbc3d852 | 81 | } CardState; |
embeddedartists | 0:0fdadbc3d852 | 82 | |
embeddedartists | 0:0fdadbc3d852 | 83 | |
embeddedartists | 0:0fdadbc3d852 | 84 | typedef struct { |
embeddedartists | 0:0fdadbc3d852 | 85 | uint8_t CmdIndex; |
embeddedartists | 0:0fdadbc3d852 | 86 | uint32_t Data[CardStatusNumBytes]; |
embeddedartists | 0:0fdadbc3d852 | 87 | } response_t; |
embeddedartists | 0:0fdadbc3d852 | 88 | |
embeddedartists | 0:0fdadbc3d852 | 89 | /** |
embeddedartists | 0:0fdadbc3d852 | 90 | * @brief SDC Clock Control Options |
embeddedartists | 0:0fdadbc3d852 | 91 | */ |
embeddedartists | 0:0fdadbc3d852 | 92 | typedef enum { |
embeddedartists | 0:0fdadbc3d852 | 93 | SDC_CLOCK_ENABLE = 8, /*!< Enable SD Card Bus Clock */ |
embeddedartists | 0:0fdadbc3d852 | 94 | SDC_CLOCK_POWER_SAVE = 9, /*!< Disable SD_CLK output when bus is idle */ |
embeddedartists | 0:0fdadbc3d852 | 95 | SDC_CLOCK_DIVIDER_BYPASS = 10, /*!< Enable bypass of clock divide logic */ |
embeddedartists | 0:0fdadbc3d852 | 96 | SDC_CLOCK_WIDEBUS_MODE = 11, /*!< Enable wide bus mode (SD_DAT[3:0] is used instead of SD_DAT[0]) */ |
embeddedartists | 0:0fdadbc3d852 | 97 | } ClockControl; |
embeddedartists | 0:0fdadbc3d852 | 98 | |
embeddedartists | 0:0fdadbc3d852 | 99 | /** |
embeddedartists | 0:0fdadbc3d852 | 100 | * @brief SD/MMC Card specific setup data structure |
embeddedartists | 0:0fdadbc3d852 | 101 | */ |
embeddedartists | 0:0fdadbc3d852 | 102 | typedef struct { |
embeddedartists | 0:0fdadbc3d852 | 103 | uint32_t response[4]; /*!< Most recent response */ |
embeddedartists | 0:0fdadbc3d852 | 104 | uint32_t cid[4]; /*!< CID of acquired card */ |
embeddedartists | 0:0fdadbc3d852 | 105 | uint32_t csd[4]; /*!< CSD of acquired card */ |
embeddedartists | 0:0fdadbc3d852 | 106 | uint32_t ext_csd[512 / 4]; /*!< Ext CSD */ |
embeddedartists | 0:0fdadbc3d852 | 107 | uint32_t card_type; /*!< Card Type */ |
embeddedartists | 0:0fdadbc3d852 | 108 | uint16_t rca; /*!< Relative address assigned to card */ |
embeddedartists | 0:0fdadbc3d852 | 109 | uint32_t speed; /*!< Speed */ |
embeddedartists | 0:0fdadbc3d852 | 110 | uint32_t block_len; /*!< Card sector size */ |
embeddedartists | 0:0fdadbc3d852 | 111 | uint32_t device_size; /*!< Device Size */ |
embeddedartists | 0:0fdadbc3d852 | 112 | uint32_t blocknr; /*!< Block Number */ |
embeddedartists | 0:0fdadbc3d852 | 113 | uint32_t clk_rate; /*!< Clock rate */ |
embeddedartists | 0:0fdadbc3d852 | 114 | } SDMMC_CARD_T; |
embeddedartists | 0:0fdadbc3d852 | 115 | |
embeddedartists | 0:0fdadbc3d852 | 116 | typedef enum { |
embeddedartists | 0:0fdadbc3d852 | 117 | SDC_RET_OK = 0, |
embeddedartists | 0:0fdadbc3d852 | 118 | SDC_RET_CMD_FAILED = -1, |
embeddedartists | 0:0fdadbc3d852 | 119 | SDC_RET_BAD_PARAMETERS = -2, |
embeddedartists | 0:0fdadbc3d852 | 120 | SDC_RET_BUS_NOT_IDLE = -3, |
embeddedartists | 0:0fdadbc3d852 | 121 | SDC_RET_TIMEOUT = -4, |
embeddedartists | 0:0fdadbc3d852 | 122 | SDC_RET_ERR_STATE = -5, |
embeddedartists | 0:0fdadbc3d852 | 123 | SDC_RET_NOT_READY = -6, |
embeddedartists | 0:0fdadbc3d852 | 124 | SDC_RET_FAILED = -7, |
embeddedartists | 0:0fdadbc3d852 | 125 | } ReturnCode; |
embeddedartists | 0:0fdadbc3d852 | 126 | |
embeddedartists | 0:0fdadbc3d852 | 127 | void initMCI(); |
embeddedartists | 0:0fdadbc3d852 | 128 | |
embeddedartists | 0:0fdadbc3d852 | 129 | int32_t mci_Acquire(); |
embeddedartists | 0:0fdadbc3d852 | 130 | uint32_t mci_GetCardStatus() const; |
embeddedartists | 0:0fdadbc3d852 | 131 | CardState mci_GetCardState() const; |
embeddedartists | 0:0fdadbc3d852 | 132 | ReturnCode mci_ReadBlocks(void *buffer, int32_t startBlock, int32_t blockNum); |
embeddedartists | 0:0fdadbc3d852 | 133 | ReturnCode mci_WriteBlocks(void *buffer, int32_t startBlock, int32_t blockNum); |
embeddedartists | 0:0fdadbc3d852 | 134 | void mci_SetClock(uint32_t freq) const; |
embeddedartists | 0:0fdadbc3d852 | 135 | void mci_ClockControl(ClockControl ctrlType, bool enable) const; |
embeddedartists | 0:0fdadbc3d852 | 136 | void mci_PowerControl(power_ctrl_t powerMode, uint32_t flag) const; |
embeddedartists | 0:0fdadbc3d852 | 137 | ReturnCode mci_ExecuteCmd(uint32_t Command, uint32_t Arg, response_t* pResp) const; |
embeddedartists | 0:0fdadbc3d852 | 138 | ReturnCode mci_SendIfCond() const; |
embeddedartists | 0:0fdadbc3d852 | 139 | ReturnCode mci_SendOpCond(uint32_t *pOCR) const; |
embeddedartists | 0:0fdadbc3d852 | 140 | ReturnCode mci_SendAppOpCond(uint16_t rca, bool hcs, uint32_t *pOcr, bool *pCCS) const; |
embeddedartists | 0:0fdadbc3d852 | 141 | ReturnCode mci_GetCID(uint32_t *pCID) const; |
embeddedartists | 0:0fdadbc3d852 | 142 | ReturnCode mci_SetAddr(uint16_t addr) const; |
embeddedartists | 0:0fdadbc3d852 | 143 | ReturnCode mci_GetAddr(uint16_t *pRCA) const; |
embeddedartists | 0:0fdadbc3d852 | 144 | ReturnCode mci_GetCSD(uint16_t rca, uint32_t *pCSD) const; |
embeddedartists | 0:0fdadbc3d852 | 145 | ReturnCode mci_SelectCard(uint16_t addr) const; |
embeddedartists | 0:0fdadbc3d852 | 146 | ReturnCode mci_GetStatus(uint16_t rca, uint32_t *pStatus) const; |
embeddedartists | 0:0fdadbc3d852 | 147 | void mci_ProcessCSD(); |
embeddedartists | 0:0fdadbc3d852 | 148 | ReturnCode mci_SetBusWidth(uint16_t rca, uint8_t width) const; |
embeddedartists | 0:0fdadbc3d852 | 149 | ReturnCode mci_SetTranState(uint16_t rca) const; |
embeddedartists | 0:0fdadbc3d852 | 150 | ReturnCode mci_SetBlockLength(uint32_t rca, uint32_t block_len) const; |
embeddedartists | 0:0fdadbc3d852 | 151 | ReturnCode mci_SetCardParams() const; |
embeddedartists | 0:0fdadbc3d852 | 152 | ReturnCode mci_StopTransmission(uint32_t rca) const; |
embeddedartists | 0:0fdadbc3d852 | 153 | bool mci_CheckR1Response(uint32_t resp, ReturnCode* pCheckResult) const; |
embeddedartists | 0:0fdadbc3d852 | 154 | void mci_WriteDelay() const; |
embeddedartists | 0:0fdadbc3d852 | 155 | ReturnCode mci_SendCmd(uint32_t Command, uint32_t Arg, uint32_t timeout) const; |
embeddedartists | 0:0fdadbc3d852 | 156 | ReturnCode mci_SendAppCmd(uint16_t rca) const; |
embeddedartists | 0:0fdadbc3d852 | 157 | void mci_SetDataTransfer(uint16_t BlockNum, bool DirFromCard, uint32_t Timeout) const; |
embeddedartists | 0:0fdadbc3d852 | 158 | void mci_GetResp(response_t* pResp) const; |
embeddedartists | 0:0fdadbc3d852 | 159 | uint32_t mci_GetBits(int32_t start, int32_t end, uint32_t *data) const; |
embeddedartists | 0:0fdadbc3d852 | 160 | void mci_SetCommand(uint32_t Cmd, uint32_t Arg) const; |
embeddedartists | 0:0fdadbc3d852 | 161 | void mci_ResetCommand() const; |
embeddedartists | 0:0fdadbc3d852 | 162 | int32_t mci_IRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt); |
embeddedartists | 0:0fdadbc3d852 | 163 | int32_t mci_FIFOIRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt); |
embeddedartists | 0:0fdadbc3d852 | 164 | void mci_ReadFIFO(uint32_t *pDst, bool bFirstHalf) const; |
embeddedartists | 0:0fdadbc3d852 | 165 | void mci_WriteFIFO(uint32_t *pSrc, bool bFirstHalf) const; |
embeddedartists | 0:0fdadbc3d852 | 166 | |
embeddedartists | 0:0fdadbc3d852 | 167 | void mci_SetupEventWakeup(uint8_t dmaChannel); |
embeddedartists | 0:0fdadbc3d852 | 168 | uint32_t mci_WaitForEvent() const; |
embeddedartists | 0:0fdadbc3d852 | 169 | |
embeddedartists | 0:0fdadbc3d852 | 170 | ReturnCode _readBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const; |
embeddedartists | 0:0fdadbc3d852 | 171 | ReturnCode _writeBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const; |
embeddedartists | 0:0fdadbc3d852 | 172 | |
embeddedartists | 0:0fdadbc3d852 | 173 | |
embeddedartists | 0:0fdadbc3d852 | 174 | uint32_t _Stat; |
embeddedartists | 0:0fdadbc3d852 | 175 | SDMMC_CARD_T _sdCardInfo; |
embeddedartists | 0:0fdadbc3d852 | 176 | |
embeddedartists | 0:0fdadbc3d852 | 177 | DigitalIn* _cardDetect; |
embeddedartists | 0:0fdadbc3d852 | 178 | |
embeddedartists | 0:0fdadbc3d852 | 179 | uint8_t _eventDmaChannel; /*!< DMA Channel used for transfer data */ |
embeddedartists | 0:0fdadbc3d852 | 180 | volatile bool _eventReceived; |
embeddedartists | 0:0fdadbc3d852 | 181 | volatile bool _eventSuccess; |
embeddedartists | 0:0fdadbc3d852 | 182 | }; |
embeddedartists | 0:0fdadbc3d852 | 183 | |
embeddedartists | 0:0fdadbc3d852 | 184 | #endif |
embeddedartists | 0:0fdadbc3d852 | 185 |