mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_RENESAS/TARGET_RZ_A1XX/us_ticker.c@181:57724642e740, 2018-02-16 (annotated)
- Committer:
- AnnaBridge
- Date:
- Fri Feb 16 16:09:33 2018 +0000
- Revision:
- 181:57724642e740
- Child:
- 186:707f6e361f3e
mbed-dev library. Release version 159.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 181:57724642e740 | 1 | /* mbed Microcontroller Library |
AnnaBridge | 181:57724642e740 | 2 | * Copyright (c) 2006-2013 ARM Limited |
AnnaBridge | 181:57724642e740 | 3 | * |
AnnaBridge | 181:57724642e740 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 181:57724642e740 | 5 | * you may not use this file except in compliance with the License. |
AnnaBridge | 181:57724642e740 | 6 | * You may obtain a copy of the License at |
AnnaBridge | 181:57724642e740 | 7 | * |
AnnaBridge | 181:57724642e740 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 181:57724642e740 | 9 | * |
AnnaBridge | 181:57724642e740 | 10 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 181:57724642e740 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 181:57724642e740 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 181:57724642e740 | 13 | * See the License for the specific language governing permissions and |
AnnaBridge | 181:57724642e740 | 14 | * limitations under the License. |
AnnaBridge | 181:57724642e740 | 15 | */ |
AnnaBridge | 181:57724642e740 | 16 | #include <stddef.h> |
AnnaBridge | 181:57724642e740 | 17 | #include "us_ticker_api.h" |
AnnaBridge | 181:57724642e740 | 18 | #include "PeripheralNames.h" |
AnnaBridge | 181:57724642e740 | 19 | #include "iodefine.h" |
AnnaBridge | 181:57724642e740 | 20 | #include "cmsis.h" |
AnnaBridge | 181:57724642e740 | 21 | |
AnnaBridge | 181:57724642e740 | 22 | #include "RZ_A1_Init.h" |
AnnaBridge | 181:57724642e740 | 23 | #include "vfp_neon_push_pop.h" |
AnnaBridge | 181:57724642e740 | 24 | #include "mbed_critical.h" |
AnnaBridge | 181:57724642e740 | 25 | |
AnnaBridge | 181:57724642e740 | 26 | #define US_TICKER_TIMER_IRQn (OSTMI1TINT_IRQn) |
AnnaBridge | 181:57724642e740 | 27 | #define CPG_STBCR5_BIT_MSTP50 (0x01u) /* OSTM1 */ |
AnnaBridge | 181:57724642e740 | 28 | |
AnnaBridge | 181:57724642e740 | 29 | #define US_TICKER_CLOCK_US_DEV (1000000) |
AnnaBridge | 181:57724642e740 | 30 | |
AnnaBridge | 181:57724642e740 | 31 | int us_ticker_inited = 0; |
AnnaBridge | 181:57724642e740 | 32 | static double count_clock = 0; |
AnnaBridge | 181:57724642e740 | 33 | static uint32_t last_read = 0; |
AnnaBridge | 181:57724642e740 | 34 | static uint32_t wrap_arround = 0; |
AnnaBridge | 181:57724642e740 | 35 | static uint64_t ticker_us_last64 = 0; |
AnnaBridge | 181:57724642e740 | 36 | static uint64_t set_cmp_val64 = 0; |
AnnaBridge | 181:57724642e740 | 37 | static uint64_t timestamp64 = 0; |
AnnaBridge | 181:57724642e740 | 38 | |
AnnaBridge | 181:57724642e740 | 39 | void us_ticker_interrupt(void) { |
AnnaBridge | 181:57724642e740 | 40 | us_ticker_irq_handler(); |
AnnaBridge | 181:57724642e740 | 41 | } |
AnnaBridge | 181:57724642e740 | 42 | |
AnnaBridge | 181:57724642e740 | 43 | void us_ticker_init(void) { |
AnnaBridge | 181:57724642e740 | 44 | if (us_ticker_inited) return; |
AnnaBridge | 181:57724642e740 | 45 | us_ticker_inited = 1; |
AnnaBridge | 181:57724642e740 | 46 | |
AnnaBridge | 181:57724642e740 | 47 | /* set Counter Clock(us) */ |
AnnaBridge | 181:57724642e740 | 48 | if (false == RZ_A1_IsClockMode0()) { |
AnnaBridge | 181:57724642e740 | 49 | count_clock = ((double)CM1_RENESAS_RZ_A1_P0_CLK / (double)US_TICKER_CLOCK_US_DEV); |
AnnaBridge | 181:57724642e740 | 50 | } else { |
AnnaBridge | 181:57724642e740 | 51 | count_clock = ((double)CM0_RENESAS_RZ_A1_P0_CLK / (double)US_TICKER_CLOCK_US_DEV); |
AnnaBridge | 181:57724642e740 | 52 | } |
AnnaBridge | 181:57724642e740 | 53 | |
AnnaBridge | 181:57724642e740 | 54 | /* Power Control for Peripherals */ |
AnnaBridge | 181:57724642e740 | 55 | CPGSTBCR5 &= ~(CPG_STBCR5_BIT_MSTP50); /* enable OSTM1 clock */ |
AnnaBridge | 181:57724642e740 | 56 | |
AnnaBridge | 181:57724642e740 | 57 | // timer settings |
AnnaBridge | 181:57724642e740 | 58 | OSTM1TT = 0x01; /* Stop the counter and clears the OSTM1TE bit. */ |
AnnaBridge | 181:57724642e740 | 59 | OSTM1CTL = 0x02; /* Free running timer mode. Interrupt disabled when star counter */ |
AnnaBridge | 181:57724642e740 | 60 | |
AnnaBridge | 181:57724642e740 | 61 | OSTM1TS = 0x1; /* Start the counter and sets the OSTM0TE bit. */ |
AnnaBridge | 181:57724642e740 | 62 | |
AnnaBridge | 181:57724642e740 | 63 | // INTC settings |
AnnaBridge | 181:57724642e740 | 64 | InterruptHandlerRegister(US_TICKER_TIMER_IRQn, (void (*)(uint32_t))us_ticker_interrupt); |
AnnaBridge | 181:57724642e740 | 65 | GIC_SetPriority(US_TICKER_TIMER_IRQn, 5); |
AnnaBridge | 181:57724642e740 | 66 | GIC_SetConfiguration(US_TICKER_TIMER_IRQn, 3); |
AnnaBridge | 181:57724642e740 | 67 | GIC_EnableIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 68 | } |
AnnaBridge | 181:57724642e740 | 69 | |
AnnaBridge | 181:57724642e740 | 70 | static uint64_t ticker_read_counter64(void) { |
AnnaBridge | 181:57724642e740 | 71 | uint32_t cnt_val; |
AnnaBridge | 181:57724642e740 | 72 | uint64_t cnt_val64; |
AnnaBridge | 181:57724642e740 | 73 | |
AnnaBridge | 181:57724642e740 | 74 | if (!us_ticker_inited) |
AnnaBridge | 181:57724642e740 | 75 | us_ticker_init(); |
AnnaBridge | 181:57724642e740 | 76 | |
AnnaBridge | 181:57724642e740 | 77 | /* read counter */ |
AnnaBridge | 181:57724642e740 | 78 | cnt_val = OSTM1CNT; |
AnnaBridge | 181:57724642e740 | 79 | if (last_read > cnt_val) { |
AnnaBridge | 181:57724642e740 | 80 | wrap_arround++; |
AnnaBridge | 181:57724642e740 | 81 | } |
AnnaBridge | 181:57724642e740 | 82 | last_read = cnt_val; |
AnnaBridge | 181:57724642e740 | 83 | cnt_val64 = ((uint64_t)wrap_arround << 32) + cnt_val; |
AnnaBridge | 181:57724642e740 | 84 | |
AnnaBridge | 181:57724642e740 | 85 | return cnt_val64; |
AnnaBridge | 181:57724642e740 | 86 | } |
AnnaBridge | 181:57724642e740 | 87 | |
AnnaBridge | 181:57724642e740 | 88 | static void us_ticker_read_last(void) { |
AnnaBridge | 181:57724642e740 | 89 | uint64_t cnt_val64; |
AnnaBridge | 181:57724642e740 | 90 | |
AnnaBridge | 181:57724642e740 | 91 | cnt_val64 = ticker_read_counter64(); |
AnnaBridge | 181:57724642e740 | 92 | |
AnnaBridge | 181:57724642e740 | 93 | ticker_us_last64 = (cnt_val64 / count_clock); |
AnnaBridge | 181:57724642e740 | 94 | } |
AnnaBridge | 181:57724642e740 | 95 | |
AnnaBridge | 181:57724642e740 | 96 | uint32_t us_ticker_read() { |
AnnaBridge | 181:57724642e740 | 97 | core_util_critical_section_enter(); |
AnnaBridge | 181:57724642e740 | 98 | |
AnnaBridge | 181:57724642e740 | 99 | __vfp_neon_push(); |
AnnaBridge | 181:57724642e740 | 100 | us_ticker_read_last(); |
AnnaBridge | 181:57724642e740 | 101 | __vfp_neon_pop(); |
AnnaBridge | 181:57724642e740 | 102 | |
AnnaBridge | 181:57724642e740 | 103 | core_util_critical_section_exit(); |
AnnaBridge | 181:57724642e740 | 104 | |
AnnaBridge | 181:57724642e740 | 105 | /* clock to us */ |
AnnaBridge | 181:57724642e740 | 106 | return (uint32_t)ticker_us_last64; |
AnnaBridge | 181:57724642e740 | 107 | } |
AnnaBridge | 181:57724642e740 | 108 | |
AnnaBridge | 181:57724642e740 | 109 | static void us_ticker_calc_compare_match(void) { |
AnnaBridge | 181:57724642e740 | 110 | set_cmp_val64 = timestamp64 * count_clock; |
AnnaBridge | 181:57724642e740 | 111 | } |
AnnaBridge | 181:57724642e740 | 112 | |
AnnaBridge | 181:57724642e740 | 113 | void us_ticker_set_interrupt(timestamp_t timestamp) { |
AnnaBridge | 181:57724642e740 | 114 | // set match value |
AnnaBridge | 181:57724642e740 | 115 | volatile uint32_t set_cmp_val; |
AnnaBridge | 181:57724642e740 | 116 | uint64_t count_val_64; |
AnnaBridge | 181:57724642e740 | 117 | |
AnnaBridge | 181:57724642e740 | 118 | /* calc compare mach timestamp */ |
AnnaBridge | 181:57724642e740 | 119 | timestamp64 = (ticker_us_last64 & 0xFFFFFFFF00000000) + timestamp; |
AnnaBridge | 181:57724642e740 | 120 | if (timestamp < (ticker_us_last64 & 0x00000000FFFFFFFF)) { |
AnnaBridge | 181:57724642e740 | 121 | /* This event is wrap arround */ |
AnnaBridge | 181:57724642e740 | 122 | timestamp64 += 0x100000000; |
AnnaBridge | 181:57724642e740 | 123 | } |
AnnaBridge | 181:57724642e740 | 124 | |
AnnaBridge | 181:57724642e740 | 125 | /* calc compare mach timestamp */ |
AnnaBridge | 181:57724642e740 | 126 | __vfp_neon_push(); |
AnnaBridge | 181:57724642e740 | 127 | us_ticker_calc_compare_match(); |
AnnaBridge | 181:57724642e740 | 128 | __vfp_neon_pop(); |
AnnaBridge | 181:57724642e740 | 129 | |
AnnaBridge | 181:57724642e740 | 130 | set_cmp_val = (uint32_t)(set_cmp_val64 & 0x00000000FFFFFFFF); |
AnnaBridge | 181:57724642e740 | 131 | count_val_64 = ticker_read_counter64(); |
AnnaBridge | 181:57724642e740 | 132 | if (set_cmp_val64 <= (count_val_64 + 500)) { |
AnnaBridge | 181:57724642e740 | 133 | GIC_SetPendingIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 134 | GIC_EnableIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 135 | return; |
AnnaBridge | 181:57724642e740 | 136 | } |
AnnaBridge | 181:57724642e740 | 137 | OSTM1CMP = set_cmp_val; |
AnnaBridge | 181:57724642e740 | 138 | GIC_EnableIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 139 | } |
AnnaBridge | 181:57724642e740 | 140 | |
AnnaBridge | 181:57724642e740 | 141 | void us_ticker_fire_interrupt(void) { |
AnnaBridge | 181:57724642e740 | 142 | GIC_SetPendingIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 143 | } |
AnnaBridge | 181:57724642e740 | 144 | |
AnnaBridge | 181:57724642e740 | 145 | void us_ticker_disable_interrupt(void) { |
AnnaBridge | 181:57724642e740 | 146 | GIC_DisableIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 147 | } |
AnnaBridge | 181:57724642e740 | 148 | |
AnnaBridge | 181:57724642e740 | 149 | void us_ticker_clear_interrupt(void) { |
AnnaBridge | 181:57724642e740 | 150 | GIC_ClearPendingIRQ(US_TICKER_TIMER_IRQn); |
AnnaBridge | 181:57724642e740 | 151 | } |