aaa

Dependencies:   FATFileSystem

Dependents:   AutoFlight2017_now2 AutoFlight2018_Control sbus_test_2018 Autoflight2018_sbusread ... more

Committer:
TUATBM
Date:
Sat Aug 26 16:30:14 2017 +0000
Revision:
0:85fbe134acff
forSkipper

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TUATBM 0:85fbe134acff 1 /* SD/MMC File System Library
TUATBM 0:85fbe134acff 2 * Copyright (c) 2016 Neil Thiessen
TUATBM 0:85fbe134acff 3 *
TUATBM 0:85fbe134acff 4 * Licensed under the Apache License, Version 2.0 (the "License");
TUATBM 0:85fbe134acff 5 * you may not use this file except in compliance with the License.
TUATBM 0:85fbe134acff 6 * You may obtain a copy of the License at
TUATBM 0:85fbe134acff 7 *
TUATBM 0:85fbe134acff 8 * http://www.apache.org/licenses/LICENSE-2.0
TUATBM 0:85fbe134acff 9 *
TUATBM 0:85fbe134acff 10 * Unless required by applicable law or agreed to in writing, software
TUATBM 0:85fbe134acff 11 * distributed under the License is distributed on an "AS IS" BASIS,
TUATBM 0:85fbe134acff 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TUATBM 0:85fbe134acff 13 * See the License for the specific language governing permissions and
TUATBM 0:85fbe134acff 14 * limitations under the License.
TUATBM 0:85fbe134acff 15 */
TUATBM 0:85fbe134acff 16
TUATBM 0:85fbe134acff 17 #ifndef SD_FILE_SYSTEM_H
TUATBM 0:85fbe134acff 18 #define SD_FILE_SYSTEM_H
TUATBM 0:85fbe134acff 19
TUATBM 0:85fbe134acff 20 #include "mbed.h"
TUATBM 0:85fbe134acff 21 #include "FATFileSystem.h"
TUATBM 0:85fbe134acff 22
TUATBM 0:85fbe134acff 23 /** SDFileSystem class.
TUATBM 0:85fbe134acff 24 * Used for creating a virtual file system for accessing SD/MMC cards via SPI.
TUATBM 0:85fbe134acff 25 *
TUATBM 0:85fbe134acff 26 * Example:
TUATBM 0:85fbe134acff 27 * @code
TUATBM 0:85fbe134acff 28 * #include "mbed.h"
TUATBM 0:85fbe134acff 29 * #include "SDFileSystem.h"
TUATBM 0:85fbe134acff 30 *
TUATBM 0:85fbe134acff 31 * //Create an SDFileSystem object
TUATBM 0:85fbe134acff 32 * SDFileSystem sd(p5, p6, p7, p20, "sd");
TUATBM 0:85fbe134acff 33 *
TUATBM 0:85fbe134acff 34 * int main()
TUATBM 0:85fbe134acff 35 * {
TUATBM 0:85fbe134acff 36 * //Mount the filesystem
TUATBM 0:85fbe134acff 37 * sd.mount();
TUATBM 0:85fbe134acff 38 *
TUATBM 0:85fbe134acff 39 * //Perform a write test
TUATBM 0:85fbe134acff 40 * printf("\nWriting to SD card...");
TUATBM 0:85fbe134acff 41 * FILE *fp = fopen("/sd/sdtest.txt", "w");
TUATBM 0:85fbe134acff 42 * if (fp != NULL) {
TUATBM 0:85fbe134acff 43 * fprintf(fp, "We're writing to an SD card!");
TUATBM 0:85fbe134acff 44 * fclose(fp);
TUATBM 0:85fbe134acff 45 * printf("success!\n");
TUATBM 0:85fbe134acff 46 * } else {
TUATBM 0:85fbe134acff 47 * printf("failed!\n");
TUATBM 0:85fbe134acff 48 * }
TUATBM 0:85fbe134acff 49 *
TUATBM 0:85fbe134acff 50 * //Perform a read test
TUATBM 0:85fbe134acff 51 * printf("Reading from SD card...");
TUATBM 0:85fbe134acff 52 * fp = fopen("/sd/sdtest.txt", "r");
TUATBM 0:85fbe134acff 53 * if (fp != NULL) {
TUATBM 0:85fbe134acff 54 * char c = fgetc(fp);
TUATBM 0:85fbe134acff 55 * if (c == 'W')
TUATBM 0:85fbe134acff 56 * printf("success!\n");
TUATBM 0:85fbe134acff 57 * else
TUATBM 0:85fbe134acff 58 * printf("incorrect char (%c)!\n", c);
TUATBM 0:85fbe134acff 59 * fclose(fp);
TUATBM 0:85fbe134acff 60 * } else {
TUATBM 0:85fbe134acff 61 * printf("failed!\n");
TUATBM 0:85fbe134acff 62 * }
TUATBM 0:85fbe134acff 63 *
TUATBM 0:85fbe134acff 64 * //Unmount the filesystem
TUATBM 0:85fbe134acff 65 * sd.unmount();
TUATBM 0:85fbe134acff 66 * }
TUATBM 0:85fbe134acff 67 * @endcode
TUATBM 0:85fbe134acff 68 */
TUATBM 0:85fbe134acff 69 class SDFileSystem : public FATFileSystem
TUATBM 0:85fbe134acff 70 {
TUATBM 0:85fbe134acff 71 public:
TUATBM 0:85fbe134acff 72 /** Represents the different card detect switch types
TUATBM 0:85fbe134acff 73 */
TUATBM 0:85fbe134acff 74 enum SwitchType {
TUATBM 0:85fbe134acff 75 SWITCH_NONE, /**< No card detect switch (assumes socket is always occupied) */
TUATBM 0:85fbe134acff 76 SWITCH_POS_NO, /**< Switch shorts to VDD when the socket is occupied (positive logic, normally open) */
TUATBM 0:85fbe134acff 77 SWITCH_POS_NC, /**< Switch shorts to VDD when the socket is empty (positive logic, normally closed) */
TUATBM 0:85fbe134acff 78 SWITCH_NEG_NO, /**< Switch shorts to GND when the socket is occupied (negative logic, normally open) */
TUATBM 0:85fbe134acff 79 SWITCH_NEG_NC /**< Switch shorts to GND when the socket is empty (negative logic, normally closed) */
TUATBM 0:85fbe134acff 80 };
TUATBM 0:85fbe134acff 81
TUATBM 0:85fbe134acff 82 /** Represents the different SD/MMC card types
TUATBM 0:85fbe134acff 83 */
TUATBM 0:85fbe134acff 84 enum CardType {
TUATBM 0:85fbe134acff 85 CARD_NONE, /**< No card is present */
TUATBM 0:85fbe134acff 86 CARD_MMC, /**< MMC card */
TUATBM 0:85fbe134acff 87 CARD_SD, /**< Standard capacity SD card */
TUATBM 0:85fbe134acff 88 CARD_SDHC, /**< High capacity SD card */
TUATBM 0:85fbe134acff 89 CARD_UNKNOWN /**< Unknown or unsupported card */
TUATBM 0:85fbe134acff 90 };
TUATBM 0:85fbe134acff 91
TUATBM 0:85fbe134acff 92 /** Create a virtual file system for accessing SD/MMC cards via SPI
TUATBM 0:85fbe134acff 93 *
TUATBM 0:85fbe134acff 94 * @param mosi The SPI data out pin.
TUATBM 0:85fbe134acff 95 * @param miso The SPI data in pin.
TUATBM 0:85fbe134acff 96 * @param sclk The SPI clock pin.
TUATBM 0:85fbe134acff 97 * @param cs The SPI chip select pin.
TUATBM 0:85fbe134acff 98 * @param name The name used to access the virtual filesystem.
TUATBM 0:85fbe134acff 99 * @param cd The card detect pin.
TUATBM 0:85fbe134acff 100 * @param cdtype The type of card detect switch.
TUATBM 0:85fbe134acff 101 * @param hz The SPI bus frequency (defaults to 1MHz).
TUATBM 0:85fbe134acff 102 */
TUATBM 0:85fbe134acff 103 SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd = NC, SwitchType cdtype = SWITCH_NONE, int hz = 1000000);
TUATBM 0:85fbe134acff 104
TUATBM 0:85fbe134acff 105 /** Determine whether or not a card is present
TUATBM 0:85fbe134acff 106 *
TUATBM 0:85fbe134acff 107 * @returns
TUATBM 0:85fbe134acff 108 * 'true' if a card is present,
TUATBM 0:85fbe134acff 109 * 'false' if no card is present.
TUATBM 0:85fbe134acff 110 */
TUATBM 0:85fbe134acff 111 bool card_present();
TUATBM 0:85fbe134acff 112
TUATBM 0:85fbe134acff 113 /** Get the detected SD/MMC card type
TUATBM 0:85fbe134acff 114 *
TUATBM 0:85fbe134acff 115 * @returns The detected card type as a CardType enum.
TUATBM 0:85fbe134acff 116 *
TUATBM 0:85fbe134acff 117 * @note Valid after the filesystem has been mounted.
TUATBM 0:85fbe134acff 118 */
TUATBM 0:85fbe134acff 119 SDFileSystem::CardType card_type();
TUATBM 0:85fbe134acff 120
TUATBM 0:85fbe134acff 121 /** Get whether or not CRC is enabled for commands and data
TUATBM 0:85fbe134acff 122 *
TUATBM 0:85fbe134acff 123 * @returns
TUATBM 0:85fbe134acff 124 * 'true' if CRC is enabled for commands and data,
TUATBM 0:85fbe134acff 125 * 'false' if CRC is disabled for commands and data.
TUATBM 0:85fbe134acff 126 */
TUATBM 0:85fbe134acff 127 bool crc();
TUATBM 0:85fbe134acff 128
TUATBM 0:85fbe134acff 129 /** Set whether or not CRC is enabled for commands and data
TUATBM 0:85fbe134acff 130 *
TUATBM 0:85fbe134acff 131 * @param enabled Whether or not to enable CRC for commands and data.
TUATBM 0:85fbe134acff 132 */
TUATBM 0:85fbe134acff 133 void crc(bool enabled);
TUATBM 0:85fbe134acff 134
TUATBM 0:85fbe134acff 135 /** Get whether or not 16-bit frames are enabled for data read/write operations
TUATBM 0:85fbe134acff 136 *
TUATBM 0:85fbe134acff 137 * @returns
TUATBM 0:85fbe134acff 138 * 'true' if 16-bit frames will be used during data read/write operations,
TUATBM 0:85fbe134acff 139 * 'false' if 8-bit frames will be used during data read/write operations.
TUATBM 0:85fbe134acff 140 */
TUATBM 0:85fbe134acff 141 bool large_frames();
TUATBM 0:85fbe134acff 142
TUATBM 0:85fbe134acff 143 /** Set whether or not 16-bit frames are enabled for data read/write operations
TUATBM 0:85fbe134acff 144 *
TUATBM 0:85fbe134acff 145 * @param enabled Whether or not 16-bit frames are enabled for data read/write operations.
TUATBM 0:85fbe134acff 146 */
TUATBM 0:85fbe134acff 147 void large_frames(bool enabled);
TUATBM 0:85fbe134acff 148
TUATBM 0:85fbe134acff 149 /** Get whether or not write validation is enabled for data write operations
TUATBM 0:85fbe134acff 150 *
TUATBM 0:85fbe134acff 151 * @returns
TUATBM 0:85fbe134acff 152 * 'true' if data writes will be verified using CMD13,
TUATBM 0:85fbe134acff 153 * 'false' if data writes will not be verified.
TUATBM 0:85fbe134acff 154 */
TUATBM 0:85fbe134acff 155 bool write_validation();
TUATBM 0:85fbe134acff 156
TUATBM 0:85fbe134acff 157 /** Set whether or not write validation is enabled for data write operations
TUATBM 0:85fbe134acff 158 *
TUATBM 0:85fbe134acff 159 * @param enabled Whether or not write validation is enabled for data write operations.
TUATBM 0:85fbe134acff 160 */
TUATBM 0:85fbe134acff 161 void write_validation(bool enabled);
TUATBM 0:85fbe134acff 162
TUATBM 0:85fbe134acff 163 virtual int unmount();
TUATBM 0:85fbe134acff 164 virtual int disk_initialize();
TUATBM 0:85fbe134acff 165 virtual int disk_status();
TUATBM 0:85fbe134acff 166 virtual int disk_read(uint8_t* buffer, uint32_t sector, uint32_t count);
TUATBM 0:85fbe134acff 167 virtual int disk_write(const uint8_t* buffer, uint32_t sector, uint32_t count);
TUATBM 0:85fbe134acff 168 virtual int disk_sync();
TUATBM 0:85fbe134acff 169 virtual uint32_t disk_sectors();
TUATBM 0:85fbe134acff 170
TUATBM 0:85fbe134acff 171 private:
TUATBM 0:85fbe134acff 172 //Commands
TUATBM 0:85fbe134acff 173 enum Command {
TUATBM 0:85fbe134acff 174 CMD0 = (0x40 | 0), /**< GO_IDLE_STATE */
TUATBM 0:85fbe134acff 175 CMD1 = (0x40 | 1), /**< SEND_OP_COND */
TUATBM 0:85fbe134acff 176 CMD8 = (0x40 | 8), /**< SEND_IF_COND */
TUATBM 0:85fbe134acff 177 CMD9 = (0x40 | 9), /**< SEND_CSD */
TUATBM 0:85fbe134acff 178 CMD12 = (0x40 | 12), /**< STOP_TRANSMISSION */
TUATBM 0:85fbe134acff 179 CMD13 = (0x40 | 13), /**< SEND_STATUS */
TUATBM 0:85fbe134acff 180 CMD16 = (0x40 | 16), /**< SET_BLOCKLEN */
TUATBM 0:85fbe134acff 181 CMD17 = (0x40 | 17), /**< READ_SINGLE_BLOCK */
TUATBM 0:85fbe134acff 182 CMD18 = (0x40 | 18), /**< READ_MULTIPLE_BLOCK */
TUATBM 0:85fbe134acff 183 ACMD22 = (0x40 | 22), /**< SEND_NUM_WR_BLOCKS */
TUATBM 0:85fbe134acff 184 ACMD23 = (0x40 | 23), /**< SET_WR_BLK_ERASE_COUNT */
TUATBM 0:85fbe134acff 185 CMD24 = (0x40 | 24), /**< WRITE_BLOCK */
TUATBM 0:85fbe134acff 186 CMD25 = (0x40 | 25), /**< WRITE_MULTIPLE_BLOCK */
TUATBM 0:85fbe134acff 187 ACMD41 = (0x40 | 41), /**< SD_SEND_OP_COND */
TUATBM 0:85fbe134acff 188 ACMD42 = (0x40 | 42), /**< SET_CLR_CARD_DETECT */
TUATBM 0:85fbe134acff 189 CMD55 = (0x40 | 55), /**< APP_CMD */
TUATBM 0:85fbe134acff 190 CMD58 = (0x40 | 58), /**< READ_OCR */
TUATBM 0:85fbe134acff 191 CMD59 = (0x40 | 59) /**< CRC_ON_OFF */
TUATBM 0:85fbe134acff 192 };
TUATBM 0:85fbe134acff 193
TUATBM 0:85fbe134acff 194 //Member variables
TUATBM 0:85fbe134acff 195 Timer m_Timer;
TUATBM 0:85fbe134acff 196 SPI m_Spi;
TUATBM 0:85fbe134acff 197 DigitalOut m_Cs;
TUATBM 0:85fbe134acff 198 InterruptIn m_Cd;
TUATBM 0:85fbe134acff 199 int m_CdAssert;
TUATBM 0:85fbe134acff 200 const int m_FREQ;
TUATBM 0:85fbe134acff 201 SDFileSystem::CardType m_CardType;
TUATBM 0:85fbe134acff 202 bool m_Crc;
TUATBM 0:85fbe134acff 203 bool m_LargeFrames;
TUATBM 0:85fbe134acff 204 bool m_WriteValidation;
TUATBM 0:85fbe134acff 205 int m_Status;
TUATBM 0:85fbe134acff 206
TUATBM 0:85fbe134acff 207 //Internal methods
TUATBM 0:85fbe134acff 208 void onCardRemoval();
TUATBM 0:85fbe134acff 209 void checkSocket();
TUATBM 0:85fbe134acff 210 bool waitReady(int timeout);
TUATBM 0:85fbe134acff 211 bool select();
TUATBM 0:85fbe134acff 212 void deselect();
TUATBM 0:85fbe134acff 213 char commandTransaction(char cmd, unsigned int arg, unsigned int* resp = NULL);
TUATBM 0:85fbe134acff 214 char writeCommand(char cmd, unsigned int arg, unsigned int* resp = NULL);
TUATBM 0:85fbe134acff 215 bool readData(char* buffer, int length);
TUATBM 0:85fbe134acff 216 char writeData(const char* buffer, char token);
TUATBM 0:85fbe134acff 217 bool readBlock(char* buffer, unsigned int lba);
TUATBM 0:85fbe134acff 218 bool readBlocks(char* buffer, unsigned int lba, unsigned int count);
TUATBM 0:85fbe134acff 219 bool writeBlock(const char* buffer, unsigned int lba);
TUATBM 0:85fbe134acff 220 bool writeBlocks(const char* buffer, unsigned int lba, unsigned int count);
TUATBM 0:85fbe134acff 221 };
TUATBM 0:85fbe134acff 222
TUATBM 0:85fbe134acff 223 #endif