mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Sep 25 14:15:10 2015 +0100
Revision:
627:4fa1328d9c60
Parent:
550:787824fdf8f9
Synchronized with git revision fe238a91ab7a4d1d72c4cab9da04967c619d54ad

Full URL: https://github.com/mbedmicro/mbed/commit/fe238a91ab7a4d1d72c4cab9da04967c619d54ad/

Silicon Labs - Add support for low-power async Serial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 627:4fa1328d9c60 1 /***************************************************************************//**
mbed_official 627:4fa1328d9c60 2 * @file rtc_api.c
mbed_official 627:4fa1328d9c60 3 *******************************************************************************
mbed_official 627:4fa1328d9c60 4 * @section License
mbed_official 627:4fa1328d9c60 5 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
mbed_official 627:4fa1328d9c60 6 *******************************************************************************
mbed_official 525:c320967f86b9 7 *
mbed_official 627:4fa1328d9c60 8 * Permission is granted to anyone to use this software for any purpose,
mbed_official 627:4fa1328d9c60 9 * including commercial applications, and to alter it and redistribute it
mbed_official 627:4fa1328d9c60 10 * freely, subject to the following restrictions:
mbed_official 525:c320967f86b9 11 *
mbed_official 627:4fa1328d9c60 12 * 1. The origin of this software must not be misrepresented; you must not
mbed_official 627:4fa1328d9c60 13 * claim that you wrote the original software.
mbed_official 627:4fa1328d9c60 14 * 2. Altered source versions must be plainly marked as such, and must not be
mbed_official 627:4fa1328d9c60 15 * misrepresented as being the original software.
mbed_official 627:4fa1328d9c60 16 * 3. This notice may not be removed or altered from any source distribution.
mbed_official 525:c320967f86b9 17 *
mbed_official 627:4fa1328d9c60 18 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
mbed_official 627:4fa1328d9c60 19 * obligation to support this Software. Silicon Labs is providing the
mbed_official 627:4fa1328d9c60 20 * Software "AS IS", with no express or implied warranties of any kind,
mbed_official 627:4fa1328d9c60 21 * including, but not limited to, any implied warranties of merchantability
mbed_official 627:4fa1328d9c60 22 * or fitness for any particular purpose or warranties against infringement
mbed_official 627:4fa1328d9c60 23 * of any proprietary rights of a third party.
mbed_official 627:4fa1328d9c60 24 *
mbed_official 627:4fa1328d9c60 25 * Silicon Labs will not be liable for any consequential, incidental, or
mbed_official 627:4fa1328d9c60 26 * special damages, or any other relief, or for any claim by any third party,
mbed_official 627:4fa1328d9c60 27 * arising from your use of this Software.
mbed_official 627:4fa1328d9c60 28 *
mbed_official 627:4fa1328d9c60 29 ******************************************************************************/
mbed_official 525:c320967f86b9 30
mbed_official 525:c320967f86b9 31 #include "device.h"
mbed_official 525:c320967f86b9 32 #if DEVICE_RTC
mbed_official 525:c320967f86b9 33
mbed_official 525:c320967f86b9 34 #include "rtc_api.h"
mbed_official 525:c320967f86b9 35 #include "rtc_api_HAL.h"
mbed_official 525:c320967f86b9 36 #include "em_cmu.h"
mbed_official 525:c320967f86b9 37 #include "em_rtc.h"
mbed_official 525:c320967f86b9 38 #include "sleep_api.h"
mbed_official 526:7c4bdfe6a168 39 #include "sleepmodes.h"
mbed_official 525:c320967f86b9 40
mbed_official 550:787824fdf8f9 41 static bool rtc_inited = false;
mbed_official 550:787824fdf8f9 42 static time_t time_base = 0;
mbed_official 550:787824fdf8f9 43 static uint32_t useflags = 0;
mbed_official 550:787824fdf8f9 44 static uint32_t time_extend = 0;
mbed_official 525:c320967f86b9 45
mbed_official 548:1abac31e188e 46 static void (*comp0_handler)(void) = NULL;
mbed_official 525:c320967f86b9 47
mbed_official 550:787824fdf8f9 48 #define RTC_LEAST_ACTIVE_SLEEPMODE EM2
mbed_official 550:787824fdf8f9 49 #define RTC_NUM_BITS (24)
mbed_official 525:c320967f86b9 50
mbed_official 525:c320967f86b9 51 void RTC_IRQHandler(void)
mbed_official 525:c320967f86b9 52 {
mbed_official 525:c320967f86b9 53 uint32_t flags;
mbed_official 525:c320967f86b9 54 flags = RTC_IntGet();
mbed_official 548:1abac31e188e 55 if (flags & RTC_IF_OF) {
mbed_official 525:c320967f86b9 56 RTC_IntClear(RTC_IF_OF);
mbed_official 550:787824fdf8f9 57 /* RTC has overflowed (24 bits). Use time_extend as software counter for 32 more bits. */
mbed_official 550:787824fdf8f9 58 time_extend += 1;
mbed_official 525:c320967f86b9 59 }
mbed_official 548:1abac31e188e 60 if (flags & RTC_IF_COMP0) {
mbed_official 525:c320967f86b9 61 RTC_IntClear(RTC_IF_COMP0);
mbed_official 548:1abac31e188e 62 if (comp0_handler != NULL) {
mbed_official 525:c320967f86b9 63 comp0_handler();
mbed_official 525:c320967f86b9 64 }
mbed_official 525:c320967f86b9 65 }
mbed_official 525:c320967f86b9 66 }
mbed_official 525:c320967f86b9 67
mbed_official 550:787824fdf8f9 68 uint32_t rtc_get_32bit(void)
mbed_official 550:787824fdf8f9 69 {
mbed_official 550:787824fdf8f9 70 return (RTC_CounterGet() + (time_extend << RTC_NUM_BITS));
mbed_official 550:787824fdf8f9 71 }
mbed_official 550:787824fdf8f9 72
mbed_official 550:787824fdf8f9 73 uint64_t rtc_get_full(void)
mbed_official 550:787824fdf8f9 74 {
mbed_official 550:787824fdf8f9 75 uint64_t ticks = 0;
mbed_official 550:787824fdf8f9 76 ticks += time_extend;
mbed_official 550:787824fdf8f9 77 ticks = ticks << RTC_NUM_BITS;
mbed_official 550:787824fdf8f9 78 ticks += RTC_CounterGet();
mbed_official 550:787824fdf8f9 79 return ticks;
mbed_official 550:787824fdf8f9 80 }
mbed_official 550:787824fdf8f9 81
mbed_official 525:c320967f86b9 82 void rtc_set_comp0_handler(uint32_t handler)
mbed_official 525:c320967f86b9 83 {
mbed_official 525:c320967f86b9 84 comp0_handler = (void (*)(void)) handler;
mbed_official 525:c320967f86b9 85 }
mbed_official 525:c320967f86b9 86
mbed_official 548:1abac31e188e 87 void rtc_init(void)
mbed_official 525:c320967f86b9 88 {
mbed_official 525:c320967f86b9 89 /* Register that the RTC is used for timekeeping. */
mbed_official 525:c320967f86b9 90 rtc_init_real(RTC_INIT_RTC);
mbed_official 525:c320967f86b9 91 }
mbed_official 525:c320967f86b9 92
mbed_official 525:c320967f86b9 93
mbed_official 525:c320967f86b9 94 void rtc_init_real(uint32_t flags)
mbed_official 525:c320967f86b9 95 {
mbed_official 525:c320967f86b9 96 useflags |= flags;
mbed_official 525:c320967f86b9 97
mbed_official 548:1abac31e188e 98 if (!rtc_inited) {
mbed_official 525:c320967f86b9 99 CMU_ClockEnable(cmuClock_RTC, true);
mbed_official 525:c320967f86b9 100
mbed_official 525:c320967f86b9 101 /* Enable clock to the interface of the low energy modules */
mbed_official 525:c320967f86b9 102 CMU_ClockEnable(cmuClock_CORELE, true);
mbed_official 525:c320967f86b9 103
mbed_official 525:c320967f86b9 104 /* Scale clock to save power */
mbed_official 525:c320967f86b9 105 CMU_ClockDivSet(cmuClock_RTC, RTC_CLOCKDIV);
mbed_official 525:c320967f86b9 106
mbed_official 525:c320967f86b9 107 /* Initialize RTC */
mbed_official 525:c320967f86b9 108 RTC_Init_TypeDef init = RTC_INIT_DEFAULT;
mbed_official 525:c320967f86b9 109 init.enable = 1;
mbed_official 525:c320967f86b9 110 /* Don't use compare register 0 as top value */
mbed_official 525:c320967f86b9 111 init.comp0Top = 0;
mbed_official 525:c320967f86b9 112
mbed_official 525:c320967f86b9 113 /* Enable Interrupt from RTC */
mbed_official 525:c320967f86b9 114 RTC_IntEnable(RTC_IEN_OF);
mbed_official 525:c320967f86b9 115 NVIC_EnableIRQ(RTC_IRQn);
mbed_official 525:c320967f86b9 116 NVIC_SetVector(RTC_IRQn, (uint32_t)RTC_IRQHandler);
mbed_official 525:c320967f86b9 117
mbed_official 525:c320967f86b9 118 /* Initialize */
mbed_official 525:c320967f86b9 119 RTC_Init(&init);
mbed_official 525:c320967f86b9 120
mbed_official 525:c320967f86b9 121 blockSleepMode(RTC_LEAST_ACTIVE_SLEEPMODE);
mbed_official 525:c320967f86b9 122 rtc_inited = true;
mbed_official 525:c320967f86b9 123 }
mbed_official 525:c320967f86b9 124 }
mbed_official 525:c320967f86b9 125
mbed_official 548:1abac31e188e 126 void rtc_free(void)
mbed_official 525:c320967f86b9 127 {
mbed_official 525:c320967f86b9 128 rtc_free_real(RTC_INIT_RTC);
mbed_official 525:c320967f86b9 129 }
mbed_official 525:c320967f86b9 130
mbed_official 525:c320967f86b9 131 void rtc_free_real(uint32_t flags)
mbed_official 525:c320967f86b9 132 {
mbed_official 525:c320967f86b9 133 /* Clear use flag */
mbed_official 627:4fa1328d9c60 134 useflags &= ~flags;
mbed_official 525:c320967f86b9 135
mbed_official 525:c320967f86b9 136 /* Disable the RTC if it was inited and is no longer in use by anyone. */
mbed_official 627:4fa1328d9c60 137 if (rtc_inited && (useflags == 0)) {
mbed_official 525:c320967f86b9 138 NVIC_DisableIRQ(RTC_IRQn);
mbed_official 525:c320967f86b9 139 RTC_Reset();
mbed_official 525:c320967f86b9 140 CMU_ClockEnable(cmuClock_RTC, false);
mbed_official 525:c320967f86b9 141 unblockSleepMode(RTC_LEAST_ACTIVE_SLEEPMODE);
mbed_official 525:c320967f86b9 142 rtc_inited = false;
mbed_official 525:c320967f86b9 143 }
mbed_official 525:c320967f86b9 144 }
mbed_official 525:c320967f86b9 145
mbed_official 525:c320967f86b9 146 int rtc_isenabled(void)
mbed_official 525:c320967f86b9 147 {
mbed_official 525:c320967f86b9 148 return rtc_inited;
mbed_official 525:c320967f86b9 149 }
mbed_official 525:c320967f86b9 150
mbed_official 525:c320967f86b9 151 time_t rtc_read(void)
mbed_official 525:c320967f86b9 152 {
mbed_official 550:787824fdf8f9 153 return (time_t) (rtc_get_full() >> RTC_FREQ_SHIFT) + time_base;
mbed_official 550:787824fdf8f9 154 }
mbed_official 550:787824fdf8f9 155
mbed_official 550:787824fdf8f9 156 time_t rtc_read_uncompensated(void)
mbed_official 550:787824fdf8f9 157 {
mbed_official 550:787824fdf8f9 158 return (time_t) (rtc_get_full() >> RTC_FREQ_SHIFT);
mbed_official 525:c320967f86b9 159 }
mbed_official 525:c320967f86b9 160
mbed_official 525:c320967f86b9 161 void rtc_write(time_t t)
mbed_official 525:c320967f86b9 162 {
mbed_official 525:c320967f86b9 163 /* We have to check that the RTC did not tick while doing this. */
mbed_official 525:c320967f86b9 164 /* If the RTC ticks we just redo this. */
mbed_official 550:787824fdf8f9 165 uint32_t time;
mbed_official 525:c320967f86b9 166 do {
mbed_official 550:787824fdf8f9 167 time = rtc_read_uncompensated();
mbed_official 550:787824fdf8f9 168 time_base = t - time;
mbed_official 550:787824fdf8f9 169 } while (time != rtc_read_uncompensated());
mbed_official 525:c320967f86b9 170 }
mbed_official 525:c320967f86b9 171
mbed_official 525:c320967f86b9 172 #endif