mbed library sources. Supersedes mbed-src.
Dependents: Hobbyking_Cheetah_Compact Hobbyking_Cheetah_Compact_DRV8323_14bit Hobbyking_Cheetah_Compact_DRV8323_V51_201907 HKC_MiniCheetah ... more
Fork of mbed-dev by
targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c@174:b96e65c34a4d, 2017-10-02 (annotated)
- Committer:
- AnnaBridge
- Date:
- Mon Oct 02 15:33:19 2017 +0100
- Revision:
- 174:b96e65c34a4d
- Parent:
- 173:e131a1973e81
This updates the lib to the mbed lib v 152
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 167:e84263d55307 | 1 | /* mbed Microcontroller Library |
AnnaBridge | 167:e84263d55307 | 2 | * Copyright (c) 2013-2016 Realtek Semiconductor Corp. |
AnnaBridge | 167:e84263d55307 | 3 | * |
AnnaBridge | 167:e84263d55307 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 167:e84263d55307 | 5 | * you may not use this file except in compliance with the License. |
AnnaBridge | 167:e84263d55307 | 6 | * You may obtain a copy of the License at |
AnnaBridge | 167:e84263d55307 | 7 | * |
AnnaBridge | 167:e84263d55307 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 167:e84263d55307 | 9 | * |
AnnaBridge | 167:e84263d55307 | 10 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 167:e84263d55307 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 167:e84263d55307 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 167:e84263d55307 | 13 | * See the License for the specific language governing permissions and |
AnnaBridge | 167:e84263d55307 | 14 | * limitations under the License. |
AnnaBridge | 167:e84263d55307 | 15 | */ |
AnnaBridge | 167:e84263d55307 | 16 | |
AnnaBridge | 167:e84263d55307 | 17 | #include "objects.h" |
AnnaBridge | 167:e84263d55307 | 18 | #include <stddef.h> |
AnnaBridge | 167:e84263d55307 | 19 | #include "us_ticker_api.h" |
AnnaBridge | 167:e84263d55307 | 20 | #include "PeripheralNames.h" |
AnnaBridge | 167:e84263d55307 | 21 | |
AnnaBridge | 167:e84263d55307 | 22 | #define TICK_READ_FROM_CPU 0 // 1: read tick from CPU, 0: read tick from G-Timer |
AnnaBridge | 174:b96e65c34a4d | 23 | #define SYS_TIM_ID 1 // the G-Timer ID for System |
AnnaBridge | 174:b96e65c34a4d | 24 | #define APP_TIM_ID 6 // the G-Timer ID for Application |
AnnaBridge | 174:b96e65c34a4d | 25 | |
AnnaBridge | 174:b96e65c34a4d | 26 | /* |
AnnaBridge | 174:b96e65c34a4d | 27 | * For RTL8195AM, clock source is 32k |
AnnaBridge | 174:b96e65c34a4d | 28 | * |
AnnaBridge | 174:b96e65c34a4d | 29 | * us per tick: 30.5 |
AnnaBridge | 174:b96e65c34a4d | 30 | * tick per ms: 32.7 |
AnnaBridge | 174:b96e65c34a4d | 31 | * tick per us: 0.032 |
AnnaBridge | 174:b96e65c34a4d | 32 | * tick per sec: 32768 |
AnnaBridge | 174:b96e65c34a4d | 33 | * |
AnnaBridge | 174:b96e65c34a4d | 34 | * Define the following macros to convert between TICK and US. |
AnnaBridge | 174:b96e65c34a4d | 35 | */ |
AnnaBridge | 174:b96e65c34a4d | 36 | #define MS_TO_TICK(x) (uint64_t)(((x)*327) / 10) |
AnnaBridge | 174:b96e65c34a4d | 37 | #define US_TO_TICK(x) (uint64_t)(((x)*32) / 1000) |
AnnaBridge | 174:b96e65c34a4d | 38 | #define TICK_TO_US(x) (uint64_t)(((x)/2) * 61 + ((x)%2) * TIMER_TICK_US) |
AnnaBridge | 167:e84263d55307 | 39 | |
AnnaBridge | 167:e84263d55307 | 40 | static int us_ticker_inited = 0; |
AnnaBridge | 167:e84263d55307 | 41 | static TIMER_ADAPTER TimerAdapter; |
AnnaBridge | 167:e84263d55307 | 42 | |
AnnaBridge | 167:e84263d55307 | 43 | extern HAL_TIMER_OP HalTimerOp; |
AnnaBridge | 167:e84263d55307 | 44 | extern HAL_TIMER_OP_EXT HalTimerOpExt; |
AnnaBridge | 167:e84263d55307 | 45 | |
AnnaBridge | 174:b96e65c34a4d | 46 | VOID _us_ticker_irq_handler(void *Data) |
AnnaBridge | 167:e84263d55307 | 47 | { |
AnnaBridge | 167:e84263d55307 | 48 | us_ticker_irq_handler(); |
AnnaBridge | 167:e84263d55307 | 49 | } |
AnnaBridge | 167:e84263d55307 | 50 | |
AnnaBridge | 174:b96e65c34a4d | 51 | void us_ticker_init(void) |
AnnaBridge | 167:e84263d55307 | 52 | { |
AnnaBridge | 174:b96e65c34a4d | 53 | if (us_ticker_inited) { |
AnnaBridge | 174:b96e65c34a4d | 54 | return; |
AnnaBridge | 174:b96e65c34a4d | 55 | } |
AnnaBridge | 174:b96e65c34a4d | 56 | |
AnnaBridge | 167:e84263d55307 | 57 | us_ticker_inited = 1; |
AnnaBridge | 167:e84263d55307 | 58 | |
AnnaBridge | 174:b96e65c34a4d | 59 | // Reload and restart sys-timer |
AnnaBridge | 174:b96e65c34a4d | 60 | HalTimerOp.HalTimerDis(SYS_TIM_ID); |
AnnaBridge | 174:b96e65c34a4d | 61 | HalTimerOpExt.HalTimerReLoad(SYS_TIM_ID, 0xFFFFFFFFUL); |
AnnaBridge | 174:b96e65c34a4d | 62 | HalTimerOp.HalTimerEn(SYS_TIM_ID); |
AnnaBridge | 174:b96e65c34a4d | 63 | |
AnnaBridge | 174:b96e65c34a4d | 64 | // Initial a app-timer |
AnnaBridge | 167:e84263d55307 | 65 | TimerAdapter.IrqDis = 0; // Enable Irq @ initial |
AnnaBridge | 167:e84263d55307 | 66 | TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) _us_ticker_irq_handler; |
AnnaBridge | 167:e84263d55307 | 67 | TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ; |
AnnaBridge | 167:e84263d55307 | 68 | TimerAdapter.IrqHandle.Priority = 10; |
AnnaBridge | 167:e84263d55307 | 69 | TimerAdapter.IrqHandle.Data = (u32)NULL; |
AnnaBridge | 167:e84263d55307 | 70 | TimerAdapter.TimerId = APP_TIM_ID; |
AnnaBridge | 167:e84263d55307 | 71 | TimerAdapter.TimerIrqPriority = 0; |
AnnaBridge | 167:e84263d55307 | 72 | TimerAdapter.TimerLoadValueUs = 0xFFFFFFFF; |
AnnaBridge | 167:e84263d55307 | 73 | TimerAdapter.TimerMode = USER_DEFINED; |
AnnaBridge | 167:e84263d55307 | 74 | |
AnnaBridge | 174:b96e65c34a4d | 75 | HalTimerOp.HalTimerInit((void *) &TimerAdapter); |
AnnaBridge | 167:e84263d55307 | 76 | |
AnnaBridge | 167:e84263d55307 | 77 | DBG_TIMER_INFO("%s: Timer_Id=%d\n", __FUNCTION__, APP_TIM_ID); |
AnnaBridge | 167:e84263d55307 | 78 | } |
AnnaBridge | 167:e84263d55307 | 79 | |
AnnaBridge | 174:b96e65c34a4d | 80 | uint32_t us_ticker_read(void) |
AnnaBridge | 167:e84263d55307 | 81 | { |
AnnaBridge | 167:e84263d55307 | 82 | uint32_t tick_cnt; |
AnnaBridge | 174:b96e65c34a4d | 83 | uint64_t tick_us; |
AnnaBridge | 174:b96e65c34a4d | 84 | |
AnnaBridge | 174:b96e65c34a4d | 85 | if (!us_ticker_inited) { |
AnnaBridge | 174:b96e65c34a4d | 86 | us_ticker_init(); |
AnnaBridge | 174:b96e65c34a4d | 87 | } |
AnnaBridge | 167:e84263d55307 | 88 | |
AnnaBridge | 167:e84263d55307 | 89 | tick_cnt = HalTimerOp.HalTimerReadCount(SYS_TIM_ID); |
AnnaBridge | 174:b96e65c34a4d | 90 | tick_us = TICK_TO_US(0xFFFFFFFFUL - tick_cnt); |
AnnaBridge | 167:e84263d55307 | 91 | |
AnnaBridge | 174:b96e65c34a4d | 92 | return ((uint32_t)tick_us); //return ticker value in micro-seconds (us) |
AnnaBridge | 167:e84263d55307 | 93 | } |
AnnaBridge | 167:e84263d55307 | 94 | |
AnnaBridge | 174:b96e65c34a4d | 95 | void us_ticker_set_interrupt(timestamp_t timestamp) |
AnnaBridge | 167:e84263d55307 | 96 | { |
AnnaBridge | 174:b96e65c34a4d | 97 | uint32_t time_cur; |
AnnaBridge | 174:b96e65c34a4d | 98 | uint32_t time_cnt; |
AnnaBridge | 167:e84263d55307 | 99 | |
AnnaBridge | 173:e131a1973e81 | 100 | HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId); |
AnnaBridge | 174:b96e65c34a4d | 101 | time_cur = us_ticker_read(); |
AnnaBridge | 174:b96e65c34a4d | 102 | if (timestamp > time_cur + TIMER_TICK_US) { |
AnnaBridge | 174:b96e65c34a4d | 103 | time_cnt = timestamp - time_cur; |
AnnaBridge | 167:e84263d55307 | 104 | } else { |
AnnaBridge | 173:e131a1973e81 | 105 | HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, 0xffffffff); |
AnnaBridge | 173:e131a1973e81 | 106 | HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId); |
AnnaBridge | 174:b96e65c34a4d | 107 | us_ticker_fire_interrupt(); |
AnnaBridge | 173:e131a1973e81 | 108 | return; |
AnnaBridge | 174:b96e65c34a4d | 109 | } |
AnnaBridge | 167:e84263d55307 | 110 | |
AnnaBridge | 174:b96e65c34a4d | 111 | TimerAdapter.TimerLoadValueUs = MAX(MS_TO_TICK(time_cnt/1000) + US_TO_TICK(time_cnt%1000), 1); |
AnnaBridge | 174:b96e65c34a4d | 112 | HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs); |
AnnaBridge | 167:e84263d55307 | 113 | HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId); |
AnnaBridge | 167:e84263d55307 | 114 | } |
AnnaBridge | 167:e84263d55307 | 115 | |
AnnaBridge | 174:b96e65c34a4d | 116 | void us_ticker_fire_interrupt(void) |
AnnaBridge | 174:b96e65c34a4d | 117 | { |
AnnaBridge | 174:b96e65c34a4d | 118 | NVIC_SetPendingIRQ(TIMER2_7_IRQ); |
AnnaBridge | 174:b96e65c34a4d | 119 | } |
AnnaBridge | 174:b96e65c34a4d | 120 | |
AnnaBridge | 174:b96e65c34a4d | 121 | void us_ticker_disable_interrupt(void) |
AnnaBridge | 167:e84263d55307 | 122 | { |
AnnaBridge | 167:e84263d55307 | 123 | HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId); |
AnnaBridge | 167:e84263d55307 | 124 | } |
AnnaBridge | 167:e84263d55307 | 125 | |
AnnaBridge | 174:b96e65c34a4d | 126 | void us_ticker_clear_interrupt(void) |
AnnaBridge | 167:e84263d55307 | 127 | { |
AnnaBridge | 167:e84263d55307 | 128 | HalTimerOp.HalTimerIrqClear((u32)TimerAdapter.TimerId); |
AnnaBridge | 167:e84263d55307 | 129 | } |