for DISCO-F469NI based on BD_SD_DISCO_F746NG library by Roy Krikke

Dependents:   DISCO-F469NI_BD_SD_Card_Control USBDevice_microSD_RW_F469NI DISCO-F469NI_BD_SD_Card_Control

Fork of BD_SD_DISCO_F769NI by Kenji Arai

Committer:
kenjiArai
Date:
Thu Jul 25 23:29:40 2019 +0000
Revision:
2:0caded8d2a98
Parent:
1:d01aa82597cb
modified is_valid_read(), is_valid_program(), is_valid_erase and get_type() functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:c0eba637f7c7 1 /* SD/MMC Block device Library for MBED-OS
kenjiArai 0:c0eba637f7c7 2 * Copyright 2017 Roy Krikke
kenjiArai 0:c0eba637f7c7 3 *
kenjiArai 0:c0eba637f7c7 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:c0eba637f7c7 5 * you may not use this file except in compliance with the License.
kenjiArai 0:c0eba637f7c7 6 * You may obtain a copy of the License at
kenjiArai 0:c0eba637f7c7 7 *
kenjiArai 0:c0eba637f7c7 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:c0eba637f7c7 9 *
kenjiArai 0:c0eba637f7c7 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:c0eba637f7c7 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:c0eba637f7c7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:c0eba637f7c7 13 * See the License for the specific language governing permissions and
kenjiArai 0:c0eba637f7c7 14 * limitations under the License.
kenjiArai 0:c0eba637f7c7 15 *
kenjiArai 0:c0eba637f7c7 16 */
kenjiArai 0:c0eba637f7c7 17 /*
kenjiArai 0:c0eba637f7c7 18 Original Library by Roy Krikke
kenjiArai 0:c0eba637f7c7 19 https://os.mbed.com/users/roykrikke/code/BD_SD_DISCO_F746NG/
kenjiArai 0:c0eba637f7c7 20 https://os.mbed.com/users/roykrikke/
kenjiArai 0:c0eba637f7c7 21
kenjiArai 2:0caded8d2a98 22 Modified by K.Arai / JH1PJL July 22nd, 2019
kenjiArai 0:c0eba637f7c7 23
kenjiArai 0:c0eba637f7c7 24 All of following keywords are changed
kenjiArai 1:d01aa82597cb 25 F746NG -> F469NI
kenjiArai 0:c0eba637f7c7 26 32746g -> 32f769i
kenjiArai 0:c0eba637f7c7 27 */
kenjiArai 0:c0eba637f7c7 28
kenjiArai 1:d01aa82597cb 29 #ifndef BD_SD_DISCO_F469NI_H
kenjiArai 1:d01aa82597cb 30 #define BD_SD_DISCO_F469NI_H
kenjiArai 0:c0eba637f7c7 31
kenjiArai 0:c0eba637f7c7 32 #include "mbed.h"
kenjiArai 0:c0eba637f7c7 33 #include "BlockDevice.h"
kenjiArai 0:c0eba637f7c7 34 #include "platform/PlatformMutex.h"
kenjiArai 1:d01aa82597cb 35 #include "stm32469i_discovery_sd.h"
kenjiArai 0:c0eba637f7c7 36
kenjiArai 1:d01aa82597cb 37 #define BD_SD_DISCO_F469NI_MAJOR_VERSION 1
kenjiArai 1:d01aa82597cb 38 #define BD_SD_DISCO_F469NI_MINOR_VERSION 0
kenjiArai 1:d01aa82597cb 39 #define BD_SD_DISCO_F469NI_PATCH_VERSION 0
kenjiArai 0:c0eba637f7c7 40
kenjiArai 0:c0eba637f7c7 41 /**
kenjiArai 1:d01aa82597cb 42 * BD_SD_DISCO_F469NI class.
kenjiArai 1:d01aa82597cb 43 * Block device class for creating a block device to access a SD/MMC card via SD/MMC interface on DISCO_F469NI
kenjiArai 0:c0eba637f7c7 44 *
kenjiArai 0:c0eba637f7c7 45 * Example:
kenjiArai 0:c0eba637f7c7 46 * @code
kenjiArai 0:c0eba637f7c7 47 * #include "mbed.h"
kenjiArai 1:d01aa82597cb 48 * #include "SDBlockDeviceDISCOF469NI.h"
kenjiArai 0:c0eba637f7c7 49 *
kenjiArai 0:c0eba637f7c7 50 * DigitalOut led (LED1);
kenjiArai 0:c0eba637f7c7 51 *
kenjiArai 1:d01aa82597cb 52 * // Instantiate the Block Device for sd card on DISCO-F469NI
kenjiArai 1:d01aa82597cb 53 * SDBlockDeviceDISCOF469NI bd;
kenjiArai 0:c0eba637f7c7 54 * uint8_t block[512] = "Hello World!\n";
kenjiArai 0:c0eba637f7c7 55 *
kenjiArai 0:c0eba637f7c7 56 * int
kenjiArai 0:c0eba637f7c7 57 * main () {
kenjiArai 0:c0eba637f7c7 58 * Serial pc(SERIAL_TX, SERIAL_RX);
kenjiArai 0:c0eba637f7c7 59 * pc.baud (115200);
kenjiArai 0:c0eba637f7c7 60 * printf("Start\n");
kenjiArai 0:c0eba637f7c7 61 *
kenjiArai 1:d01aa82597cb 62 * // Call the SDBlockDevice-DISCO-F469NI instance initialisation method.
kenjiArai 0:c0eba637f7c7 63 * printf("sd card init...\n");
kenjiArai 0:c0eba637f7c7 64 * if (0 != bd.init ()) {
kenjiArai 0:c0eba637f7c7 65 * printf("Init failed \n");
kenjiArai 0:c0eba637f7c7 66 * return -1;
kenjiArai 0:c0eba637f7c7 67 * }
kenjiArai 0:c0eba637f7c7 68 *
kenjiArai 0:c0eba637f7c7 69 * printf("sd size: %llu\n", bd.size ());
kenjiArai 0:c0eba637f7c7 70 * printf("sd read size: %llu\n", bd.get_read_size ());
kenjiArai 0:c0eba637f7c7 71 * printf("sd program size: %llu\n", bd.get_program_size ());
kenjiArai 0:c0eba637f7c7 72 * printf("sd erase size: %llu\n\n", bd.get_erase_size ());
kenjiArai 0:c0eba637f7c7 73 *
kenjiArai 0:c0eba637f7c7 74 * printf("sd erase...\n");
kenjiArai 0:c0eba637f7c7 75 * if (0 != bd.erase (0, bd.get_erase_size ())) {
kenjiArai 0:c0eba637f7c7 76 * printf ("Error Erasing block \n");
kenjiArai 0:c0eba637f7c7 77 * }
kenjiArai 0:c0eba637f7c7 78 *
kenjiArai 0:c0eba637f7c7 79 * // Write some the data block to the device
kenjiArai 0:c0eba637f7c7 80 * printf("sd write: %s\n", block);
kenjiArai 0:c0eba637f7c7 81 * if (0 == bd.program (block, 0, 512)) {
kenjiArai 0:c0eba637f7c7 82 * // read the data block from the device
kenjiArai 0:c0eba637f7c7 83 * printf ("sd read: ");
kenjiArai 0:c0eba637f7c7 84 * if (0 == bd.read (block, 0, 512)) {
kenjiArai 0:c0eba637f7c7 85 * // print the contents of the block
kenjiArai 0:c0eba637f7c7 86 * printf ("%s", block);
kenjiArai 0:c0eba637f7c7 87 * }
kenjiArai 0:c0eba637f7c7 88 * }
kenjiArai 0:c0eba637f7c7 89 *
kenjiArai 1:d01aa82597cb 90 * // Call the BD_SD_DISCO_F469NI instance de-initialisation method.
kenjiArai 0:c0eba637f7c7 91 * printf("sd card deinit...\n");
kenjiArai 0:c0eba637f7c7 92 * if(0 != bd.deinit ()) {
kenjiArai 0:c0eba637f7c7 93 * printf ("Deinit failed \n");
kenjiArai 0:c0eba637f7c7 94 * return -1;
kenjiArai 0:c0eba637f7c7 95 * }
kenjiArai 0:c0eba637f7c7 96 *
kenjiArai 0:c0eba637f7c7 97 * // Blink led with 2 Hz
kenjiArai 0:c0eba637f7c7 98 * while(true) {
kenjiArai 0:c0eba637f7c7 99 * led = !led;
kenjiArai 0:c0eba637f7c7 100 * wait (0.5);
kenjiArai 0:c0eba637f7c7 101 * }
kenjiArai 0:c0eba637f7c7 102 * }
kenjiArai 0:c0eba637f7c7 103 * @endcode
kenjiArai 0:c0eba637f7c7 104 *
kenjiArai 0:c0eba637f7c7 105 */
kenjiArai 1:d01aa82597cb 106 class SDBlockDeviceDISCOF469NI : public BlockDevice
kenjiArai 0:c0eba637f7c7 107 {
kenjiArai 0:c0eba637f7c7 108 public:
kenjiArai 0:c0eba637f7c7 109
kenjiArai 0:c0eba637f7c7 110 /** Lifetime of the memory block device
kenjiArai 0:c0eba637f7c7 111 *
kenjiArai 0:c0eba637f7c7 112 * Only a block size of 512 bytes is supported
kenjiArai 0:c0eba637f7c7 113 *
kenjiArai 0:c0eba637f7c7 114 */
kenjiArai 1:d01aa82597cb 115 SDBlockDeviceDISCOF469NI();
kenjiArai 1:d01aa82597cb 116 virtual ~SDBlockDeviceDISCOF469NI();
kenjiArai 0:c0eba637f7c7 117
kenjiArai 0:c0eba637f7c7 118 /** Initialize a block device
kenjiArai 0:c0eba637f7c7 119 *
kenjiArai 0:c0eba637f7c7 120 * @return 0 on success or a negative error code on failure
kenjiArai 0:c0eba637f7c7 121 */
kenjiArai 0:c0eba637f7c7 122 virtual int init();
kenjiArai 0:c0eba637f7c7 123
kenjiArai 0:c0eba637f7c7 124 /** Deinitialize a block device
kenjiArai 0:c0eba637f7c7 125 *
kenjiArai 0:c0eba637f7c7 126 * @return 0 on success or a negative error code on failure
kenjiArai 0:c0eba637f7c7 127 */
kenjiArai 0:c0eba637f7c7 128 virtual int deinit();
kenjiArai 0:c0eba637f7c7 129
kenjiArai 0:c0eba637f7c7 130 /** Read blocks from a block device
kenjiArai 0:c0eba637f7c7 131 *
kenjiArai 0:c0eba637f7c7 132 * @param buffer Buffer to read blocks into
kenjiArai 0:c0eba637f7c7 133 * @param addr Address of block to begin reading from
kenjiArai 0:c0eba637f7c7 134 * @param size Size to read in bytes, must be a multiple of read block size
kenjiArai 0:c0eba637f7c7 135 * @return 0 on success, negative error code on failure
kenjiArai 0:c0eba637f7c7 136 */
kenjiArai 0:c0eba637f7c7 137 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
kenjiArai 0:c0eba637f7c7 138
kenjiArai 0:c0eba637f7c7 139 /** Program blocks to a block device
kenjiArai 0:c0eba637f7c7 140 *
kenjiArai 0:c0eba637f7c7 141 * The blocks must have been erased prior to being programmed
kenjiArai 0:c0eba637f7c7 142 *
kenjiArai 0:c0eba637f7c7 143 * @param buffer Buffer of data to write to blocks
kenjiArai 0:c0eba637f7c7 144 * @param addr Address of block to begin writing to
kenjiArai 0:c0eba637f7c7 145 * @param size Size to write in bytes, must be a multiple of program block size
kenjiArai 0:c0eba637f7c7 146 * @return 0 on success, negative error code on failure
kenjiArai 0:c0eba637f7c7 147 */
kenjiArai 0:c0eba637f7c7 148 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
kenjiArai 0:c0eba637f7c7 149
kenjiArai 0:c0eba637f7c7 150 /** Erase blocks on a block device
kenjiArai 0:c0eba637f7c7 151 *
kenjiArai 0:c0eba637f7c7 152 * The state of an erased block is undefined until it has been programmed
kenjiArai 0:c0eba637f7c7 153 *
kenjiArai 0:c0eba637f7c7 154 * @param addr Address of block to begin erasing
kenjiArai 0:c0eba637f7c7 155 * @param size Size to erase in bytes, must be a multiple of erase block size
kenjiArai 0:c0eba637f7c7 156 * @return 0 on success, negative error code on failure
kenjiArai 0:c0eba637f7c7 157 */
kenjiArai 0:c0eba637f7c7 158 virtual int erase(bd_addr_t addr, bd_size_t size);
kenjiArai 0:c0eba637f7c7 159
kenjiArai 0:c0eba637f7c7 160 /** Get the size of a readable block
kenjiArai 0:c0eba637f7c7 161 *
kenjiArai 0:c0eba637f7c7 162 * @return Size of a readable block in bytes
kenjiArai 0:c0eba637f7c7 163 */
kenjiArai 0:c0eba637f7c7 164 virtual bd_size_t get_read_size() const;
kenjiArai 0:c0eba637f7c7 165
kenjiArai 0:c0eba637f7c7 166 /** Get the size of a programable block
kenjiArai 0:c0eba637f7c7 167 *
kenjiArai 0:c0eba637f7c7 168 * @return Size of a programable block in bytes
kenjiArai 0:c0eba637f7c7 169 */
kenjiArai 0:c0eba637f7c7 170 virtual bd_size_t get_program_size() const;
kenjiArai 0:c0eba637f7c7 171
kenjiArai 0:c0eba637f7c7 172 /** Get the size of a eraseable block
kenjiArai 0:c0eba637f7c7 173 *
kenjiArai 0:c0eba637f7c7 174 * @return Size of a eraseable block in bytes
kenjiArai 0:c0eba637f7c7 175 */
kenjiArai 0:c0eba637f7c7 176 virtual bd_size_t get_erase_size() const;
kenjiArai 0:c0eba637f7c7 177
kenjiArai 0:c0eba637f7c7 178 /** Get the total size of the underlying device
kenjiArai 0:c0eba637f7c7 179 *
kenjiArai 0:c0eba637f7c7 180 * @return Size of the underlying device in bytes
kenjiArai 0:c0eba637f7c7 181 */
kenjiArai 0:c0eba637f7c7 182 virtual bd_size_t size() const;
kenjiArai 0:c0eba637f7c7 183
kenjiArai 2:0caded8d2a98 184 //--------- July 26th, 2019
kenjiArai 2:0caded8d2a98 185
kenjiArai 2:0caded8d2a98 186 /** Convenience function for checking block read validity
kenjiArai 2:0caded8d2a98 187 *
kenjiArai 2:0caded8d2a98 188 * @param addr Address of block to begin reading from
kenjiArai 2:0caded8d2a98 189 * @param size Size to read in bytes
kenjiArai 2:0caded8d2a98 190 * @return True if read is valid for underlying block device
kenjiArai 2:0caded8d2a98 191 */
kenjiArai 2:0caded8d2a98 192 virtual bool is_valid_read(bd_addr_t addr, bd_size_t size) const
kenjiArai 2:0caded8d2a98 193 {
kenjiArai 2:0caded8d2a98 194 return (addr % get_read_size() == 0 &&
kenjiArai 2:0caded8d2a98 195 size % get_read_size() == 0 &&
kenjiArai 2:0caded8d2a98 196 addr + size <= this->size());
kenjiArai 2:0caded8d2a98 197 }
kenjiArai 2:0caded8d2a98 198
kenjiArai 2:0caded8d2a98 199 /** Convenience function for checking block program validity
kenjiArai 2:0caded8d2a98 200 *
kenjiArai 2:0caded8d2a98 201 * @param addr Address of block to begin writing to
kenjiArai 2:0caded8d2a98 202 * @param size Size to write in bytes
kenjiArai 2:0caded8d2a98 203 * @return True if program is valid for underlying block device
kenjiArai 2:0caded8d2a98 204 */
kenjiArai 2:0caded8d2a98 205 virtual bool is_valid_program(bd_addr_t addr, bd_size_t size) const
kenjiArai 2:0caded8d2a98 206 {
kenjiArai 2:0caded8d2a98 207 return (addr % get_program_size() == 0 &&
kenjiArai 2:0caded8d2a98 208 size % get_program_size() == 0 &&
kenjiArai 2:0caded8d2a98 209 addr + size <= this->size());
kenjiArai 2:0caded8d2a98 210 }
kenjiArai 2:0caded8d2a98 211
kenjiArai 2:0caded8d2a98 212 /** Convenience function for checking block erase validity
kenjiArai 2:0caded8d2a98 213 *
kenjiArai 2:0caded8d2a98 214 * @param addr Address of block to begin erasing
kenjiArai 2:0caded8d2a98 215 * @param size Size to erase in bytes
kenjiArai 2:0caded8d2a98 216 * @return True if erase is valid for underlying block device
kenjiArai 2:0caded8d2a98 217 */
kenjiArai 2:0caded8d2a98 218 virtual bool is_valid_erase(bd_addr_t addr, bd_size_t size) const
kenjiArai 2:0caded8d2a98 219 {
kenjiArai 2:0caded8d2a98 220 return 1;// Dummy implementation -> Please modify yourself in the future
kenjiArai 2:0caded8d2a98 221 }
kenjiArai 2:0caded8d2a98 222
kenjiArai 2:0caded8d2a98 223 /** Get the BlockDevice class type.
kenjiArai 2:0caded8d2a98 224 *
kenjiArai 2:0caded8d2a98 225 * @return A string represent the BlockDevice class type.
kenjiArai 2:0caded8d2a98 226 */
kenjiArai 2:0caded8d2a98 227 virtual const char *get_type() const
kenjiArai 2:0caded8d2a98 228 {
kenjiArai 2:0caded8d2a98 229 return "microSD";
kenjiArai 2:0caded8d2a98 230 }
kenjiArai 2:0caded8d2a98 231
kenjiArai 2:0caded8d2a98 232 //----------
kenjiArai 0:c0eba637f7c7 233 private:
kenjiArai 0:c0eba637f7c7 234 uint8_t _card_type;
kenjiArai 0:c0eba637f7c7 235 bd_size_t _read_size;
kenjiArai 0:c0eba637f7c7 236 bd_size_t _program_size;
kenjiArai 0:c0eba637f7c7 237 bd_size_t _erase_size;
kenjiArai 0:c0eba637f7c7 238 bd_size_t _block_size;
kenjiArai 0:c0eba637f7c7 239 bd_size_t _capacity_in_blocks;
kenjiArai 0:c0eba637f7c7 240 BSP_SD_CardInfo _current_card_info;
kenjiArai 0:c0eba637f7c7 241 uint8_t _sd_state;
kenjiArai 0:c0eba637f7c7 242 uint32_t _timeout;
kenjiArai 0:c0eba637f7c7 243 PlatformMutex _mutex;
kenjiArai 0:c0eba637f7c7 244 bool _is_initialized;
kenjiArai 0:c0eba637f7c7 245
kenjiArai 0:c0eba637f7c7 246 virtual void
kenjiArai 0:c0eba637f7c7 247 lock () {
kenjiArai 0:c0eba637f7c7 248 _mutex.lock();
kenjiArai 0:c0eba637f7c7 249 }
kenjiArai 0:c0eba637f7c7 250
kenjiArai 0:c0eba637f7c7 251 virtual void
kenjiArai 0:c0eba637f7c7 252 unlock() {
kenjiArai 0:c0eba637f7c7 253 _mutex.unlock ();
kenjiArai 0:c0eba637f7c7 254 }
kenjiArai 0:c0eba637f7c7 255
kenjiArai 0:c0eba637f7c7 256 };
kenjiArai 0:c0eba637f7c7 257
kenjiArai 1:d01aa82597cb 258 #endif /* BD_SD_DISCO_F469NI_H */