Genadi Zawidowski / mbed-dev

Dependents:   IGLOO_board

Fork of mbed-dev by mbed official

Committer:
AnnaBridge
Date:
Thu Nov 23 11:57:25 2017 +0000
Revision:
178:79309dc6340a
Parent:
177:d650f5d4c87a
mbed-dev library. Release version 156

Who changed what in which revision?

UserRevisionLine numberNew 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 174:b96e65c34a4d 22 #define SYS_TIM_ID 1 // the G-Timer ID for System
AnnaBridge 177:d650f5d4c87a 23 #define APP_TIM_ID 2 // the G-Timer ID for Application
AnnaBridge 174:b96e65c34a4d 24
AnnaBridge 174:b96e65c34a4d 25 /*
AnnaBridge 174:b96e65c34a4d 26 * For RTL8195AM, clock source is 32k
AnnaBridge 174:b96e65c34a4d 27 *
AnnaBridge 174:b96e65c34a4d 28 * us per tick: 30.5
AnnaBridge 174:b96e65c34a4d 29 * tick per ms: 32.7
AnnaBridge 174:b96e65c34a4d 30 * tick per us: 0.032
AnnaBridge 174:b96e65c34a4d 31 * tick per sec: 32768
AnnaBridge 174:b96e65c34a4d 32 *
AnnaBridge 174:b96e65c34a4d 33 * Define the following macros to convert between TICK and US.
AnnaBridge 174:b96e65c34a4d 34 */
AnnaBridge 174:b96e65c34a4d 35 #define TICK_TO_US(x) (uint64_t)(((x)/2) * 61 + ((x)%2) * TIMER_TICK_US)
AnnaBridge 167:e84263d55307 36
AnnaBridge 167:e84263d55307 37 static int us_ticker_inited = 0;
AnnaBridge 167:e84263d55307 38 static TIMER_ADAPTER TimerAdapter;
AnnaBridge 167:e84263d55307 39
AnnaBridge 167:e84263d55307 40 extern HAL_TIMER_OP HalTimerOp;
AnnaBridge 167:e84263d55307 41 extern HAL_TIMER_OP_EXT HalTimerOpExt;
AnnaBridge 167:e84263d55307 42
AnnaBridge 174:b96e65c34a4d 43 VOID _us_ticker_irq_handler(void *Data)
AnnaBridge 167:e84263d55307 44 {
AnnaBridge 167:e84263d55307 45 us_ticker_irq_handler();
AnnaBridge 167:e84263d55307 46 }
AnnaBridge 167:e84263d55307 47
AnnaBridge 174:b96e65c34a4d 48 void us_ticker_init(void)
AnnaBridge 167:e84263d55307 49 {
AnnaBridge 174:b96e65c34a4d 50 if (us_ticker_inited) {
AnnaBridge 174:b96e65c34a4d 51 return;
AnnaBridge 174:b96e65c34a4d 52 }
AnnaBridge 174:b96e65c34a4d 53
AnnaBridge 167:e84263d55307 54 us_ticker_inited = 1;
AnnaBridge 167:e84263d55307 55
AnnaBridge 174:b96e65c34a4d 56 // Reload and restart sys-timer
AnnaBridge 174:b96e65c34a4d 57 HalTimerOp.HalTimerDis(SYS_TIM_ID);
AnnaBridge 174:b96e65c34a4d 58 HalTimerOpExt.HalTimerReLoad(SYS_TIM_ID, 0xFFFFFFFFUL);
AnnaBridge 174:b96e65c34a4d 59 HalTimerOp.HalTimerEn(SYS_TIM_ID);
AnnaBridge 174:b96e65c34a4d 60
AnnaBridge 174:b96e65c34a4d 61 // Initial a app-timer
AnnaBridge 167:e84263d55307 62 TimerAdapter.IrqDis = 0; // Enable Irq @ initial
AnnaBridge 167:e84263d55307 63 TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) _us_ticker_irq_handler;
AnnaBridge 167:e84263d55307 64 TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ;
AnnaBridge 167:e84263d55307 65 TimerAdapter.IrqHandle.Priority = 10;
AnnaBridge 167:e84263d55307 66 TimerAdapter.IrqHandle.Data = (u32)NULL;
AnnaBridge 167:e84263d55307 67 TimerAdapter.TimerId = APP_TIM_ID;
AnnaBridge 167:e84263d55307 68 TimerAdapter.TimerIrqPriority = 0;
AnnaBridge 167:e84263d55307 69 TimerAdapter.TimerLoadValueUs = 0xFFFFFFFF;
AnnaBridge 167:e84263d55307 70 TimerAdapter.TimerMode = USER_DEFINED;
AnnaBridge 167:e84263d55307 71
AnnaBridge 174:b96e65c34a4d 72 HalTimerOp.HalTimerInit((void *) &TimerAdapter);
AnnaBridge 167:e84263d55307 73 }
AnnaBridge 167:e84263d55307 74
AnnaBridge 174:b96e65c34a4d 75 uint32_t us_ticker_read(void)
AnnaBridge 167:e84263d55307 76 {
AnnaBridge 167:e84263d55307 77 uint32_t tick_cnt;
AnnaBridge 174:b96e65c34a4d 78
AnnaBridge 174:b96e65c34a4d 79 if (!us_ticker_inited) {
AnnaBridge 174:b96e65c34a4d 80 us_ticker_init();
AnnaBridge 174:b96e65c34a4d 81 }
AnnaBridge 167:e84263d55307 82
AnnaBridge 167:e84263d55307 83 tick_cnt = HalTimerOp.HalTimerReadCount(SYS_TIM_ID);
AnnaBridge 178:79309dc6340a 84 return (uint32_t)TICK_TO_US(0xFFFFFFFFUL - tick_cnt);
AnnaBridge 167:e84263d55307 85 }
AnnaBridge 167:e84263d55307 86
AnnaBridge 174:b96e65c34a4d 87 void us_ticker_set_interrupt(timestamp_t timestamp)
AnnaBridge 167:e84263d55307 88 {
AnnaBridge 174:b96e65c34a4d 89 uint32_t time_cur;
AnnaBridge 167:e84263d55307 90
AnnaBridge 174:b96e65c34a4d 91 time_cur = us_ticker_read();
AnnaBridge 174:b96e65c34a4d 92 if (timestamp > time_cur + TIMER_TICK_US) {
AnnaBridge 178:79309dc6340a 93 TimerAdapter.TimerLoadValueUs = timestamp - time_cur;
AnnaBridge 167:e84263d55307 94 } else {
AnnaBridge 178:79309dc6340a 95 TimerAdapter.TimerLoadValueUs = TIMER_TICK_US;
AnnaBridge 174:b96e65c34a4d 96 }
AnnaBridge 167:e84263d55307 97
AnnaBridge 178:79309dc6340a 98 HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
AnnaBridge 174:b96e65c34a4d 99 HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs);
AnnaBridge 178:79309dc6340a 100 HalTimerOpExt.HalTimerSync(SYS_TIM_ID);
AnnaBridge 167:e84263d55307 101 HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId);
AnnaBridge 167:e84263d55307 102 }
AnnaBridge 167:e84263d55307 103
AnnaBridge 174:b96e65c34a4d 104 void us_ticker_fire_interrupt(void)
AnnaBridge 174:b96e65c34a4d 105 {
AnnaBridge 178:79309dc6340a 106 TimerAdapter.TimerLoadValueUs = TIMER_TICK_US;
AnnaBridge 178:79309dc6340a 107
AnnaBridge 178:79309dc6340a 108 HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
AnnaBridge 178:79309dc6340a 109 HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs);
AnnaBridge 178:79309dc6340a 110 HalTimerOpExt.HalTimerSync(SYS_TIM_ID);
AnnaBridge 178:79309dc6340a 111 HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId);
AnnaBridge 174:b96e65c34a4d 112 }
AnnaBridge 174:b96e65c34a4d 113
AnnaBridge 174:b96e65c34a4d 114 void us_ticker_disable_interrupt(void)
AnnaBridge 167:e84263d55307 115 {
AnnaBridge 167:e84263d55307 116 HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
AnnaBridge 167:e84263d55307 117 }
AnnaBridge 167:e84263d55307 118
AnnaBridge 174:b96e65c34a4d 119 void us_ticker_clear_interrupt(void)
AnnaBridge 167:e84263d55307 120 {
AnnaBridge 167:e84263d55307 121 }