1*c894dca1SMatthias Ringwald /*******************************************************************************
2*c894dca1SMatthias Ringwald * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
3*c894dca1SMatthias Ringwald * Author: Ismail H. Kose <[email protected]>
4*c894dca1SMatthias Ringwald *
5*c894dca1SMatthias Ringwald * Permission is hereby granted, free of charge, to any person obtaining a
6*c894dca1SMatthias Ringwald * copy of this software and associated documentation files (the "Software"),
7*c894dca1SMatthias Ringwald * to deal in the Software without restriction, including without limitation
8*c894dca1SMatthias Ringwald * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*c894dca1SMatthias Ringwald * and/or sell copies of the Software, and to permit persons to whom the
10*c894dca1SMatthias Ringwald * Software is furnished to do so, subject to the following conditions:
11*c894dca1SMatthias Ringwald *
12*c894dca1SMatthias Ringwald * The above copyright notice and this permission notice shall be included
13*c894dca1SMatthias Ringwald * in all copies or substantial portions of the Software.
14*c894dca1SMatthias Ringwald *
15*c894dca1SMatthias Ringwald * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*c894dca1SMatthias Ringwald * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*c894dca1SMatthias Ringwald * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*c894dca1SMatthias Ringwald * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
19*c894dca1SMatthias Ringwald * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*c894dca1SMatthias Ringwald * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*c894dca1SMatthias Ringwald * OTHER DEALINGS IN THE SOFTWARE.
22*c894dca1SMatthias Ringwald *
23*c894dca1SMatthias Ringwald * Except as contained in this notice, the name of Maxim Integrated
24*c894dca1SMatthias Ringwald * Products, Inc. shall not be used except as stated in the Maxim Integrated
25*c894dca1SMatthias Ringwald * Products, Inc. Branding Policy.
26*c894dca1SMatthias Ringwald *
27*c894dca1SMatthias Ringwald * The mere transfer of this software does not imply any licenses
28*c894dca1SMatthias Ringwald * of trade secrets, proprietary technology, copyrights, patents,
29*c894dca1SMatthias Ringwald * trademarks, maskwork rights, or any other form of intellectual
30*c894dca1SMatthias Ringwald * property whatsoever. Maxim Integrated Products, Inc. retains all
31*c894dca1SMatthias Ringwald * ownership rights.
32*c894dca1SMatthias Ringwald *******************************************************************************
33*c894dca1SMatthias Ringwald */
34*c894dca1SMatthias Ringwald
35*c894dca1SMatthias Ringwald #include <stdio.h>
36*c894dca1SMatthias Ringwald #include "board.h"
37*c894dca1SMatthias Ringwald
38*c894dca1SMatthias Ringwald /***** Definitions *****/
39*c894dca1SMatthias Ringwald #define USE_RTC_SYSTEM_CLK 0
40*c894dca1SMatthias Ringwald #define SYSTICK_PERIOD_EXT_CLK 32767
41*c894dca1SMatthias Ringwald
42*c894dca1SMatthias Ringwald /* Trigger interrupt every second */
43*c894dca1SMatthias Ringwald static const uint32_t sysTicks = SYSTICK_PERIOD_EXT_CLK;
44*c894dca1SMatthias Ringwald static volatile uint32_t sys_tick_sec = 0;
45*c894dca1SMatthias Ringwald
hal_tick_init(void)46*c894dca1SMatthias Ringwald int32_t hal_tick_init(void)
47*c894dca1SMatthias Ringwald {
48*c894dca1SMatthias Ringwald uint32_t ret;
49*c894dca1SMatthias Ringwald ret = SYS_SysTick_Config(sysTicks, USE_RTC_SYSTEM_CLK);
50*c894dca1SMatthias Ringwald printf("SysTick Clock = %d Hz\n", SYS_SysTick_GetFreq());
51*c894dca1SMatthias Ringwald if(ret != E_NO_ERROR) {
52*c894dca1SMatthias Ringwald printf("ERROR: Ticks is not valid");
53*c894dca1SMatthias Ringwald }
54*c894dca1SMatthias Ringwald
55*c894dca1SMatthias Ringwald return ret;
56*c894dca1SMatthias Ringwald }
57*c894dca1SMatthias Ringwald
SysTick_Handler(void)58*c894dca1SMatthias Ringwald void SysTick_Handler(void)
59*c894dca1SMatthias Ringwald {
60*c894dca1SMatthias Ringwald sys_tick_sec++;
61*c894dca1SMatthias Ringwald }
62*c894dca1SMatthias Ringwald
hal_get_tick(void)63*c894dca1SMatthias Ringwald uint64_t hal_get_tick(void)
64*c894dca1SMatthias Ringwald {
65*c894dca1SMatthias Ringwald uint32_t usec_tick;
66*c894dca1SMatthias Ringwald uint64_t tick_sec;
67*c894dca1SMatthias Ringwald uint32_t systick_val = SysTick->VAL;
68*c894dca1SMatthias Ringwald uint32_t _sys_tick_sec = sys_tick_sec;
69*c894dca1SMatthias Ringwald uint32_t sys_freq = SYS_SysTick_GetFreq();
70*c894dca1SMatthias Ringwald
71*c894dca1SMatthias Ringwald usec_tick = ((uint64_t)(sysTicks - systick_val) * 1000000) / sys_freq;
72*c894dca1SMatthias Ringwald if (systick_val == 0) // to protect time overflow
73*c894dca1SMatthias Ringwald _sys_tick_sec -= 1;
74*c894dca1SMatthias Ringwald tick_sec = _sys_tick_sec * 1000000 + usec_tick;
75*c894dca1SMatthias Ringwald return tick_sec;
76*c894dca1SMatthias Ringwald }
77*c894dca1SMatthias Ringwald
hal_delay_ms(unsigned int ms)78*c894dca1SMatthias Ringwald void hal_delay_ms(unsigned int ms)
79*c894dca1SMatthias Ringwald {
80*c894dca1SMatthias Ringwald uint64_t prev_tick = hal_get_tick();
81*c894dca1SMatthias Ringwald uint64_t wait_time = ms * 1000;
82*c894dca1SMatthias Ringwald uint64_t curr_tick;
83*c894dca1SMatthias Ringwald int64_t diff;
84*c894dca1SMatthias Ringwald
85*c894dca1SMatthias Ringwald while(1) {
86*c894dca1SMatthias Ringwald curr_tick = hal_get_tick();
87*c894dca1SMatthias Ringwald diff = curr_tick - prev_tick;
88*c894dca1SMatthias Ringwald if (diff > wait_time) {
89*c894dca1SMatthias Ringwald break;
90*c894dca1SMatthias Ringwald }
91*c894dca1SMatthias Ringwald }
92*c894dca1SMatthias Ringwald }
93*c894dca1SMatthias Ringwald
hal_delay_us(unsigned int us)94*c894dca1SMatthias Ringwald void hal_delay_us(unsigned int us)
95*c894dca1SMatthias Ringwald {
96*c894dca1SMatthias Ringwald uint64_t prev_tick = hal_get_tick();
97*c894dca1SMatthias Ringwald uint64_t wait_time = us;
98*c894dca1SMatthias Ringwald uint64_t curr_tick;
99*c894dca1SMatthias Ringwald int64_t diff;
100*c894dca1SMatthias Ringwald
101*c894dca1SMatthias Ringwald while(1) {
102*c894dca1SMatthias Ringwald curr_tick = hal_get_tick();
103*c894dca1SMatthias Ringwald diff = curr_tick - prev_tick;
104*c894dca1SMatthias Ringwald if (diff > wait_time) {
105*c894dca1SMatthias Ringwald break;
106*c894dca1SMatthias Ringwald }
107*c894dca1SMatthias Ringwald }
108*c894dca1SMatthias Ringwald }
109*c894dca1SMatthias Ringwald
hal_get_time_ms(void)110*c894dca1SMatthias Ringwald uint32_t hal_get_time_ms(void)
111*c894dca1SMatthias Ringwald {
112*c894dca1SMatthias Ringwald uint32_t usec_tick;
113*c894dca1SMatthias Ringwald uint64_t tick_sec;
114*c894dca1SMatthias Ringwald uint32_t systick_val = SysTick->VAL;
115*c894dca1SMatthias Ringwald uint32_t _sys_tick_sec = sys_tick_sec;
116*c894dca1SMatthias Ringwald uint32_t sys_freq = SYS_SysTick_GetFreq();
117*c894dca1SMatthias Ringwald
118*c894dca1SMatthias Ringwald usec_tick = ((uint64_t)(sysTicks - systick_val) * 1000) / sys_freq;
119*c894dca1SMatthias Ringwald if (systick_val == 0) // to protect time overflow
120*c894dca1SMatthias Ringwald _sys_tick_sec -= 1;
121*c894dca1SMatthias Ringwald tick_sec = _sys_tick_sec * 1000 + usec_tick;
122*c894dca1SMatthias Ringwald return tick_sec;
123*c894dca1SMatthias Ringwald }
124*c894dca1SMatthias Ringwald
hal_time_ms(void)125*c894dca1SMatthias Ringwald uint32_t hal_time_ms(void)
126*c894dca1SMatthias Ringwald {
127*c894dca1SMatthias Ringwald return hal_get_time_ms();
128*c894dca1SMatthias Ringwald }
129