RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2017 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 5 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 6 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 7 *
kevman 0:38ceb79fef03 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 9 *
kevman 0:38ceb79fef03 10 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 13 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 14 * limitations under the License.
kevman 0:38ceb79fef03 15 */
kevman 0:38ceb79fef03 16
kevman 0:38ceb79fef03 17 #include "SlicingBlockDevice.h"
kevman 0:38ceb79fef03 18
kevman 0:38ceb79fef03 19
kevman 0:38ceb79fef03 20 SlicingBlockDevice::SlicingBlockDevice(BlockDevice *bd, bd_addr_t start, bd_addr_t stop)
kevman 0:38ceb79fef03 21 : _bd(bd)
kevman 0:38ceb79fef03 22 , _start_from_end(false), _start(start)
kevman 0:38ceb79fef03 23 , _stop_from_end(false), _stop(stop)
kevman 0:38ceb79fef03 24 {
kevman 0:38ceb79fef03 25 if ((int64_t)_start < 0) {
kevman 0:38ceb79fef03 26 _start_from_end = true;
kevman 0:38ceb79fef03 27 _start = -_start;
kevman 0:38ceb79fef03 28 }
kevman 0:38ceb79fef03 29
kevman 0:38ceb79fef03 30 if ((int64_t)_stop <= 0) {
kevman 0:38ceb79fef03 31 _stop_from_end = true;
kevman 0:38ceb79fef03 32 _stop = -_stop;
kevman 0:38ceb79fef03 33 }
kevman 0:38ceb79fef03 34 }
kevman 0:38ceb79fef03 35
kevman 0:38ceb79fef03 36 int SlicingBlockDevice::init()
kevman 0:38ceb79fef03 37 {
kevman 0:38ceb79fef03 38 int err = _bd->init();
kevman 0:38ceb79fef03 39 if (err) {
kevman 0:38ceb79fef03 40 return err;
kevman 0:38ceb79fef03 41 }
kevman 0:38ceb79fef03 42
kevman 0:38ceb79fef03 43 bd_size_t size = _bd->size();
kevman 0:38ceb79fef03 44
kevman 0:38ceb79fef03 45 // Calculate from_end values
kevman 0:38ceb79fef03 46 if (_start_from_end) {
kevman 0:38ceb79fef03 47 _start_from_end = false;
kevman 0:38ceb79fef03 48 _start = size - _start;
kevman 0:38ceb79fef03 49 }
kevman 0:38ceb79fef03 50
kevman 0:38ceb79fef03 51 if (_stop_from_end) {
kevman 0:38ceb79fef03 52 _stop_from_end = false;
kevman 0:38ceb79fef03 53 _stop = size - _stop;
kevman 0:38ceb79fef03 54 }
kevman 0:38ceb79fef03 55
kevman 0:38ceb79fef03 56 // Check that block addresses are valid
kevman 0:38ceb79fef03 57 MBED_ASSERT(_bd->is_valid_erase(_start, _stop - _start));
kevman 0:38ceb79fef03 58
kevman 0:38ceb79fef03 59 return 0;
kevman 0:38ceb79fef03 60 }
kevman 0:38ceb79fef03 61
kevman 0:38ceb79fef03 62 int SlicingBlockDevice::deinit()
kevman 0:38ceb79fef03 63 {
kevman 0:38ceb79fef03 64 return _bd->deinit();
kevman 0:38ceb79fef03 65 }
kevman 0:38ceb79fef03 66
kevman 0:38ceb79fef03 67 int SlicingBlockDevice::sync()
kevman 0:38ceb79fef03 68 {
kevman 0:38ceb79fef03 69 return _bd->sync();
kevman 0:38ceb79fef03 70 }
kevman 0:38ceb79fef03 71
kevman 0:38ceb79fef03 72 int SlicingBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
kevman 0:38ceb79fef03 73 {
kevman 0:38ceb79fef03 74 MBED_ASSERT(is_valid_read(addr, size));
kevman 0:38ceb79fef03 75 return _bd->read(b, addr + _start, size);
kevman 0:38ceb79fef03 76 }
kevman 0:38ceb79fef03 77
kevman 0:38ceb79fef03 78 int SlicingBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
kevman 0:38ceb79fef03 79 {
kevman 0:38ceb79fef03 80 MBED_ASSERT(is_valid_program(addr, size));
kevman 0:38ceb79fef03 81 return _bd->program(b, addr + _start, size);
kevman 0:38ceb79fef03 82 }
kevman 0:38ceb79fef03 83
kevman 0:38ceb79fef03 84 int SlicingBlockDevice::erase(bd_addr_t addr, bd_size_t size)
kevman 0:38ceb79fef03 85 {
kevman 0:38ceb79fef03 86 MBED_ASSERT(is_valid_erase(addr, size));
kevman 0:38ceb79fef03 87 return _bd->erase(addr + _start, size);
kevman 0:38ceb79fef03 88 }
kevman 0:38ceb79fef03 89
kevman 0:38ceb79fef03 90 bd_size_t SlicingBlockDevice::get_read_size() const
kevman 0:38ceb79fef03 91 {
kevman 0:38ceb79fef03 92 return _bd->get_read_size();
kevman 0:38ceb79fef03 93 }
kevman 0:38ceb79fef03 94
kevman 0:38ceb79fef03 95 bd_size_t SlicingBlockDevice::get_program_size() const
kevman 0:38ceb79fef03 96 {
kevman 0:38ceb79fef03 97 return _bd->get_program_size();
kevman 0:38ceb79fef03 98 }
kevman 0:38ceb79fef03 99
kevman 0:38ceb79fef03 100 bd_size_t SlicingBlockDevice::get_erase_size() const
kevman 0:38ceb79fef03 101 {
kevman 0:38ceb79fef03 102 return _bd->get_erase_size();
kevman 0:38ceb79fef03 103 }
kevman 0:38ceb79fef03 104
kevman 0:38ceb79fef03 105 bd_size_t SlicingBlockDevice::get_erase_size(bd_addr_t addr) const
kevman 0:38ceb79fef03 106 {
kevman 0:38ceb79fef03 107 return _bd->get_erase_size(_start + addr);
kevman 0:38ceb79fef03 108 }
kevman 0:38ceb79fef03 109
kevman 0:38ceb79fef03 110 int SlicingBlockDevice::get_erase_value() const
kevman 0:38ceb79fef03 111 {
kevman 0:38ceb79fef03 112 return _bd->get_erase_value();
kevman 0:38ceb79fef03 113 }
kevman 0:38ceb79fef03 114
kevman 0:38ceb79fef03 115 bd_size_t SlicingBlockDevice::size() const
kevman 0:38ceb79fef03 116 {
kevman 0:38ceb79fef03 117 return _stop - _start;
kevman 0:38ceb79fef03 118 }