From Ben Katz mbed-dev library. Removed unnecessary target files to reduce the overall size by a factor of 10 to make it easier to import into the online IDE.

Dependents:   motor_driver motor_driver_screaming_fix

Committer:
saloutos
Date:
Thu Nov 26 04:08:56 2020 +0000
Revision:
0:083111ae2a11
first commit of leaned mbed dev lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saloutos 0:083111ae2a11 1 /* mbed Microcontroller Library
saloutos 0:083111ae2a11 2 * Copyright (c) 2017 ARM Limited
saloutos 0:083111ae2a11 3 *
saloutos 0:083111ae2a11 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
saloutos 0:083111ae2a11 5 * of this software and associated documentation files (the "Software"), to deal
saloutos 0:083111ae2a11 6 * in the Software without restriction, including without limitation the rights
saloutos 0:083111ae2a11 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
saloutos 0:083111ae2a11 8 * copies of the Software, and to permit persons to whom the Software is
saloutos 0:083111ae2a11 9 * furnished to do so, subject to the following conditions:
saloutos 0:083111ae2a11 10 *
saloutos 0:083111ae2a11 11 * The above copyright notice and this permission notice shall be included in
saloutos 0:083111ae2a11 12 * all copies or substantial portions of the Software.
saloutos 0:083111ae2a11 13 *
saloutos 0:083111ae2a11 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
saloutos 0:083111ae2a11 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
saloutos 0:083111ae2a11 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
saloutos 0:083111ae2a11 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
saloutos 0:083111ae2a11 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
saloutos 0:083111ae2a11 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
saloutos 0:083111ae2a11 20 * SOFTWARE.
saloutos 0:083111ae2a11 21 */
saloutos 0:083111ae2a11 22
saloutos 0:083111ae2a11 23 #include <string.h>
saloutos 0:083111ae2a11 24 #include "FlashIAP.h"
saloutos 0:083111ae2a11 25 #include "mbed_assert.h"
saloutos 0:083111ae2a11 26
saloutos 0:083111ae2a11 27
saloutos 0:083111ae2a11 28 #ifdef DEVICE_FLASH
saloutos 0:083111ae2a11 29
saloutos 0:083111ae2a11 30 namespace mbed {
saloutos 0:083111ae2a11 31
saloutos 0:083111ae2a11 32 SingletonPtr<PlatformMutex> FlashIAP::_mutex;
saloutos 0:083111ae2a11 33
saloutos 0:083111ae2a11 34 static inline bool is_aligned(uint32_t number, uint32_t alignment)
saloutos 0:083111ae2a11 35 {
saloutos 0:083111ae2a11 36 if ((number % alignment) != 0) {
saloutos 0:083111ae2a11 37 return false;
saloutos 0:083111ae2a11 38 } else {
saloutos 0:083111ae2a11 39 return true;
saloutos 0:083111ae2a11 40 }
saloutos 0:083111ae2a11 41 }
saloutos 0:083111ae2a11 42
saloutos 0:083111ae2a11 43 FlashIAP::FlashIAP()
saloutos 0:083111ae2a11 44 {
saloutos 0:083111ae2a11 45
saloutos 0:083111ae2a11 46 }
saloutos 0:083111ae2a11 47
saloutos 0:083111ae2a11 48 FlashIAP::~FlashIAP()
saloutos 0:083111ae2a11 49 {
saloutos 0:083111ae2a11 50
saloutos 0:083111ae2a11 51 }
saloutos 0:083111ae2a11 52
saloutos 0:083111ae2a11 53 int FlashIAP::init()
saloutos 0:083111ae2a11 54 {
saloutos 0:083111ae2a11 55 int ret = 0;
saloutos 0:083111ae2a11 56 _mutex->lock();
saloutos 0:083111ae2a11 57 if (flash_init(&_flash)) {
saloutos 0:083111ae2a11 58 ret = -1;
saloutos 0:083111ae2a11 59 }
saloutos 0:083111ae2a11 60 _mutex->unlock();
saloutos 0:083111ae2a11 61 return ret;
saloutos 0:083111ae2a11 62 }
saloutos 0:083111ae2a11 63
saloutos 0:083111ae2a11 64 int FlashIAP::deinit()
saloutos 0:083111ae2a11 65 {
saloutos 0:083111ae2a11 66 int ret = 0;
saloutos 0:083111ae2a11 67 _mutex->lock();
saloutos 0:083111ae2a11 68 if (flash_free(&_flash)) {
saloutos 0:083111ae2a11 69 ret = -1;
saloutos 0:083111ae2a11 70 }
saloutos 0:083111ae2a11 71 _mutex->unlock();
saloutos 0:083111ae2a11 72 return ret;
saloutos 0:083111ae2a11 73 }
saloutos 0:083111ae2a11 74
saloutos 0:083111ae2a11 75
saloutos 0:083111ae2a11 76 int FlashIAP::read(void *buffer, uint32_t addr, uint32_t size)
saloutos 0:083111ae2a11 77 {
saloutos 0:083111ae2a11 78 int32_t ret = -1;
saloutos 0:083111ae2a11 79 _mutex->lock();
saloutos 0:083111ae2a11 80 ret = flash_read(&_flash, addr, (uint8_t *) buffer, size);
saloutos 0:083111ae2a11 81 _mutex->unlock();
saloutos 0:083111ae2a11 82 return ret;
saloutos 0:083111ae2a11 83 }
saloutos 0:083111ae2a11 84
saloutos 0:083111ae2a11 85 int FlashIAP::program(const void *buffer, uint32_t addr, uint32_t size)
saloutos 0:083111ae2a11 86 {
saloutos 0:083111ae2a11 87 uint32_t page_size = get_page_size();
saloutos 0:083111ae2a11 88 uint32_t current_sector_size = flash_get_sector_size(&_flash, addr);
saloutos 0:083111ae2a11 89 // addr and size should be aligned to page size, and multiple of page size
saloutos 0:083111ae2a11 90 // page program should not cross sector boundaries
saloutos 0:083111ae2a11 91 if (!is_aligned(addr, page_size) ||
saloutos 0:083111ae2a11 92 !is_aligned(size, page_size) ||
saloutos 0:083111ae2a11 93 (size < page_size) ||
saloutos 0:083111ae2a11 94 (((addr % current_sector_size) + size) > current_sector_size)) {
saloutos 0:083111ae2a11 95 return -1;
saloutos 0:083111ae2a11 96 }
saloutos 0:083111ae2a11 97
saloutos 0:083111ae2a11 98 int ret = 0;
saloutos 0:083111ae2a11 99 _mutex->lock();
saloutos 0:083111ae2a11 100 if (flash_program_page(&_flash, addr, (const uint8_t *)buffer, size)) {
saloutos 0:083111ae2a11 101 ret = -1;
saloutos 0:083111ae2a11 102 }
saloutos 0:083111ae2a11 103 _mutex->unlock();
saloutos 0:083111ae2a11 104 return ret;
saloutos 0:083111ae2a11 105 }
saloutos 0:083111ae2a11 106
saloutos 0:083111ae2a11 107 bool FlashIAP::is_aligned_to_sector(uint32_t addr, uint32_t size)
saloutos 0:083111ae2a11 108 {
saloutos 0:083111ae2a11 109 uint32_t current_sector_size = flash_get_sector_size(&_flash, addr);
saloutos 0:083111ae2a11 110 if (!is_aligned(size, current_sector_size) ||
saloutos 0:083111ae2a11 111 !is_aligned(addr, current_sector_size)) {
saloutos 0:083111ae2a11 112 return false;
saloutos 0:083111ae2a11 113 } else {
saloutos 0:083111ae2a11 114 return true;
saloutos 0:083111ae2a11 115 }
saloutos 0:083111ae2a11 116 }
saloutos 0:083111ae2a11 117
saloutos 0:083111ae2a11 118 int FlashIAP::erase(uint32_t addr, uint32_t size)
saloutos 0:083111ae2a11 119 {
saloutos 0:083111ae2a11 120 uint32_t current_sector_size = 0UL;
saloutos 0:083111ae2a11 121
saloutos 0:083111ae2a11 122 if (!is_aligned_to_sector(addr, size)) {
saloutos 0:083111ae2a11 123 return -1;
saloutos 0:083111ae2a11 124 }
saloutos 0:083111ae2a11 125
saloutos 0:083111ae2a11 126 int32_t ret = 0;
saloutos 0:083111ae2a11 127 _mutex->lock();
saloutos 0:083111ae2a11 128 while (size) {
saloutos 0:083111ae2a11 129 ret = flash_erase_sector(&_flash, addr);
saloutos 0:083111ae2a11 130 if (ret != 0) {
saloutos 0:083111ae2a11 131 ret = -1;
saloutos 0:083111ae2a11 132 break;
saloutos 0:083111ae2a11 133 }
saloutos 0:083111ae2a11 134 current_sector_size = flash_get_sector_size(&_flash, addr);
saloutos 0:083111ae2a11 135 if (!is_aligned_to_sector(addr, size)) {
saloutos 0:083111ae2a11 136 ret = -1;
saloutos 0:083111ae2a11 137 break;
saloutos 0:083111ae2a11 138 }
saloutos 0:083111ae2a11 139 size -= current_sector_size;
saloutos 0:083111ae2a11 140 addr += current_sector_size;
saloutos 0:083111ae2a11 141 }
saloutos 0:083111ae2a11 142 _mutex->unlock();
saloutos 0:083111ae2a11 143 return ret;
saloutos 0:083111ae2a11 144 }
saloutos 0:083111ae2a11 145
saloutos 0:083111ae2a11 146 uint32_t FlashIAP::get_page_size() const
saloutos 0:083111ae2a11 147 {
saloutos 0:083111ae2a11 148 return flash_get_page_size(&_flash);
saloutos 0:083111ae2a11 149 }
saloutos 0:083111ae2a11 150
saloutos 0:083111ae2a11 151 uint32_t FlashIAP::get_sector_size(uint32_t addr) const
saloutos 0:083111ae2a11 152 {
saloutos 0:083111ae2a11 153 return flash_get_sector_size(&_flash, addr);
saloutos 0:083111ae2a11 154 }
saloutos 0:083111ae2a11 155
saloutos 0:083111ae2a11 156 uint32_t FlashIAP::get_flash_start() const
saloutos 0:083111ae2a11 157 {
saloutos 0:083111ae2a11 158 return flash_get_start_address(&_flash);
saloutos 0:083111ae2a11 159 }
saloutos 0:083111ae2a11 160
saloutos 0:083111ae2a11 161 uint32_t FlashIAP::get_flash_size() const
saloutos 0:083111ae2a11 162 {
saloutos 0:083111ae2a11 163 return flash_get_size(&_flash);
saloutos 0:083111ae2a11 164 }
saloutos 0:083111ae2a11 165
saloutos 0:083111ae2a11 166 }
saloutos 0:083111ae2a11 167
saloutos 0:083111ae2a11 168 #endif