mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /*
<> 144:ef7eb2e8f9f7 2 * PackageLicenseDeclared: Apache-2.0
<> 144:ef7eb2e8f9f7 3 * Copyright (c) 2015 ARM Limited
<> 144:ef7eb2e8f9f7 4 *
<> 144:ef7eb2e8f9f7 5 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 6 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 7 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 8 *
<> 144:ef7eb2e8f9f7 9 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 12 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 14 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 15 * limitations under the License.
<> 144:ef7eb2e8f9f7 16 */
<> 144:ef7eb2e8f9f7 17
<> 144:ef7eb2e8f9f7 18 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 19 #include "device.h"
<> 144:ef7eb2e8f9f7 20 #include "objects.h"
<> 144:ef7eb2e8f9f7 21 #include "lp_ticker_api.h"
<> 144:ef7eb2e8f9f7 22
<> 144:ef7eb2e8f9f7 23 /* Private lp_ticker data */
<> 144:ef7eb2e8f9f7 24 /* lp_ticker initialize */
<> 144:ef7eb2e8f9f7 25 static uint32_t lp_ticker_initialized = 0;
<> 144:ef7eb2e8f9f7 26 /* lp_ticker reload value */
<> 144:ef7eb2e8f9f7 27 static uint32_t lp_ticker_reload = 0x0; /* Max Value */
<> 144:ef7eb2e8f9f7 28 /* Store Overflow Delta */
<> 144:ef7eb2e8f9f7 29 static uint32_t lp_ticker_overflows_delta = 0;
<> 144:ef7eb2e8f9f7 30 /* lp_ticker Overflow limit */
<> 144:ef7eb2e8f9f7 31 static uint32_t lp_ticker_overflow_limit = 0;
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 #if DEVICE_LOWPOWERTIMER
<> 144:ef7eb2e8f9f7 34 /**
<> 144:ef7eb2e8f9f7 35 * Interrupt Handler
<> 144:ef7eb2e8f9f7 36 */
<> 144:ef7eb2e8f9f7 37 void __lp_ticker_irq_handler(void)
<> 144:ef7eb2e8f9f7 38 {
<> 144:ef7eb2e8f9f7 39 if (DualTimer_GetIRQInfo(DUALTIMER0) == SINGLETIMER2) {
<> 144:ef7eb2e8f9f7 40 DualTimer_ClearInterrupt(DUALTIMER0);
<> 144:ef7eb2e8f9f7 41 /*
<> 144:ef7eb2e8f9f7 42 * For each overflow event adds the timer max represented value to
<> 144:ef7eb2e8f9f7 43 * the delta. This allows the lp_ticker to keep track of the elapsed
<> 144:ef7eb2e8f9f7 44 * time:
<> 144:ef7eb2e8f9f7 45 * elapsed_time = (num_overflow * overflow_limit) + current_time
<> 144:ef7eb2e8f9f7 46 */
<> 144:ef7eb2e8f9f7 47 lp_ticker_overflows_delta += lp_ticker_overflow_limit;
<> 144:ef7eb2e8f9f7 48 } else {
<> 144:ef7eb2e8f9f7 49 lp_ticker_irq_handler();
<> 144:ef7eb2e8f9f7 50 }
<> 144:ef7eb2e8f9f7 51 }
<> 144:ef7eb2e8f9f7 52
<> 144:ef7eb2e8f9f7 53 /**
<> 144:ef7eb2e8f9f7 54 * Initialize the low power ticker
<> 144:ef7eb2e8f9f7 55 */
<> 144:ef7eb2e8f9f7 56 void lp_ticker_init(void)
<> 144:ef7eb2e8f9f7 57 {
<> 144:ef7eb2e8f9f7 58 uint32_t lp_ticker_irqn = 0;
<> 144:ef7eb2e8f9f7 59 /* Verify if lp_ticker has been already Initialized */
<> 144:ef7eb2e8f9f7 60 if (lp_ticker_initialized == 1)
<> 144:ef7eb2e8f9f7 61 {
<> 144:ef7eb2e8f9f7 62 return;
<> 144:ef7eb2e8f9f7 63 }
<> 144:ef7eb2e8f9f7 64 lp_ticker_initialized = 1;
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 /* Dualtimer Initialize */
<> 144:ef7eb2e8f9f7 67 DualTimer_Initialize(DUALTIMER0, lp_ticker_reload);
<> 144:ef7eb2e8f9f7 68 /* Dualtimer Enable */
<> 144:ef7eb2e8f9f7 69 DualTimer_Enable(DUALTIMER0, DUALTIMER_COUNT_32
<> 144:ef7eb2e8f9f7 70 //| DUALTIMER_PERIODIC
<> 144:ef7eb2e8f9f7 71 );
<> 144:ef7eb2e8f9f7 72 /* DualTimer get IRQn */
<> 144:ef7eb2e8f9f7 73 lp_ticker_irqn = DualTimer_GetIRQn(DUALTIMER0);
<> 144:ef7eb2e8f9f7 74 /* Enable lp_ticker IRQ */
<> 144:ef7eb2e8f9f7 75 NVIC_SetVector((IRQn_Type)lp_ticker_irqn,
<> 144:ef7eb2e8f9f7 76 (uint32_t)__lp_ticker_irq_handler);
<> 144:ef7eb2e8f9f7 77 NVIC_EnableIRQ((IRQn_Type)lp_ticker_irqn);
<> 144:ef7eb2e8f9f7 78
<> 144:ef7eb2e8f9f7 79 /* DualTimer set interrupt on SINGLETIMER2 */
<> 144:ef7eb2e8f9f7 80 DualTimer_SetInterrupt_2(DUALTIMER0, DUALTIMER_DEFAULT_RELOAD,
<> 144:ef7eb2e8f9f7 81 DUALTIMER_COUNT_32 | DUALTIMER_PERIODIC);
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /*
<> 144:ef7eb2e8f9f7 84 * Set lp_ticker Overflow limit. The lp_ticker overflow limit is required
<> 144:ef7eb2e8f9f7 85 * to calculated the return value of the lp_ticker read function in us
<> 144:ef7eb2e8f9f7 86 * on 32bit.
<> 144:ef7eb2e8f9f7 87 * A 32bit us value cannot be represented directly in the Dual Timer Load
<> 144:ef7eb2e8f9f7 88 * register if it is greater than (0xFFFFFFFF ticks)/DUALTIMER_DIVIDER_US.
<> 144:ef7eb2e8f9f7 89 */
<> 144:ef7eb2e8f9f7 90 lp_ticker_overflow_limit = DualTimer_GetReloadValue(DUALTIMER0,
<> 144:ef7eb2e8f9f7 91 SINGLETIMER2);
<> 144:ef7eb2e8f9f7 92 }
<> 144:ef7eb2e8f9f7 93
<> 144:ef7eb2e8f9f7 94 /**
<> 144:ef7eb2e8f9f7 95 * Read the current counter
<> 144:ef7eb2e8f9f7 96 * @return: The current timer's counter value in microseconds
<> 144:ef7eb2e8f9f7 97 */
<> 144:ef7eb2e8f9f7 98 uint32_t lp_ticker_read(void)
<> 144:ef7eb2e8f9f7 99 {
<> 144:ef7eb2e8f9f7 100 uint32_t microseconds = 0;
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 /* Verify if lp_ticker has not been Initialized */
<> 144:ef7eb2e8f9f7 103 if (lp_ticker_initialized == 0)
<> 144:ef7eb2e8f9f7 104 lp_ticker_init();
<> 144:ef7eb2e8f9f7 105
<> 144:ef7eb2e8f9f7 106 /* Read Timer Value */
<> 144:ef7eb2e8f9f7 107 microseconds = lp_ticker_overflows_delta + DualTimer_Read_2(DUALTIMER0);
<> 144:ef7eb2e8f9f7 108
<> 144:ef7eb2e8f9f7 109 return microseconds;
<> 144:ef7eb2e8f9f7 110 }
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 /**
<> 144:ef7eb2e8f9f7 113 * Set interrupt for specified timestamp
<> 144:ef7eb2e8f9f7 114 * timestamp: The time in microseconds to be set
<> 144:ef7eb2e8f9f7 115 */
<> 144:ef7eb2e8f9f7 116 void lp_ticker_set_interrupt(timestamp_t timestamp)
<> 144:ef7eb2e8f9f7 117 {
<> 144:ef7eb2e8f9f7 118 int32_t delta = 0;
<> 144:ef7eb2e8f9f7 119
<> 144:ef7eb2e8f9f7 120 /* Verify if lp_ticker has been not Initialized */
<> 144:ef7eb2e8f9f7 121 if (lp_ticker_initialized == 0)
<> 144:ef7eb2e8f9f7 122 lp_ticker_init();
<> 144:ef7eb2e8f9f7 123
<> 144:ef7eb2e8f9f7 124 /* Calculate the delta */
<> 144:ef7eb2e8f9f7 125 delta = (int32_t)(timestamp - lp_ticker_read());
<> 144:ef7eb2e8f9f7 126 /* Check if the event was in the past */
<> 144:ef7eb2e8f9f7 127 if (delta <= 0) {
<> 144:ef7eb2e8f9f7 128 /* This event was in the past */
<> 144:ef7eb2e8f9f7 129 DualTimer_SetInterrupt_1(DUALTIMER0, 0,
<> 144:ef7eb2e8f9f7 130 DUALTIMER_COUNT_32 | DUALTIMER_ONESHOT);
<> 144:ef7eb2e8f9f7 131 return;
<> 144:ef7eb2e8f9f7 132 }
<> 144:ef7eb2e8f9f7 133
<> 144:ef7eb2e8f9f7 134 /* Enable interrupt on SingleTimer1 */
<> 144:ef7eb2e8f9f7 135 DualTimer_SetInterrupt_1(DUALTIMER0, delta,
<> 144:ef7eb2e8f9f7 136 DUALTIMER_COUNT_32 | DUALTIMER_ONESHOT);
<> 144:ef7eb2e8f9f7 137 }
<> 144:ef7eb2e8f9f7 138
<> 144:ef7eb2e8f9f7 139 /**
<> 144:ef7eb2e8f9f7 140 * Disable low power ticker interrupt
<> 144:ef7eb2e8f9f7 141 */
<> 144:ef7eb2e8f9f7 142 void lp_ticker_disable_interrupt(void)
<> 144:ef7eb2e8f9f7 143 {
<> 144:ef7eb2e8f9f7 144 /* Disable Interrupt */
<> 144:ef7eb2e8f9f7 145 DualTimer_DisableInterrupt(DUALTIMER0);
<> 144:ef7eb2e8f9f7 146 }
<> 144:ef7eb2e8f9f7 147
<> 144:ef7eb2e8f9f7 148 /**
<> 144:ef7eb2e8f9f7 149 * Clear the low power ticker interrupt
<> 144:ef7eb2e8f9f7 150 */
<> 144:ef7eb2e8f9f7 151 void lp_ticker_clear_interrupt(void)
<> 144:ef7eb2e8f9f7 152 {
<> 144:ef7eb2e8f9f7 153 /* Clear Interrupt */
<> 144:ef7eb2e8f9f7 154 DualTimer_ClearInterrupt(DUALTIMER0);
<> 144:ef7eb2e8f9f7 155 }
<> 144:ef7eb2e8f9f7 156
<> 144:ef7eb2e8f9f7 157 #endif