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) 2006-2013 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 #include "drivers/CAN.h"
kevman 0:38ceb79fef03 17
kevman 0:38ceb79fef03 18 #if DEVICE_CAN
kevman 0:38ceb79fef03 19
kevman 0:38ceb79fef03 20 #include "platform/mbed_power_mgmt.h"
kevman 0:38ceb79fef03 21
kevman 0:38ceb79fef03 22 namespace mbed {
kevman 0:38ceb79fef03 23
kevman 0:38ceb79fef03 24 CAN::CAN(PinName rd, PinName td) : _can(), _irq()
kevman 0:38ceb79fef03 25 {
kevman 0:38ceb79fef03 26 // No lock needed in constructor
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28 for (size_t i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
kevman 0:38ceb79fef03 29 _irq[i] = NULL;
kevman 0:38ceb79fef03 30 }
kevman 0:38ceb79fef03 31
kevman 0:38ceb79fef03 32 can_init(&_can, rd, td);
kevman 0:38ceb79fef03 33 can_irq_init(&_can, (&CAN::_irq_handler), (uint32_t)this);
kevman 0:38ceb79fef03 34 }
kevman 0:38ceb79fef03 35
kevman 0:38ceb79fef03 36 CAN::CAN(PinName rd, PinName td, int hz) : _can(), _irq()
kevman 0:38ceb79fef03 37 {
kevman 0:38ceb79fef03 38 // No lock needed in constructor
kevman 0:38ceb79fef03 39
kevman 0:38ceb79fef03 40 for (size_t i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
kevman 0:38ceb79fef03 41 _irq[i] = NULL;
kevman 0:38ceb79fef03 42 }
kevman 0:38ceb79fef03 43
kevman 0:38ceb79fef03 44 can_init_freq(&_can, rd, td, hz);
kevman 0:38ceb79fef03 45 can_irq_init(&_can, (&CAN::_irq_handler), (uint32_t)this);
kevman 0:38ceb79fef03 46 }
kevman 0:38ceb79fef03 47
kevman 0:38ceb79fef03 48 CAN::~CAN()
kevman 0:38ceb79fef03 49 {
kevman 0:38ceb79fef03 50 // No lock needed in destructor
kevman 0:38ceb79fef03 51
kevman 0:38ceb79fef03 52 // Detaching interrupts releases the sleep lock if it was locked
kevman 0:38ceb79fef03 53 for (int irq = 0; irq < IrqCnt; irq++) {
kevman 0:38ceb79fef03 54 attach(NULL, (IrqType)irq);
kevman 0:38ceb79fef03 55 }
kevman 0:38ceb79fef03 56 can_irq_free(&_can);
kevman 0:38ceb79fef03 57 can_free(&_can);
kevman 0:38ceb79fef03 58 }
kevman 0:38ceb79fef03 59
kevman 0:38ceb79fef03 60 int CAN::frequency(int f)
kevman 0:38ceb79fef03 61 {
kevman 0:38ceb79fef03 62 lock();
kevman 0:38ceb79fef03 63 int ret = can_frequency(&_can, f);
kevman 0:38ceb79fef03 64 unlock();
kevman 0:38ceb79fef03 65 return ret;
kevman 0:38ceb79fef03 66 }
kevman 0:38ceb79fef03 67
kevman 0:38ceb79fef03 68 int CAN::write(CANMessage msg)
kevman 0:38ceb79fef03 69 {
kevman 0:38ceb79fef03 70 lock();
kevman 0:38ceb79fef03 71 int ret = can_write(&_can, msg, 0);
kevman 0:38ceb79fef03 72 unlock();
kevman 0:38ceb79fef03 73 return ret;
kevman 0:38ceb79fef03 74 }
kevman 0:38ceb79fef03 75
kevman 0:38ceb79fef03 76 int CAN::read(CANMessage &msg, int handle)
kevman 0:38ceb79fef03 77 {
kevman 0:38ceb79fef03 78 lock();
kevman 0:38ceb79fef03 79 int ret = can_read(&_can, &msg, handle);
kevman 0:38ceb79fef03 80 unlock();
kevman 0:38ceb79fef03 81 return ret;
kevman 0:38ceb79fef03 82 }
kevman 0:38ceb79fef03 83
kevman 0:38ceb79fef03 84 void CAN::reset()
kevman 0:38ceb79fef03 85 {
kevman 0:38ceb79fef03 86 lock();
kevman 0:38ceb79fef03 87 can_reset(&_can);
kevman 0:38ceb79fef03 88 unlock();
kevman 0:38ceb79fef03 89 }
kevman 0:38ceb79fef03 90
kevman 0:38ceb79fef03 91 unsigned char CAN::rderror()
kevman 0:38ceb79fef03 92 {
kevman 0:38ceb79fef03 93 lock();
kevman 0:38ceb79fef03 94 int ret = can_rderror(&_can);
kevman 0:38ceb79fef03 95 unlock();
kevman 0:38ceb79fef03 96 return ret;
kevman 0:38ceb79fef03 97 }
kevman 0:38ceb79fef03 98
kevman 0:38ceb79fef03 99 unsigned char CAN::tderror()
kevman 0:38ceb79fef03 100 {
kevman 0:38ceb79fef03 101 lock();
kevman 0:38ceb79fef03 102 int ret = can_tderror(&_can);
kevman 0:38ceb79fef03 103 unlock();
kevman 0:38ceb79fef03 104 return ret;
kevman 0:38ceb79fef03 105 }
kevman 0:38ceb79fef03 106
kevman 0:38ceb79fef03 107 void CAN::monitor(bool silent)
kevman 0:38ceb79fef03 108 {
kevman 0:38ceb79fef03 109 lock();
kevman 0:38ceb79fef03 110 can_monitor(&_can, (silent) ? 1 : 0);
kevman 0:38ceb79fef03 111 unlock();
kevman 0:38ceb79fef03 112 }
kevman 0:38ceb79fef03 113
kevman 0:38ceb79fef03 114 int CAN::mode(Mode mode)
kevman 0:38ceb79fef03 115 {
kevman 0:38ceb79fef03 116 lock();
kevman 0:38ceb79fef03 117 int ret = can_mode(&_can, (CanMode)mode);
kevman 0:38ceb79fef03 118 unlock();
kevman 0:38ceb79fef03 119 return ret;
kevman 0:38ceb79fef03 120 }
kevman 0:38ceb79fef03 121
kevman 0:38ceb79fef03 122 int CAN::filter(unsigned int id, unsigned int mask, CANFormat format, int handle)
kevman 0:38ceb79fef03 123 {
kevman 0:38ceb79fef03 124 lock();
kevman 0:38ceb79fef03 125 int ret = can_filter(&_can, id, mask, format, handle);
kevman 0:38ceb79fef03 126 unlock();
kevman 0:38ceb79fef03 127 return ret;
kevman 0:38ceb79fef03 128 }
kevman 0:38ceb79fef03 129
kevman 0:38ceb79fef03 130 void CAN::attach(Callback<void()> func, IrqType type)
kevman 0:38ceb79fef03 131 {
kevman 0:38ceb79fef03 132 lock();
kevman 0:38ceb79fef03 133 if (func) {
kevman 0:38ceb79fef03 134 // lock deep sleep only the first time
kevman 0:38ceb79fef03 135 if (!_irq[(CanIrqType)type]) {
kevman 0:38ceb79fef03 136 sleep_manager_lock_deep_sleep();
kevman 0:38ceb79fef03 137 }
kevman 0:38ceb79fef03 138 _irq[(CanIrqType)type] = func;
kevman 0:38ceb79fef03 139 can_irq_set(&_can, (CanIrqType)type, 1);
kevman 0:38ceb79fef03 140 } else {
kevman 0:38ceb79fef03 141 // unlock deep sleep only the first time
kevman 0:38ceb79fef03 142 if (_irq[(CanIrqType)type]) {
kevman 0:38ceb79fef03 143 sleep_manager_unlock_deep_sleep();
kevman 0:38ceb79fef03 144 }
kevman 0:38ceb79fef03 145 _irq[(CanIrqType)type] = NULL;
kevman 0:38ceb79fef03 146 can_irq_set(&_can, (CanIrqType)type, 0);
kevman 0:38ceb79fef03 147 }
kevman 0:38ceb79fef03 148 unlock();
kevman 0:38ceb79fef03 149 }
kevman 0:38ceb79fef03 150
kevman 0:38ceb79fef03 151 void CAN::_irq_handler(uint32_t id, CanIrqType type)
kevman 0:38ceb79fef03 152 {
kevman 0:38ceb79fef03 153 CAN *handler = (CAN *)id;
kevman 0:38ceb79fef03 154 if (handler->_irq[type]) {
kevman 0:38ceb79fef03 155 handler->_irq[type].call();
kevman 0:38ceb79fef03 156 }
kevman 0:38ceb79fef03 157 }
kevman 0:38ceb79fef03 158
kevman 0:38ceb79fef03 159 void CAN::lock()
kevman 0:38ceb79fef03 160 {
kevman 0:38ceb79fef03 161 _mutex.lock();
kevman 0:38ceb79fef03 162 }
kevman 0:38ceb79fef03 163
kevman 0:38ceb79fef03 164 void CAN::unlock()
kevman 0:38ceb79fef03 165 {
kevman 0:38ceb79fef03 166 _mutex.unlock();
kevman 0:38ceb79fef03 167 }
kevman 0:38ceb79fef03 168
kevman 0:38ceb79fef03 169 } // namespace mbed
kevman 0:38ceb79fef03 170
kevman 0:38ceb79fef03 171 #endif