This is a previous version

Dependencies:   FATFileSystem

Fork of SDFileSystem by Neil Thiessen

Revision:
0:2a6d8a096edc
Child:
1:25f4ba436b81
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.h	Tue Jul 29 20:12:23 2014 +0000
@@ -0,0 +1,136 @@
+/* SD/MMC File System Library
+ * Copyright (c) 2014 Neil Thiessen
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SD_FILE_SYSTEM_H
+#define SD_FILE_SYSTEM_H
+
+#include "mbed.h"
+#include "FATFileSystem.h"
+#include <stdint.h>
+
+/** SDFileSystem class.
+ *  Used for creating a virtual file system for accessing SD/MMC cards via SPI.
+ *
+ * Example:
+ * @code
+ * #include "mbed.h"
+ * #include "SDFileSystem.h"
+ *
+ * //Create an SDFileSystem object
+ * SDFileSystem sd(p5, p6, p7, p19, p20, "sd")
+ *
+ * int main()
+ * {
+ *     //Perform a write test
+ *     printf("\nWriting to SD card...");
+ *     FILE *fp = fopen("/sd/sdtest.txt", "w");
+ *     if (fp != NULL) {
+ *         fprintf(fp, "We're writing to an SD card!");
+ *         fclose(fp);
+ *         printf("success!\n");
+ *     } else {
+ *         printf("failed!\n");
+ *     }
+ *
+ *     //Perform a read test
+ *     printf("Reading from SD card...");
+ *     fp = fopen("/sd/sdtest.txt", "r");
+ *     if (fp != NULL) {
+ *         char c = fgetc(fp);
+ *         if (c == 'W')
+ *             printf("success!\n");
+ *         else
+ *             printf("incorrect char (%c)!\n", c);
+ *         fclose(fp);
+ *     } else {
+ *         printf("failed!\n");
+ *     }
+ * }
+ * @endcode
+ */
+class SDFileSystem : public FATFileSystem
+{
+public:
+    /** Represents the different SD/MMC card types
+     */
+    enum CardType {
+        CARD_NONE,      /**< No card is present */
+        CARD_MMC,       /**< MMC card */
+        CARD_SD,        /**< Standard capacity SD card */
+        CARD_SDHC,      /**< High capacity SD card */
+        CARD_UNKNOWN    /**< Unknown or unsupported card */
+    };
+
+    /** Create a virtual file system for accessing SD/MMC cards via SPI
+     *
+     * @param mosi The SPI data out pin.
+     * @param miso The SPI data in pin.
+     * @param sclk The SPI clock pin.
+     * @param cs The SPI chip select pin.
+     * @param cd The active-high card detect pin.
+     * @param name The name used to access the virtual filesystem.
+     * @param hz The SPI bus frequency (defaults to 1MHz).
+     */
+    SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName cd, const char* name, int hz = 1000000);
+
+    /** Get the detected SD/MMC card type
+     *
+     * @returns The detected card type as a CardType enum.
+     */
+    SDFileSystem::CardType card_type();
+
+    virtual int disk_initialize();
+    virtual int disk_status();
+    virtual int disk_read(uint8_t* buffer, uint64_t sector);
+    virtual int disk_write(const uint8_t* buffer, uint64_t sector);
+    virtual int disk_sync();
+    virtual uint64_t disk_sectors();
+
+private:
+    //Commands
+    enum Command {
+        CMD0 = 0,       /**< GO_IDLE_STATE */
+        CMD1 = 1,       /**< SEND_OP_COND */
+        ACMD41 = 41,    /**< APP_SEND_OP_COND */
+        CMD8 = 8,       /**< SEND_IF_COND */
+        CMD9 = 9,       /**< SEND_CSD */
+        CMD16 = 16,     /**< SET_BLOCKLEN */
+        CMD17 = 17,     /**< READ_SINGLE_BLOCK */
+        CMD24 = 24,     /**< WRITE_BLOCK */
+        CMD55 = 55,     /**< APP_CMD */
+        CMD58 = 58,     /**< READ_OCR */
+        CMD59 = 59      /**< CRC_ON_OFF */
+    };
+
+    //Member variables
+    SPI m_SPI;
+    DigitalOut m_CS;
+    InterruptIn m_CD;
+    int m_SpiFreq;
+    int m_Status;
+    SDFileSystem::CardType m_CardType;
+
+    //Internal methods
+    void checkSocket();
+    bool waitReady(int timeout);
+    bool select();
+    void deselect();
+    char writeCommand(char cmd, unsigned int arg);
+    unsigned int readReturn();
+    bool readData(char* buffer, int length);
+};
+
+#endif