Working Maveric

Committer:
mettrque
Date:
Tue Apr 04 15:18:23 2017 +0000
Revision:
0:bdca5e4773dd
Child:
6:ef95300898b2
First Erfolgreich

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mettrque 0:bdca5e4773dd 1 /* mbed Microcontroller Library
mettrque 0:bdca5e4773dd 2 * Copyright (c) 2006-2012 ARM Limited
mettrque 0:bdca5e4773dd 3 *
mettrque 0:bdca5e4773dd 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
mettrque 0:bdca5e4773dd 5 * of this software and associated documentation files (the "Software"), to deal
mettrque 0:bdca5e4773dd 6 * in the Software without restriction, including without limitation the rights
mettrque 0:bdca5e4773dd 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mettrque 0:bdca5e4773dd 8 * copies of the Software, and to permit persons to whom the Software is
mettrque 0:bdca5e4773dd 9 * furnished to do so, subject to the following conditions:
mettrque 0:bdca5e4773dd 10 *
mettrque 0:bdca5e4773dd 11 * The above copyright notice and this permission notice shall be included in
mettrque 0:bdca5e4773dd 12 * all copies or substantial portions of the Software.
mettrque 0:bdca5e4773dd 13 *
mettrque 0:bdca5e4773dd 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mettrque 0:bdca5e4773dd 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mettrque 0:bdca5e4773dd 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mettrque 0:bdca5e4773dd 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mettrque 0:bdca5e4773dd 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mettrque 0:bdca5e4773dd 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
mettrque 0:bdca5e4773dd 20 * SOFTWARE.
mettrque 0:bdca5e4773dd 21 */
mettrque 0:bdca5e4773dd 22 #ifndef MBED_SD_BLOCK_DEVICE_H
mettrque 0:bdca5e4773dd 23 #define MBED_SD_BLOCK_DEVICE_H
mettrque 0:bdca5e4773dd 24
mettrque 0:bdca5e4773dd 25 /* If the target has no SPI support then SDCard is not supported */
mettrque 0:bdca5e4773dd 26 #ifdef DEVICE_SPI
mettrque 0:bdca5e4773dd 27
mettrque 0:bdca5e4773dd 28 #include "BlockDevice.h"
mettrque 0:bdca5e4773dd 29 #include "mbed.h"
mettrque 0:bdca5e4773dd 30
mettrque 0:bdca5e4773dd 31 /** Access an SD Card using SPI
mettrque 0:bdca5e4773dd 32 *
mettrque 0:bdca5e4773dd 33 * @code
mettrque 0:bdca5e4773dd 34 * #include "mbed.h"
mettrque 0:bdca5e4773dd 35 * #include "SDBlockDevice.h"
mettrque 0:bdca5e4773dd 36 *
mettrque 0:bdca5e4773dd 37 * SDBlockDevice sd(p5, p6, p7, p12); // mosi, miso, sclk, cs
mettrque 0:bdca5e4773dd 38 * uint8_t block[512] = "Hello World!\n";
mettrque 0:bdca5e4773dd 39 *
mettrque 0:bdca5e4773dd 40 * int main() {
mettrque 0:bdca5e4773dd 41 * sd.init();
mettrque 0:bdca5e4773dd 42 * sd.write(block, 0, 512);
mettrque 0:bdca5e4773dd 43 * sd.read(block, 0, 512);
mettrque 0:bdca5e4773dd 44 * printf("%s", block);
mettrque 0:bdca5e4773dd 45 * sd.deinit();
mettrque 0:bdca5e4773dd 46 * }
mettrque 0:bdca5e4773dd 47 */
mettrque 0:bdca5e4773dd 48 class SDBlockDevice : public BlockDevice {
mettrque 0:bdca5e4773dd 49 public:
mettrque 0:bdca5e4773dd 50 /** Lifetime of an SD card
mettrque 0:bdca5e4773dd 51 */
mettrque 0:bdca5e4773dd 52 SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs);
mettrque 0:bdca5e4773dd 53 virtual ~SDBlockDevice();
mettrque 0:bdca5e4773dd 54
mettrque 0:bdca5e4773dd 55 /** Initialize a block device
mettrque 0:bdca5e4773dd 56 *
mettrque 0:bdca5e4773dd 57 * @return 0 on success or a negative error code on failure
mettrque 0:bdca5e4773dd 58 */
mettrque 0:bdca5e4773dd 59 virtual int init();
mettrque 0:bdca5e4773dd 60
mettrque 0:bdca5e4773dd 61 /** Deinitialize a block device
mettrque 0:bdca5e4773dd 62 *
mettrque 0:bdca5e4773dd 63 * @return 0 on success or a negative error code on failure
mettrque 0:bdca5e4773dd 64 */
mettrque 0:bdca5e4773dd 65 virtual int deinit();
mettrque 0:bdca5e4773dd 66
mettrque 0:bdca5e4773dd 67 /** Read blocks from a block device
mettrque 0:bdca5e4773dd 68 *
mettrque 0:bdca5e4773dd 69 * @param buffer Buffer to write blocks to
mettrque 0:bdca5e4773dd 70 * @param addr Address of block to begin reading from
mettrque 0:bdca5e4773dd 71 * @param size Size to read in bytes, must be a multiple of read block size
mettrque 0:bdca5e4773dd 72 * @return 0 on success, negative error code on failure
mettrque 0:bdca5e4773dd 73 */
mettrque 0:bdca5e4773dd 74 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
mettrque 0:bdca5e4773dd 75
mettrque 0:bdca5e4773dd 76 /** Program blocks to a block device
mettrque 0:bdca5e4773dd 77 *
mettrque 0:bdca5e4773dd 78 * The blocks must have been erased prior to being programmed
mettrque 0:bdca5e4773dd 79 *
mettrque 0:bdca5e4773dd 80 * @param buffer Buffer of data to write to blocks
mettrque 0:bdca5e4773dd 81 * @param addr Address of block to begin writing to
mettrque 0:bdca5e4773dd 82 * @param size Size to write in bytes, must be a multiple of program block size
mettrque 0:bdca5e4773dd 83 * @return 0 on success, negative error code on failure
mettrque 0:bdca5e4773dd 84 */
mettrque 0:bdca5e4773dd 85 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
mettrque 0:bdca5e4773dd 86
mettrque 0:bdca5e4773dd 87 /** Erase blocks on a block device
mettrque 0:bdca5e4773dd 88 *
mettrque 0:bdca5e4773dd 89 * The state of an erased block is undefined until it has been programmed
mettrque 0:bdca5e4773dd 90 *
mettrque 0:bdca5e4773dd 91 * @param addr Address of block to begin erasing
mettrque 0:bdca5e4773dd 92 * @param size Size to erase in bytes, must be a multiple of erase block size
mettrque 0:bdca5e4773dd 93 * @return 0 on success, negative error code on failure
mettrque 0:bdca5e4773dd 94 */
mettrque 0:bdca5e4773dd 95 virtual int erase(bd_addr_t addr, bd_size_t size);
mettrque 0:bdca5e4773dd 96
mettrque 0:bdca5e4773dd 97 /** Get the size of a readable block
mettrque 0:bdca5e4773dd 98 *
mettrque 0:bdca5e4773dd 99 * @return Size of a readable block in bytes
mettrque 0:bdca5e4773dd 100 */
mettrque 0:bdca5e4773dd 101 virtual bd_size_t get_read_size() const;
mettrque 0:bdca5e4773dd 102
mettrque 0:bdca5e4773dd 103 /** Get the size of a programable block
mettrque 0:bdca5e4773dd 104 *
mettrque 0:bdca5e4773dd 105 * @return Size of a programable block in bytes
mettrque 0:bdca5e4773dd 106 * @note Must be a multiple of the read size
mettrque 0:bdca5e4773dd 107 */
mettrque 0:bdca5e4773dd 108 virtual bd_size_t get_program_size() const;
mettrque 0:bdca5e4773dd 109
mettrque 0:bdca5e4773dd 110 /** Get the size of a eraseable block
mettrque 0:bdca5e4773dd 111 *
mettrque 0:bdca5e4773dd 112 * @return Size of a eraseable block in bytes
mettrque 0:bdca5e4773dd 113 * @note Must be a multiple of the program size
mettrque 0:bdca5e4773dd 114 */
mettrque 0:bdca5e4773dd 115 virtual bd_size_t get_erase_size() const;
mettrque 0:bdca5e4773dd 116
mettrque 0:bdca5e4773dd 117 /** Get the total size of the underlying device
mettrque 0:bdca5e4773dd 118 *
mettrque 0:bdca5e4773dd 119 * @return Size of the underlying device in bytes
mettrque 0:bdca5e4773dd 120 */
mettrque 0:bdca5e4773dd 121 virtual bd_size_t size() const;
mettrque 0:bdca5e4773dd 122
mettrque 0:bdca5e4773dd 123 /** Enable or disable debugging
mettrque 0:bdca5e4773dd 124 *
mettrque 0:bdca5e4773dd 125 * @param State of debugging
mettrque 0:bdca5e4773dd 126 */
mettrque 0:bdca5e4773dd 127 virtual void debug(bool dbg);
mettrque 0:bdca5e4773dd 128
mettrque 0:bdca5e4773dd 129 protected:
mettrque 0:bdca5e4773dd 130 class SPI_HS : public SPI {
mettrque 0:bdca5e4773dd 131 public:
mettrque 0:bdca5e4773dd 132 SPI_HS(PinName mosi, PinName miso, PinName sclk, PinName ssel=NC) : SPI(mosi, miso, sclk, ssel) {}
mettrque 0:bdca5e4773dd 133
mettrque 0:bdca5e4773dd 134 virtual int write(int value) {
mettrque 0:bdca5e4773dd 135 aquire();
mettrque 0:bdca5e4773dd 136 int ret = spi_master_write(&_spi, value);
mettrque 0:bdca5e4773dd 137 return ret;
mettrque 0:bdca5e4773dd 138 }
mettrque 0:bdca5e4773dd 139 protected:
mettrque 0:bdca5e4773dd 140 virtual void aquire(void) {
mettrque 0:bdca5e4773dd 141 if (_owner != this) {
mettrque 0:bdca5e4773dd 142 spi_format(&_spi, _bits, _mode, 0);
mettrque 0:bdca5e4773dd 143 spi_frequency(&_spi, _hz);
mettrque 0:bdca5e4773dd 144 _owner = this;
mettrque 0:bdca5e4773dd 145 }
mettrque 0:bdca5e4773dd 146 }
mettrque 0:bdca5e4773dd 147 };
mettrque 0:bdca5e4773dd 148 int _cmd(int cmd, int arg);
mettrque 0:bdca5e4773dd 149 int _cmdx(int cmd, int arg);
mettrque 0:bdca5e4773dd 150 int _cmd8();
mettrque 0:bdca5e4773dd 151 int _cmd58();
mettrque 0:bdca5e4773dd 152 int _initialise_card();
mettrque 0:bdca5e4773dd 153 int _initialise_card_v1();
mettrque 0:bdca5e4773dd 154 int _initialise_card_v2();
mettrque 0:bdca5e4773dd 155
mettrque 0:bdca5e4773dd 156 int _read(uint8_t * buffer, uint32_t length);
mettrque 0:bdca5e4773dd 157 int _write(const uint8_t *buffer, uint32_t length);
mettrque 0:bdca5e4773dd 158 uint32_t _sd_sectors();
mettrque 0:bdca5e4773dd 159 uint32_t _sectors;
mettrque 0:bdca5e4773dd 160
mettrque 0:bdca5e4773dd 161 uint32_t _init_sck;
mettrque 0:bdca5e4773dd 162 uint32_t _transfer_sck;
mettrque 0:bdca5e4773dd 163
mettrque 0:bdca5e4773dd 164 SPI_HS _spi;
mettrque 0:bdca5e4773dd 165 DigitalOut _cs;
mettrque 0:bdca5e4773dd 166 unsigned _block_size;
mettrque 0:bdca5e4773dd 167 bool _is_initialized;
mettrque 0:bdca5e4773dd 168 bool _dbg;
mettrque 0:bdca5e4773dd 169 Mutex _lock;
mettrque 0:bdca5e4773dd 170 };
mettrque 0:bdca5e4773dd 171
mettrque 0:bdca5e4773dd 172
mettrque 0:bdca5e4773dd 173 #endif /* DEVICE_SPI */
mettrque 0:bdca5e4773dd 174
mettrque 0:bdca5e4773dd 175 #endif /* MBED_SD_BLOCK_DEVICE_H */