PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

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