A board support package for the LPC4088 Display Module.

Dependencies:   DM_HttpServer DM_USBHost

Dependents:   lpc4088_displaymodule_emwin lpc4088_displaymodule_demo_sphere sampleGUI sampleEmptyGUI ... more

Fork of DMSupport by EmbeddedArtists AB

Committer:
embeddedartists
Date:
Mon Nov 04 14:32:50 2019 +0000
Revision:
42:bbfe299d4a0c
Parent:
38:420cdc281467
More updates related to mbed OS 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:6b68dac0d986 1 /*
embeddedartists 9:a33326afd686 2 * Copyright 2014 Embedded Artists AB
embeddedartists 0:6b68dac0d986 3 *
embeddedartists 0:6b68dac0d986 4 * Licensed under the Apache License, Version 2.0 (the "License");
embeddedartists 0:6b68dac0d986 5 * you may not use this file except in compliance with the License.
embeddedartists 0:6b68dac0d986 6 * You may obtain a copy of the License at
embeddedartists 0:6b68dac0d986 7 *
embeddedartists 0:6b68dac0d986 8 * http://www.apache.org/licenses/LICENSE-2.0
embeddedartists 0:6b68dac0d986 9 *
embeddedartists 0:6b68dac0d986 10 * Unless required by applicable law or agreed to in writing, software
embeddedartists 0:6b68dac0d986 11 * distributed under the License is distributed on an "AS IS" BASIS,
embeddedartists 0:6b68dac0d986 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
embeddedartists 0:6b68dac0d986 13 * See the License for the specific language governing permissions and
embeddedartists 0:6b68dac0d986 14 * limitations under the License.
embeddedartists 0:6b68dac0d986 15 */
embeddedartists 0:6b68dac0d986 16
embeddedartists 0:6b68dac0d986 17 #ifndef MCIFILESYSTEM_H
embeddedartists 0:6b68dac0d986 18 #define MCIFILESYSTEM_H
embeddedartists 0:6b68dac0d986 19
embeddedartists 0:6b68dac0d986 20 #include "mbed.h"
embeddedartists 0:6b68dac0d986 21 #include "FATFileSystem.h"
embeddedartists 38:420cdc281467 22 #include "GPDMA.h"
embeddedartists 0:6b68dac0d986 23
embeddedartists 0:6b68dac0d986 24 /** Access the filesystem on an SD Card using MCI
embeddedartists 0:6b68dac0d986 25 *
embeddedartists 0:6b68dac0d986 26 * @code
embeddedartists 0:6b68dac0d986 27 * #include "mbed.h"
embeddedartists 0:6b68dac0d986 28 * #include "MCIFileSystem.h"
embeddedartists 0:6b68dac0d986 29 *
embeddedartists 0:6b68dac0d986 30 * MCIFileSystem mcifs("mci");
embeddedartists 0:6b68dac0d986 31 *
embeddedartists 0:6b68dac0d986 32 * int main() {
embeddedartists 0:6b68dac0d986 33 * printf("Please insert a SD/MMC card\n");
embeddedartists 0:6b68dac0d986 34 * while(!mcifs.cardInserted()) {
embeddedartists 0:6b68dac0d986 35 * wait(0.5);
embeddedartists 0:6b68dac0d986 36 * }
embeddedartists 0:6b68dac0d986 37 *
embeddedartists 0:6b68dac0d986 38 * printf("Found SD/MMC card, writing to /mci/myfile.txt ...\n");
embeddedartists 0:6b68dac0d986 39 *
embeddedartists 0:6b68dac0d986 40 * FILE *fp = fopen("/mci/myfile.txt", "w");
embeddedartists 0:6b68dac0d986 41 * if (fp != NULL) {
embeddedartists 0:6b68dac0d986 42 * fprintf(fp, "Hello World!\n");
embeddedartists 0:6b68dac0d986 43 * fclose(fp);
embeddedartists 0:6b68dac0d986 44 * printf("Wrote to /mci/myfile.txt\n");
embeddedartists 0:6b68dac0d986 45 * } else {
embeddedartists 0:6b68dac0d986 46 * printf("Failed to open /mci/myfile.txt\n");
embeddedartists 0:6b68dac0d986 47 * }
embeddedartists 0:6b68dac0d986 48 * }
embeddedartists 0:6b68dac0d986 49 * @endcode
embeddedartists 0:6b68dac0d986 50 */
embeddedartists 42:bbfe299d4a0c 51 class MCIFileSystem : public BlockDevice {
embeddedartists 0:6b68dac0d986 52 public:
embeddedartists 0:6b68dac0d986 53
embeddedartists 0:6b68dac0d986 54 /** Create the File System for accessing an SD/MMC Card using MCI
embeddedartists 0:6b68dac0d986 55 *
embeddedartists 0:6b68dac0d986 56 * @param cd The pin connected to the CardDetect line
embeddedartists 0:6b68dac0d986 57 */
embeddedartists 42:bbfe299d4a0c 58 MCIFileSystem(PinName cd = P4_16);
embeddedartists 0:6b68dac0d986 59
embeddedartists 0:6b68dac0d986 60 virtual ~MCIFileSystem();
embeddedartists 0:6b68dac0d986 61
embeddedartists 42:bbfe299d4a0c 62 virtual int init();
embeddedartists 42:bbfe299d4a0c 63 virtual int deinit();
embeddedartists 42:bbfe299d4a0c 64
embeddedartists 42:bbfe299d4a0c 65 virtual int sync();
embeddedartists 42:bbfe299d4a0c 66 virtual int read(void * buffer, bd_addr_t addr, bd_size_t size);
embeddedartists 42:bbfe299d4a0c 67 virtual int program(const void * buffer, bd_addr_t addr, bd_size_t size);
embeddedartists 42:bbfe299d4a0c 68 virtual bd_size_t get_read_size() const;
embeddedartists 42:bbfe299d4a0c 69 virtual bd_size_t get_program_size() const;
embeddedartists 42:bbfe299d4a0c 70 virtual bd_size_t size() const;
embeddedartists 42:bbfe299d4a0c 71 virtual const char *get_type() const;
embeddedartists 0:6b68dac0d986 72
embeddedartists 0:6b68dac0d986 73 void mci_MCIIRQHandler();
embeddedartists 0:6b68dac0d986 74 void mci_DMAIRQHandler();
embeddedartists 0:6b68dac0d986 75
embeddedartists 0:6b68dac0d986 76 /** Tests if a SD/MMC card is inserted or not.
embeddedartists 0:6b68dac0d986 77 *
embeddedartists 0:6b68dac0d986 78 * @returns
embeddedartists 0:6b68dac0d986 79 * True if a card has been inserted,
embeddedartists 0:6b68dac0d986 80 * False if no card is inserted or if the card detect pin is unavailable
embeddedartists 0:6b68dac0d986 81 */
embeddedartists 0:6b68dac0d986 82 bool cardInserted() const;
embeddedartists 0:6b68dac0d986 83
embeddedartists 0:6b68dac0d986 84 private:
embeddedartists 0:6b68dac0d986 85
embeddedartists 0:6b68dac0d986 86 typedef enum {
embeddedartists 0:6b68dac0d986 87 CardStatusNumBytes = 4,
embeddedartists 0:6b68dac0d986 88 } Constants;
embeddedartists 0:6b68dac0d986 89
embeddedartists 0:6b68dac0d986 90 typedef enum {
embeddedartists 0:6b68dac0d986 91 PowerOff = 0,
embeddedartists 0:6b68dac0d986 92 PowerUp = 2,
embeddedartists 0:6b68dac0d986 93 PowerOn = 3,
embeddedartists 0:6b68dac0d986 94 } power_ctrl_t;
embeddedartists 0:6b68dac0d986 95
embeddedartists 0:6b68dac0d986 96 typedef enum {
embeddedartists 0:6b68dac0d986 97 SDMMC_IDLE_ST = 0, /*!< Idle state */
embeddedartists 0:6b68dac0d986 98 SDMMC_READY_ST, /*!< Ready state */
embeddedartists 0:6b68dac0d986 99 SDMMC_IDENT_ST, /*!< Identification State */
embeddedartists 0:6b68dac0d986 100 SDMMC_STBY_ST, /*!< standby state */
embeddedartists 0:6b68dac0d986 101 SDMMC_TRAN_ST, /*!< transfer state */
embeddedartists 0:6b68dac0d986 102 SDMMC_DATA_ST, /*!< Sending-data State */
embeddedartists 0:6b68dac0d986 103 SDMMC_RCV_ST, /*!< Receive-data State */
embeddedartists 0:6b68dac0d986 104 SDMMC_PRG_ST, /*!< Programming State */
embeddedartists 0:6b68dac0d986 105 SDMMC_DIS_ST /*!< Disconnect State */
embeddedartists 0:6b68dac0d986 106 } CardState;
embeddedartists 0:6b68dac0d986 107
embeddedartists 0:6b68dac0d986 108
embeddedartists 0:6b68dac0d986 109 typedef struct {
embeddedartists 0:6b68dac0d986 110 uint8_t CmdIndex;
embeddedartists 0:6b68dac0d986 111 uint32_t Data[CardStatusNumBytes];
embeddedartists 0:6b68dac0d986 112 } response_t;
embeddedartists 0:6b68dac0d986 113
embeddedartists 0:6b68dac0d986 114 /**
embeddedartists 0:6b68dac0d986 115 * @brief SDC Clock Control Options
embeddedartists 0:6b68dac0d986 116 */
embeddedartists 0:6b68dac0d986 117 typedef enum {
embeddedartists 0:6b68dac0d986 118 SDC_CLOCK_ENABLE = 8, /*!< Enable SD Card Bus Clock */
embeddedartists 0:6b68dac0d986 119 SDC_CLOCK_POWER_SAVE = 9, /*!< Disable SD_CLK output when bus is idle */
embeddedartists 0:6b68dac0d986 120 SDC_CLOCK_DIVIDER_BYPASS = 10, /*!< Enable bypass of clock divide logic */
embeddedartists 0:6b68dac0d986 121 SDC_CLOCK_WIDEBUS_MODE = 11, /*!< Enable wide bus mode (SD_DAT[3:0] is used instead of SD_DAT[0]) */
embeddedartists 0:6b68dac0d986 122 } ClockControl;
embeddedartists 0:6b68dac0d986 123
embeddedartists 0:6b68dac0d986 124 /**
embeddedartists 0:6b68dac0d986 125 * @brief SD/MMC Card specific setup data structure
embeddedartists 0:6b68dac0d986 126 */
embeddedartists 0:6b68dac0d986 127 typedef struct {
embeddedartists 0:6b68dac0d986 128 uint32_t response[4]; /*!< Most recent response */
embeddedartists 0:6b68dac0d986 129 uint32_t cid[4]; /*!< CID of acquired card */
embeddedartists 0:6b68dac0d986 130 uint32_t csd[4]; /*!< CSD of acquired card */
embeddedartists 0:6b68dac0d986 131 uint32_t ext_csd[512 / 4]; /*!< Ext CSD */
embeddedartists 0:6b68dac0d986 132 uint32_t card_type; /*!< Card Type */
embeddedartists 0:6b68dac0d986 133 uint16_t rca; /*!< Relative address assigned to card */
embeddedartists 0:6b68dac0d986 134 uint32_t speed; /*!< Speed */
embeddedartists 0:6b68dac0d986 135 uint32_t block_len; /*!< Card sector size */
embeddedartists 42:bbfe299d4a0c 136 bd_size_t device_size; /*!< Device Size */
embeddedartists 0:6b68dac0d986 137 uint32_t blocknr; /*!< Block Number */
embeddedartists 0:6b68dac0d986 138 uint32_t clk_rate; /*!< Clock rate */
embeddedartists 0:6b68dac0d986 139 } SDMMC_CARD_T;
embeddedartists 0:6b68dac0d986 140
embeddedartists 0:6b68dac0d986 141 typedef enum {
embeddedartists 0:6b68dac0d986 142 SDC_RET_OK = 0,
embeddedartists 42:bbfe299d4a0c 143 SDC_RET_CMD_FAILED = -5001,
embeddedartists 42:bbfe299d4a0c 144 SDC_RET_BAD_PARAMETERS = -5002,
embeddedartists 42:bbfe299d4a0c 145 SDC_RET_BUS_NOT_IDLE = -5003,
embeddedartists 42:bbfe299d4a0c 146 SDC_RET_TIMEOUT = -5004,
embeddedartists 42:bbfe299d4a0c 147 SDC_RET_ERR_STATE = -5005,
embeddedartists 42:bbfe299d4a0c 148 SDC_RET_NOT_READY = -5006,
embeddedartists 42:bbfe299d4a0c 149 SDC_RET_FAILED = -5007,
embeddedartists 0:6b68dac0d986 150 } ReturnCode;
embeddedartists 0:6b68dac0d986 151
embeddedartists 0:6b68dac0d986 152 void initMCI();
embeddedartists 0:6b68dac0d986 153
embeddedartists 0:6b68dac0d986 154 int32_t mci_Acquire();
embeddedartists 0:6b68dac0d986 155 uint32_t mci_GetCardStatus() const;
embeddedartists 0:6b68dac0d986 156 CardState mci_GetCardState() const;
embeddedartists 0:6b68dac0d986 157 ReturnCode mci_ReadBlocks(void *buffer, int32_t startBlock, int32_t blockNum);
embeddedartists 0:6b68dac0d986 158 ReturnCode mci_WriteBlocks(void *buffer, int32_t startBlock, int32_t blockNum);
embeddedartists 0:6b68dac0d986 159 void mci_SetClock(uint32_t freq) const;
embeddedartists 0:6b68dac0d986 160 void mci_ClockControl(ClockControl ctrlType, bool enable) const;
embeddedartists 0:6b68dac0d986 161 void mci_PowerControl(power_ctrl_t powerMode, uint32_t flag) const;
embeddedartists 0:6b68dac0d986 162 ReturnCode mci_ExecuteCmd(uint32_t Command, uint32_t Arg, response_t* pResp) const;
embeddedartists 0:6b68dac0d986 163 ReturnCode mci_SendIfCond() const;
embeddedartists 0:6b68dac0d986 164 ReturnCode mci_SendOpCond(uint32_t *pOCR) const;
embeddedartists 0:6b68dac0d986 165 ReturnCode mci_SendAppOpCond(uint16_t rca, bool hcs, uint32_t *pOcr, bool *pCCS) const;
embeddedartists 0:6b68dac0d986 166 ReturnCode mci_GetCID(uint32_t *pCID) const;
embeddedartists 0:6b68dac0d986 167 ReturnCode mci_SetAddr(uint16_t addr) const;
embeddedartists 0:6b68dac0d986 168 ReturnCode mci_GetAddr(uint16_t *pRCA) const;
embeddedartists 0:6b68dac0d986 169 ReturnCode mci_GetCSD(uint16_t rca, uint32_t *pCSD) const;
embeddedartists 0:6b68dac0d986 170 ReturnCode mci_SelectCard(uint16_t addr) const;
embeddedartists 0:6b68dac0d986 171 ReturnCode mci_GetStatus(uint16_t rca, uint32_t *pStatus) const;
embeddedartists 0:6b68dac0d986 172 void mci_ProcessCSD();
embeddedartists 0:6b68dac0d986 173 ReturnCode mci_SetBusWidth(uint16_t rca, uint8_t width) const;
embeddedartists 0:6b68dac0d986 174 ReturnCode mci_SetTranState(uint16_t rca) const;
embeddedartists 0:6b68dac0d986 175 ReturnCode mci_SetBlockLength(uint32_t rca, uint32_t block_len) const;
embeddedartists 0:6b68dac0d986 176 ReturnCode mci_SetCardParams() const;
embeddedartists 0:6b68dac0d986 177 ReturnCode mci_StopTransmission(uint32_t rca) const;
embeddedartists 0:6b68dac0d986 178 bool mci_CheckR1Response(uint32_t resp, ReturnCode* pCheckResult) const;
embeddedartists 0:6b68dac0d986 179 void mci_WriteDelay() const;
embeddedartists 0:6b68dac0d986 180 ReturnCode mci_SendCmd(uint32_t Command, uint32_t Arg, uint32_t timeout) const;
embeddedartists 0:6b68dac0d986 181 ReturnCode mci_SendAppCmd(uint16_t rca) const;
embeddedartists 0:6b68dac0d986 182 void mci_SetDataTransfer(uint16_t BlockNum, bool DirFromCard, uint32_t Timeout) const;
embeddedartists 0:6b68dac0d986 183 void mci_GetResp(response_t* pResp) const;
embeddedartists 0:6b68dac0d986 184 uint32_t mci_GetBits(int32_t start, int32_t end, uint32_t *data) const;
embeddedartists 0:6b68dac0d986 185 void mci_SetCommand(uint32_t Cmd, uint32_t Arg) const;
embeddedartists 0:6b68dac0d986 186 void mci_ResetCommand() const;
embeddedartists 0:6b68dac0d986 187 int32_t mci_IRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt);
embeddedartists 0:6b68dac0d986 188 int32_t mci_FIFOIRQHandler(uint8_t *txBuf, uint32_t *txCnt, uint8_t *rxBuf, uint32_t *rxCnt);
embeddedartists 0:6b68dac0d986 189 void mci_ReadFIFO(uint32_t *pDst, bool bFirstHalf) const;
embeddedartists 0:6b68dac0d986 190 void mci_WriteFIFO(uint32_t *pSrc, bool bFirstHalf) const;
embeddedartists 0:6b68dac0d986 191
embeddedartists 38:420cdc281467 192 void mci_SetupEventWakeup();
embeddedartists 0:6b68dac0d986 193 uint32_t mci_WaitForEvent() const;
embeddedartists 0:6b68dac0d986 194
embeddedartists 0:6b68dac0d986 195 ReturnCode _readBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const;
embeddedartists 0:6b68dac0d986 196 ReturnCode _writeBlocks(uint32_t card_type, uint32_t startBlock, uint32_t blockNum) const;
embeddedartists 0:6b68dac0d986 197
embeddedartists 0:6b68dac0d986 198 SDMMC_CARD_T _sdCardInfo;
embeddedartists 0:6b68dac0d986 199
embeddedartists 0:6b68dac0d986 200 DigitalIn* _cardDetect;
embeddedartists 0:6b68dac0d986 201
embeddedartists 38:420cdc281467 202 GPDMA::DMAChannels _eventDmaChannel; /*!< DMA Channel used for transfer data */
embeddedartists 0:6b68dac0d986 203 volatile bool _eventReceived;
embeddedartists 0:6b68dac0d986 204 volatile bool _eventSuccess;
embeddedartists 42:bbfe299d4a0c 205
embeddedartists 42:bbfe299d4a0c 206 uint32_t _init_ref_count;
embeddedartists 42:bbfe299d4a0c 207 bool _is_initialized;
embeddedartists 0:6b68dac0d986 208 };
embeddedartists 0:6b68dac0d986 209
embeddedartists 0:6b68dac0d986 210 #endif