Rahul Dahiya / Mbed OS STM32F7 Ethernet
Committer:
rahul_dahiya
Date:
Wed Jan 15 15:57:15 2020 +0530
Revision:
0:fb8047b156bb
STM32F7 LWIP

Who changed what in which revision?

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