mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Mon Oct 02 15:33:19 2017 +0100
Revision:
174:b96e65c34a4d
Parent:
173:e131a1973e81
Child:
177:d650f5d4c87a
This updates the lib to the mbed lib v 152

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 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 }