BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:55:34 2018 +0000
Revision:
2:798925c9e4a8
Parent:
1:9c5af431a1f1
bluetooth

Who changed what in which revision?

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