test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anhtran 0:e9fd5575b10e 1 /* mbed Microcontroller Library
anhtran 0:e9fd5575b10e 2 * Copyright (c) 2017 ARM Limited
anhtran 0:e9fd5575b10e 3 *
anhtran 0:e9fd5575b10e 4 * Licensed under the Apache License, Version 2.0 (the "License");
anhtran 0:e9fd5575b10e 5 * you may not use this file except in compliance with the License.
anhtran 0:e9fd5575b10e 6 * You may obtain a copy of the License at
anhtran 0:e9fd5575b10e 7 *
anhtran 0:e9fd5575b10e 8 * http://www.apache.org/licenses/LICENSE-2.0
anhtran 0:e9fd5575b10e 9 *
anhtran 0:e9fd5575b10e 10 * Unless required by applicable law or agreed to in writing, software
anhtran 0:e9fd5575b10e 11 * distributed under the License is distributed on an "AS IS" BASIS,
anhtran 0:e9fd5575b10e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
anhtran 0:e9fd5575b10e 13 * See the License for the specific language governing permissions and
anhtran 0:e9fd5575b10e 14 * limitations under the License.
anhtran 0:e9fd5575b10e 15 */
anhtran 0:e9fd5575b10e 16
anhtran 0:e9fd5575b10e 17 #include "RomRamBlockDevice.h"
anhtran 0:e9fd5575b10e 18 #if defined(TARGET_RENESAS)
anhtran 0:e9fd5575b10e 19 #include "mbed_drv_cfg.h"
anhtran 0:e9fd5575b10e 20
anhtran 0:e9fd5575b10e 21 #else
anhtran 0:e9fd5575b10e 22 #define FLASH_BASE 0xFFFFFFFF
anhtran 0:e9fd5575b10e 23 #define FLASH_SIZE 0xFFFFFFFF
anhtran 0:e9fd5575b10e 24 #endif
anhtran 0:e9fd5575b10e 25
anhtran 0:e9fd5575b10e 26 RomRamBlockDevice::RomRamBlockDevice(bd_size_t size, bd_size_t block)
anhtran 0:e9fd5575b10e 27 : _read_size(block), _program_size(block), _erase_size(block)
anhtran 0:e9fd5575b10e 28 , _count(size / block), _blocks(0), _rom_start(FLASH_BASE), _rom_end(FLASH_BASE + FLASH_SIZE - 1)
anhtran 0:e9fd5575b10e 29 {
anhtran 0:e9fd5575b10e 30 MBED_ASSERT(_count * _erase_size == size);
anhtran 0:e9fd5575b10e 31 }
anhtran 0:e9fd5575b10e 32
anhtran 0:e9fd5575b10e 33 RomRamBlockDevice::RomRamBlockDevice(bd_size_t size, bd_size_t read, bd_size_t program, bd_size_t erase)
anhtran 0:e9fd5575b10e 34 : _read_size(read), _program_size(program), _erase_size(erase)
anhtran 0:e9fd5575b10e 35 , _count(size / erase), _blocks(0), _rom_start(FLASH_BASE), _rom_end(FLASH_BASE + FLASH_SIZE - 1)
anhtran 0:e9fd5575b10e 36 {
anhtran 0:e9fd5575b10e 37 MBED_ASSERT(_count * _erase_size == size);
anhtran 0:e9fd5575b10e 38 }
anhtran 0:e9fd5575b10e 39
anhtran 0:e9fd5575b10e 40 RomRamBlockDevice::~RomRamBlockDevice()
anhtran 0:e9fd5575b10e 41 {
anhtran 0:e9fd5575b10e 42 if (_blocks) {
anhtran 0:e9fd5575b10e 43 for (size_t i = 0; i < _count; i++) {
anhtran 0:e9fd5575b10e 44 free(_blocks[i]);
anhtran 0:e9fd5575b10e 45 }
anhtran 0:e9fd5575b10e 46
anhtran 0:e9fd5575b10e 47 delete[] _blocks;
anhtran 0:e9fd5575b10e 48 _blocks = 0;
anhtran 0:e9fd5575b10e 49 }
anhtran 0:e9fd5575b10e 50 }
anhtran 0:e9fd5575b10e 51
anhtran 0:e9fd5575b10e 52 void RomRamBlockDevice::SetRomAddr(uint32_t rom_start_addr, uint32_t rom_end_addr) {
anhtran 0:e9fd5575b10e 53 _rom_start = rom_start_addr;
anhtran 0:e9fd5575b10e 54 _rom_end = rom_end_addr;
anhtran 0:e9fd5575b10e 55 }
anhtran 0:e9fd5575b10e 56
anhtran 0:e9fd5575b10e 57 int RomRamBlockDevice::init()
anhtran 0:e9fd5575b10e 58 {
anhtran 0:e9fd5575b10e 59 if (!_blocks) {
anhtran 0:e9fd5575b10e 60 _blocks = new uint8_t*[_count];
anhtran 0:e9fd5575b10e 61 for (size_t i = 0; i < _count; i++) {
anhtran 0:e9fd5575b10e 62 _blocks[i] = 0;
anhtran 0:e9fd5575b10e 63 }
anhtran 0:e9fd5575b10e 64 }
anhtran 0:e9fd5575b10e 65
anhtran 0:e9fd5575b10e 66 return BD_ERROR_OK;
anhtran 0:e9fd5575b10e 67 }
anhtran 0:e9fd5575b10e 68
anhtran 0:e9fd5575b10e 69 int RomRamBlockDevice::deinit()
anhtran 0:e9fd5575b10e 70 {
anhtran 0:e9fd5575b10e 71 // Heapory is lazily cleaned up in destructor to allow
anhtran 0:e9fd5575b10e 72 // data to live across de/reinitialization
anhtran 0:e9fd5575b10e 73 return BD_ERROR_OK;
anhtran 0:e9fd5575b10e 74 }
anhtran 0:e9fd5575b10e 75
anhtran 0:e9fd5575b10e 76 bd_size_t RomRamBlockDevice::get_read_size() const
anhtran 0:e9fd5575b10e 77 {
anhtran 0:e9fd5575b10e 78 return _read_size;
anhtran 0:e9fd5575b10e 79 }
anhtran 0:e9fd5575b10e 80
anhtran 0:e9fd5575b10e 81 bd_size_t RomRamBlockDevice::get_program_size() const
anhtran 0:e9fd5575b10e 82 {
anhtran 0:e9fd5575b10e 83 return _program_size;
anhtran 0:e9fd5575b10e 84 }
anhtran 0:e9fd5575b10e 85
anhtran 0:e9fd5575b10e 86 bd_size_t RomRamBlockDevice::get_erase_size() const
anhtran 0:e9fd5575b10e 87 {
anhtran 0:e9fd5575b10e 88 return _erase_size;
anhtran 0:e9fd5575b10e 89 }
anhtran 0:e9fd5575b10e 90
anhtran 0:e9fd5575b10e 91 bd_size_t RomRamBlockDevice::size() const
anhtran 0:e9fd5575b10e 92 {
anhtran 0:e9fd5575b10e 93 return _count * _erase_size;
anhtran 0:e9fd5575b10e 94 }
anhtran 0:e9fd5575b10e 95
anhtran 0:e9fd5575b10e 96 int RomRamBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
anhtran 0:e9fd5575b10e 97 {
anhtran 0:e9fd5575b10e 98 MBED_ASSERT(is_valid_read(addr, size));
anhtran 0:e9fd5575b10e 99 uint8_t *buffer = static_cast<uint8_t*>(b);
anhtran 0:e9fd5575b10e 100
anhtran 0:e9fd5575b10e 101 while (size > 0) {
anhtran 0:e9fd5575b10e 102 bd_addr_t hi = addr / _erase_size;
anhtran 0:e9fd5575b10e 103 bd_addr_t lo = addr % _erase_size;
anhtran 0:e9fd5575b10e 104
anhtran 0:e9fd5575b10e 105 if (_blocks[hi]) {
anhtran 0:e9fd5575b10e 106 memcpy(buffer, &_blocks[hi][lo], _read_size);
anhtran 0:e9fd5575b10e 107 } else {
anhtran 0:e9fd5575b10e 108 memset(buffer, 0, _read_size);
anhtran 0:e9fd5575b10e 109 }
anhtran 0:e9fd5575b10e 110
anhtran 0:e9fd5575b10e 111 buffer += _read_size;
anhtran 0:e9fd5575b10e 112 addr += _read_size;
anhtran 0:e9fd5575b10e 113 size -= _read_size;
anhtran 0:e9fd5575b10e 114 }
anhtran 0:e9fd5575b10e 115
anhtran 0:e9fd5575b10e 116 return 0;
anhtran 0:e9fd5575b10e 117 }
anhtran 0:e9fd5575b10e 118
anhtran 0:e9fd5575b10e 119 int RomRamBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
anhtran 0:e9fd5575b10e 120 {
anhtran 0:e9fd5575b10e 121 MBED_ASSERT(is_valid_program(addr, size));
anhtran 0:e9fd5575b10e 122 const uint8_t *buffer = static_cast<const uint8_t*>(b);
anhtran 0:e9fd5575b10e 123
anhtran 0:e9fd5575b10e 124 while (size > 0) {
anhtran 0:e9fd5575b10e 125 bd_addr_t hi = addr / _erase_size;
anhtran 0:e9fd5575b10e 126 bd_addr_t lo = addr % _erase_size;
anhtran 0:e9fd5575b10e 127
anhtran 0:e9fd5575b10e 128 if (isRomAddress(buffer)) {
anhtran 0:e9fd5575b10e 129 if (!isRomAddress(_blocks[hi])) {
anhtran 0:e9fd5575b10e 130 free(_blocks[hi]);
anhtran 0:e9fd5575b10e 131 }
anhtran 0:e9fd5575b10e 132 _blocks[hi] = (uint8_t*)buffer;
anhtran 0:e9fd5575b10e 133 } else {
anhtran 0:e9fd5575b10e 134 if (!_blocks[hi]) {
anhtran 0:e9fd5575b10e 135 _blocks[hi] = (uint8_t*)malloc(_erase_size);
anhtran 0:e9fd5575b10e 136 if (!_blocks[hi]) {
anhtran 0:e9fd5575b10e 137 return BD_ERROR_DEVICE_ERROR;
anhtran 0:e9fd5575b10e 138 }
anhtran 0:e9fd5575b10e 139 }
anhtran 0:e9fd5575b10e 140 memcpy(&_blocks[hi][lo], buffer, _program_size);
anhtran 0:e9fd5575b10e 141 }
anhtran 0:e9fd5575b10e 142
anhtran 0:e9fd5575b10e 143 buffer += _program_size;
anhtran 0:e9fd5575b10e 144 addr += _program_size;
anhtran 0:e9fd5575b10e 145 size -= _program_size;
anhtran 0:e9fd5575b10e 146 }
anhtran 0:e9fd5575b10e 147
anhtran 0:e9fd5575b10e 148 return 0;
anhtran 0:e9fd5575b10e 149 }
anhtran 0:e9fd5575b10e 150
anhtran 0:e9fd5575b10e 151 int RomRamBlockDevice::erase(bd_addr_t addr, bd_size_t size)
anhtran 0:e9fd5575b10e 152 {
anhtran 0:e9fd5575b10e 153 MBED_ASSERT(is_valid_erase(addr, size));
anhtran 0:e9fd5575b10e 154 // TODO assert on programming unerased blocks
anhtran 0:e9fd5575b10e 155
anhtran 0:e9fd5575b10e 156 return 0;
anhtran 0:e9fd5575b10e 157 }
anhtran 0:e9fd5575b10e 158
anhtran 0:e9fd5575b10e 159 bool RomRamBlockDevice::isRomAddress(const uint8_t *address) {
anhtran 0:e9fd5575b10e 160 if (((uint32_t)address >= _rom_start)
anhtran 0:e9fd5575b10e 161 && ((uint32_t)address <= (_rom_end - _erase_size + 1))) {
anhtran 0:e9fd5575b10e 162 return true;
anhtran 0:e9fd5575b10e 163 }
anhtran 0:e9fd5575b10e 164 return false;
anhtran 0:e9fd5575b10e 165 }
anhtran 0:e9fd5575b10e 166
anhtran 0:e9fd5575b10e 167 const char *RomRamBlockDevice::get_type() const
anhtran 0:e9fd5575b10e 168 {
anhtran 0:e9fd5575b10e 169 return "ROMRAM";
anhtran 0:e9fd5575b10e 170 }
anhtran 0:e9fd5575b10e 171