mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon Nov 09 13:30:11 2015 +0000
Revision:
18:da299f395b9e
Parent:
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM0P/drivers/rtc/rtc_sam_d_r/rtc_count.c@15:a81a8d6c1dfe
Synchronized with git revision f605825f66bb2e462ff7dbc5fb4ed2dbe979d1c3

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

Added support for SAML21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 15:a81a8d6c1dfe 1 /**
mbed_official 15:a81a8d6c1dfe 2 * \file
mbed_official 15:a81a8d6c1dfe 3 *
mbed_official 15:a81a8d6c1dfe 4 * \brief SAM RTC Driver (Count Mode)
mbed_official 15:a81a8d6c1dfe 5 *
mbed_official 15:a81a8d6c1dfe 6 * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved.
mbed_official 15:a81a8d6c1dfe 7 *
mbed_official 15:a81a8d6c1dfe 8 * \asf_license_start
mbed_official 15:a81a8d6c1dfe 9 *
mbed_official 15:a81a8d6c1dfe 10 * \page License
mbed_official 15:a81a8d6c1dfe 11 *
mbed_official 15:a81a8d6c1dfe 12 * Redistribution and use in source and binary forms, with or without
mbed_official 15:a81a8d6c1dfe 13 * modification, are permitted provided that the following conditions are met:
mbed_official 15:a81a8d6c1dfe 14 *
mbed_official 15:a81a8d6c1dfe 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 15:a81a8d6c1dfe 16 * this list of conditions and the following disclaimer.
mbed_official 15:a81a8d6c1dfe 17 *
mbed_official 15:a81a8d6c1dfe 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 15:a81a8d6c1dfe 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 15:a81a8d6c1dfe 20 * and/or other materials provided with the distribution.
mbed_official 15:a81a8d6c1dfe 21 *
mbed_official 15:a81a8d6c1dfe 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 15:a81a8d6c1dfe 23 * from this software without specific prior written permission.
mbed_official 15:a81a8d6c1dfe 24 *
mbed_official 15:a81a8d6c1dfe 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 15:a81a8d6c1dfe 26 * Atmel microcontroller product.
mbed_official 15:a81a8d6c1dfe 27 *
mbed_official 15:a81a8d6c1dfe 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 15:a81a8d6c1dfe 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 15:a81a8d6c1dfe 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 15:a81a8d6c1dfe 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 15:a81a8d6c1dfe 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 15:a81a8d6c1dfe 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 15:a81a8d6c1dfe 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 15:a81a8d6c1dfe 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 15:a81a8d6c1dfe 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 15:a81a8d6c1dfe 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 15:a81a8d6c1dfe 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 15:a81a8d6c1dfe 39 *
mbed_official 15:a81a8d6c1dfe 40 * \asf_license_stop
mbed_official 15:a81a8d6c1dfe 41 *
mbed_official 15:a81a8d6c1dfe 42 */
mbed_official 15:a81a8d6c1dfe 43 /*
mbed_official 15:a81a8d6c1dfe 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 15:a81a8d6c1dfe 45 */
mbed_official 15:a81a8d6c1dfe 46 #include "rtc_count.h"
mbed_official 15:a81a8d6c1dfe 47 #include <gclk.h>
mbed_official 15:a81a8d6c1dfe 48
mbed_official 15:a81a8d6c1dfe 49 #if !defined(__DOXYGEN__)
mbed_official 15:a81a8d6c1dfe 50 struct rtc_module *_rtc_instance[RTC_INST_NUM];
mbed_official 15:a81a8d6c1dfe 51 #endif
mbed_official 15:a81a8d6c1dfe 52
mbed_official 15:a81a8d6c1dfe 53 /**
mbed_official 15:a81a8d6c1dfe 54 * \brief Determines if the hardware module(s) are currently synchronizing to the bus.
mbed_official 15:a81a8d6c1dfe 55 *
mbed_official 15:a81a8d6c1dfe 56 * Checks to see if the underlying hardware peripheral module(s) are currently
mbed_official 15:a81a8d6c1dfe 57 * synchronizing across multiple clock domains to the hardware bus, This
mbed_official 15:a81a8d6c1dfe 58 * function can be used to delay further operations on a module until such time
mbed_official 15:a81a8d6c1dfe 59 * that it is ready, to prevent blocking delays for synchronization in the
mbed_official 15:a81a8d6c1dfe 60 * user application.
mbed_official 15:a81a8d6c1dfe 61 *
mbed_official 15:a81a8d6c1dfe 62 * \param[in] module RTC hardware module
mbed_official 15:a81a8d6c1dfe 63 *
mbed_official 15:a81a8d6c1dfe 64 * \return Synchronization status of the underlying hardware module(s).
mbed_official 15:a81a8d6c1dfe 65 *
mbed_official 15:a81a8d6c1dfe 66 * \retval true if the module synchronization is ongoing
mbed_official 15:a81a8d6c1dfe 67 * \retval false if the module has completed synchronization
mbed_official 15:a81a8d6c1dfe 68 */
mbed_official 15:a81a8d6c1dfe 69 static bool rtc_count_is_syncing(struct rtc_module *const module)
mbed_official 15:a81a8d6c1dfe 70 {
mbed_official 15:a81a8d6c1dfe 71 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 72 Assert(module);
mbed_official 15:a81a8d6c1dfe 73 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 74
mbed_official 15:a81a8d6c1dfe 75 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 76
mbed_official 15:a81a8d6c1dfe 77 if (rtc_module->MODE0.STATUS.reg & RTC_STATUS_SYNCBUSY) {
mbed_official 15:a81a8d6c1dfe 78 return true;
mbed_official 15:a81a8d6c1dfe 79 }
mbed_official 15:a81a8d6c1dfe 80
mbed_official 15:a81a8d6c1dfe 81 return false;
mbed_official 15:a81a8d6c1dfe 82 }
mbed_official 15:a81a8d6c1dfe 83
mbed_official 15:a81a8d6c1dfe 84 /**
mbed_official 15:a81a8d6c1dfe 85 * \brief Enables the RTC module.
mbed_official 15:a81a8d6c1dfe 86 *
mbed_official 15:a81a8d6c1dfe 87 * Enables the RTC module once it has been configured, ready for use. Most
mbed_official 15:a81a8d6c1dfe 88 * module configuration parameters cannot be altered while the module is enabled.
mbed_official 15:a81a8d6c1dfe 89 *
mbed_official 15:a81a8d6c1dfe 90 * \param[in,out] module RTC hardware module
mbed_official 15:a81a8d6c1dfe 91 */
mbed_official 15:a81a8d6c1dfe 92 void rtc_count_enable(struct rtc_module *const module)
mbed_official 15:a81a8d6c1dfe 93 {
mbed_official 15:a81a8d6c1dfe 94 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 95 Assert(module);
mbed_official 15:a81a8d6c1dfe 96 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 97
mbed_official 15:a81a8d6c1dfe 98 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 99
mbed_official 15:a81a8d6c1dfe 100 #if RTC_COUNT_ASYNC == true
mbed_official 15:a81a8d6c1dfe 101 system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_RTC);
mbed_official 15:a81a8d6c1dfe 102 #endif
mbed_official 15:a81a8d6c1dfe 103
mbed_official 15:a81a8d6c1dfe 104 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 105 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 106 }
mbed_official 15:a81a8d6c1dfe 107
mbed_official 15:a81a8d6c1dfe 108 /* Enable RTC module. */
mbed_official 15:a81a8d6c1dfe 109 rtc_module->MODE0.CTRL.reg |= RTC_MODE0_CTRL_ENABLE;
mbed_official 15:a81a8d6c1dfe 110 }
mbed_official 15:a81a8d6c1dfe 111
mbed_official 15:a81a8d6c1dfe 112 /**
mbed_official 15:a81a8d6c1dfe 113 * \brief Disables the RTC module.
mbed_official 15:a81a8d6c1dfe 114 *
mbed_official 15:a81a8d6c1dfe 115 * Disables the RTC module.
mbed_official 15:a81a8d6c1dfe 116 *
mbed_official 15:a81a8d6c1dfe 117 * \param[in,out] module RTC hardware module
mbed_official 15:a81a8d6c1dfe 118 */
mbed_official 15:a81a8d6c1dfe 119 void rtc_count_disable(struct rtc_module *const module)
mbed_official 15:a81a8d6c1dfe 120 {
mbed_official 15:a81a8d6c1dfe 121 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 122 Assert(module);
mbed_official 15:a81a8d6c1dfe 123 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 124
mbed_official 15:a81a8d6c1dfe 125 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 126
mbed_official 15:a81a8d6c1dfe 127 #if RTC_COUNT_ASYNC == true
mbed_official 15:a81a8d6c1dfe 128 system_interrupt_disable(SYSTEM_INTERRUPT_MODULE_RTC);
mbed_official 15:a81a8d6c1dfe 129 #endif
mbed_official 15:a81a8d6c1dfe 130
mbed_official 15:a81a8d6c1dfe 131 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 132 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 133 }
mbed_official 15:a81a8d6c1dfe 134
mbed_official 15:a81a8d6c1dfe 135 /* Disable RTC module. */
mbed_official 15:a81a8d6c1dfe 136 rtc_module->MODE0.CTRL.reg &= ~RTC_MODE0_CTRL_ENABLE;
mbed_official 15:a81a8d6c1dfe 137 }
mbed_official 15:a81a8d6c1dfe 138
mbed_official 15:a81a8d6c1dfe 139 /**
mbed_official 15:a81a8d6c1dfe 140 * \brief Resets the RTC module.
mbed_official 15:a81a8d6c1dfe 141 * Resets the RTC to hardware defaults.
mbed_official 15:a81a8d6c1dfe 142 *
mbed_official 15:a81a8d6c1dfe 143 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 144 */
mbed_official 15:a81a8d6c1dfe 145 void rtc_count_reset(struct rtc_module *const module)
mbed_official 15:a81a8d6c1dfe 146 {
mbed_official 15:a81a8d6c1dfe 147 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 148 Assert(module);
mbed_official 15:a81a8d6c1dfe 149 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 150
mbed_official 15:a81a8d6c1dfe 151 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 152
mbed_official 15:a81a8d6c1dfe 153 /* Disable module before reset. */
mbed_official 15:a81a8d6c1dfe 154 rtc_count_disable(module);
mbed_official 15:a81a8d6c1dfe 155
mbed_official 15:a81a8d6c1dfe 156 #if RTC_COUNT_ASYNC == true
mbed_official 15:a81a8d6c1dfe 157 module->registered_callback = 0;
mbed_official 15:a81a8d6c1dfe 158 module->enabled_callback = 0;
mbed_official 15:a81a8d6c1dfe 159 #endif
mbed_official 15:a81a8d6c1dfe 160
mbed_official 15:a81a8d6c1dfe 161 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 162 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 163 }
mbed_official 15:a81a8d6c1dfe 164
mbed_official 15:a81a8d6c1dfe 165 /* Initiate software reset. */
mbed_official 15:a81a8d6c1dfe 166 rtc_module->MODE0.CTRL.reg |= RTC_MODE0_CTRL_SWRST;
mbed_official 15:a81a8d6c1dfe 167 }
mbed_official 15:a81a8d6c1dfe 168
mbed_official 15:a81a8d6c1dfe 169 /**
mbed_official 15:a81a8d6c1dfe 170 * \internal Applies the given configuration.
mbed_official 15:a81a8d6c1dfe 171 *
mbed_official 15:a81a8d6c1dfe 172 * Sets the configurations given from the configuration structure to the
mbed_official 15:a81a8d6c1dfe 173 * hardware module.
mbed_official 15:a81a8d6c1dfe 174 *
mbed_official 15:a81a8d6c1dfe 175 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 176 * \param[in] config Pointer to the configuration structure.
mbed_official 15:a81a8d6c1dfe 177 *
mbed_official 15:a81a8d6c1dfe 178 * \return Status of the configuration procedure.
mbed_official 15:a81a8d6c1dfe 179 * \retval STATUS_OK RTC configurations was set successfully.
mbed_official 15:a81a8d6c1dfe 180 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were given.
mbed_official 15:a81a8d6c1dfe 181 */
mbed_official 15:a81a8d6c1dfe 182 static enum status_code _rtc_count_set_config(
mbed_official 15:a81a8d6c1dfe 183 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 184 const struct rtc_count_config *const config)
mbed_official 15:a81a8d6c1dfe 185 {
mbed_official 15:a81a8d6c1dfe 186 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 187 Assert(module);
mbed_official 15:a81a8d6c1dfe 188 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 189
mbed_official 15:a81a8d6c1dfe 190 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 191
mbed_official 15:a81a8d6c1dfe 192 rtc_module->MODE0.CTRL.reg = RTC_MODE0_CTRL_MODE(0) | config->prescaler;
mbed_official 15:a81a8d6c1dfe 193
mbed_official 15:a81a8d6c1dfe 194 /* Set mode and clear on match if applicable. */
mbed_official 15:a81a8d6c1dfe 195 switch (config->mode) {
mbed_official 15:a81a8d6c1dfe 196 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 197 /* Set 32bit mode and clear on match if applicable. */
mbed_official 15:a81a8d6c1dfe 198 rtc_module->MODE0.CTRL.reg |= RTC_MODE0_CTRL_MODE(0);
mbed_official 15:a81a8d6c1dfe 199
mbed_official 15:a81a8d6c1dfe 200 /* Check if clear on compare match should be set. */
mbed_official 15:a81a8d6c1dfe 201 if (config->clear_on_match) {
mbed_official 15:a81a8d6c1dfe 202 /* Set clear on match. */
mbed_official 15:a81a8d6c1dfe 203 rtc_module->MODE0.CTRL.reg |= RTC_MODE0_CTRL_MATCHCLR;
mbed_official 15:a81a8d6c1dfe 204 }
mbed_official 15:a81a8d6c1dfe 205 /* Set compare values. */
mbed_official 15:a81a8d6c1dfe 206 for (uint8_t i = 0; i < RTC_NUM_OF_COMP32; i++) {
mbed_official 15:a81a8d6c1dfe 207 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 208 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 209 }
mbed_official 15:a81a8d6c1dfe 210
mbed_official 15:a81a8d6c1dfe 211 rtc_count_set_compare(module, config->compare_values[i],
mbed_official 15:a81a8d6c1dfe 212 (enum rtc_count_compare)i);
mbed_official 15:a81a8d6c1dfe 213 }
mbed_official 15:a81a8d6c1dfe 214 break;
mbed_official 15:a81a8d6c1dfe 215
mbed_official 15:a81a8d6c1dfe 216 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 217 /* Set 16bit mode. */
mbed_official 15:a81a8d6c1dfe 218 rtc_module->MODE1.CTRL.reg |= RTC_MODE1_CTRL_MODE(1);
mbed_official 15:a81a8d6c1dfe 219
mbed_official 15:a81a8d6c1dfe 220 /* Check if match on clear is set, and return invalid
mbed_official 15:a81a8d6c1dfe 221 * argument if set. */
mbed_official 15:a81a8d6c1dfe 222 if (config->clear_on_match) {
mbed_official 15:a81a8d6c1dfe 223 Assert(false);
mbed_official 15:a81a8d6c1dfe 224 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 225 }
mbed_official 15:a81a8d6c1dfe 226 /* Set compare values. */
mbed_official 15:a81a8d6c1dfe 227 for (uint8_t i = 0; i < RTC_NUM_OF_COMP16; i++) {
mbed_official 15:a81a8d6c1dfe 228 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 229 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 230 }
mbed_official 15:a81a8d6c1dfe 231
mbed_official 15:a81a8d6c1dfe 232 rtc_count_set_compare(module, config->compare_values[i],
mbed_official 15:a81a8d6c1dfe 233 (enum rtc_count_compare)i);
mbed_official 15:a81a8d6c1dfe 234 }
mbed_official 15:a81a8d6c1dfe 235 break;
mbed_official 15:a81a8d6c1dfe 236 default:
mbed_official 15:a81a8d6c1dfe 237 Assert(false);
mbed_official 15:a81a8d6c1dfe 238 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 239 }
mbed_official 15:a81a8d6c1dfe 240
mbed_official 15:a81a8d6c1dfe 241 /* Check to set continuously clock read update mode. */
mbed_official 15:a81a8d6c1dfe 242 if (config->continuously_update) {
mbed_official 15:a81a8d6c1dfe 243 /* Set continuously mode. */
mbed_official 15:a81a8d6c1dfe 244 rtc_module->MODE0.READREQ.reg |= RTC_READREQ_RCONT;
mbed_official 15:a81a8d6c1dfe 245 }
mbed_official 15:a81a8d6c1dfe 246
mbed_official 15:a81a8d6c1dfe 247 /* Return status OK if everything was configured. */
mbed_official 15:a81a8d6c1dfe 248 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 249 }
mbed_official 15:a81a8d6c1dfe 250
mbed_official 15:a81a8d6c1dfe 251 /**
mbed_official 15:a81a8d6c1dfe 252 * \brief Initializes the RTC module with given configurations.
mbed_official 15:a81a8d6c1dfe 253 *
mbed_official 15:a81a8d6c1dfe 254 * Initializes the module, setting up all given configurations to provide
mbed_official 15:a81a8d6c1dfe 255 * the desired functionality of the RTC.
mbed_official 15:a81a8d6c1dfe 256 *
mbed_official 15:a81a8d6c1dfe 257 * \param[out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 258 * \param[in] hw Pointer to hardware instance
mbed_official 15:a81a8d6c1dfe 259 * \param[in] config Pointer to the configuration structure
mbed_official 15:a81a8d6c1dfe 260 *
mbed_official 15:a81a8d6c1dfe 261 * \return Status of the initialization procedure.
mbed_official 15:a81a8d6c1dfe 262 * \retval STATUS_OK If the initialization was run stressfully
mbed_official 15:a81a8d6c1dfe 263 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were given
mbed_official 15:a81a8d6c1dfe 264 */
mbed_official 15:a81a8d6c1dfe 265 enum status_code rtc_count_init(
mbed_official 15:a81a8d6c1dfe 266 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 267 Rtc *const hw,
mbed_official 15:a81a8d6c1dfe 268 const struct rtc_count_config *const config)
mbed_official 15:a81a8d6c1dfe 269 {
mbed_official 15:a81a8d6c1dfe 270 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 271 Assert(module);
mbed_official 15:a81a8d6c1dfe 272 Assert(hw);
mbed_official 15:a81a8d6c1dfe 273 Assert(config);
mbed_official 15:a81a8d6c1dfe 274
mbed_official 15:a81a8d6c1dfe 275 /* Initialize device instance */
mbed_official 15:a81a8d6c1dfe 276 module->hw = hw;
mbed_official 15:a81a8d6c1dfe 277
mbed_official 15:a81a8d6c1dfe 278 /* Turn on the digital interface clock */
mbed_official 15:a81a8d6c1dfe 279 system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBA, PM_APBAMASK_RTC);
mbed_official 15:a81a8d6c1dfe 280
mbed_official 15:a81a8d6c1dfe 281 /* Set up GCLK */
mbed_official 15:a81a8d6c1dfe 282 struct system_gclk_chan_config gclk_chan_conf;
mbed_official 15:a81a8d6c1dfe 283 system_gclk_chan_get_config_defaults(&gclk_chan_conf);
mbed_official 15:a81a8d6c1dfe 284 gclk_chan_conf.source_generator = GCLK_GENERATOR_2;
mbed_official 15:a81a8d6c1dfe 285 system_gclk_chan_set_config(RTC_GCLK_ID, &gclk_chan_conf);
mbed_official 15:a81a8d6c1dfe 286 system_gclk_chan_enable(RTC_GCLK_ID);
mbed_official 15:a81a8d6c1dfe 287
mbed_official 15:a81a8d6c1dfe 288 /* Reset module to hardware defaults. */
mbed_official 15:a81a8d6c1dfe 289 rtc_count_reset(module);
mbed_official 15:a81a8d6c1dfe 290
mbed_official 15:a81a8d6c1dfe 291 /* Save conf_struct internally for continued use. */
mbed_official 15:a81a8d6c1dfe 292 module->mode = config->mode;
mbed_official 15:a81a8d6c1dfe 293 module->continuously_update = config->continuously_update;
mbed_official 15:a81a8d6c1dfe 294
mbed_official 15:a81a8d6c1dfe 295 # if (RTC_INST_NUM == 1)
mbed_official 15:a81a8d6c1dfe 296 _rtc_instance[0] = module;
mbed_official 15:a81a8d6c1dfe 297 # else
mbed_official 15:a81a8d6c1dfe 298 /* Register this instance for callbacks*/
mbed_official 15:a81a8d6c1dfe 299 _rtc_instance[_rtc_get_inst_index(hw)] = module;
mbed_official 15:a81a8d6c1dfe 300 # endif
mbed_official 15:a81a8d6c1dfe 301
mbed_official 15:a81a8d6c1dfe 302 /* Set config and return status. */
mbed_official 15:a81a8d6c1dfe 303 return _rtc_count_set_config(module, config);
mbed_official 15:a81a8d6c1dfe 304 }
mbed_official 15:a81a8d6c1dfe 305
mbed_official 15:a81a8d6c1dfe 306 /**
mbed_official 15:a81a8d6c1dfe 307 * \brief Set the current count value to desired value.
mbed_official 15:a81a8d6c1dfe 308 *
mbed_official 15:a81a8d6c1dfe 309 * Sets the value of the counter to the specified value.
mbed_official 15:a81a8d6c1dfe 310 *
mbed_official 15:a81a8d6c1dfe 311 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 312 * \param[in] count_value The value to be set in count register
mbed_official 15:a81a8d6c1dfe 313 *
mbed_official 15:a81a8d6c1dfe 314 * \return Status of setting the register.
mbed_official 15:a81a8d6c1dfe 315 * \retval STATUS_OK If everything was executed correctly
mbed_official 15:a81a8d6c1dfe 316 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were provided
mbed_official 15:a81a8d6c1dfe 317 */
mbed_official 15:a81a8d6c1dfe 318 enum status_code rtc_count_set_count(
mbed_official 15:a81a8d6c1dfe 319 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 320 const uint32_t count_value)
mbed_official 15:a81a8d6c1dfe 321 {
mbed_official 15:a81a8d6c1dfe 322 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 323 Assert(module);
mbed_official 15:a81a8d6c1dfe 324 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 325
mbed_official 15:a81a8d6c1dfe 326 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 327
mbed_official 15:a81a8d6c1dfe 328 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 329 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 330 }
mbed_official 15:a81a8d6c1dfe 331
mbed_official 15:a81a8d6c1dfe 332 /* Set count according to mode */
mbed_official 15:a81a8d6c1dfe 333 switch(module->mode) {
mbed_official 15:a81a8d6c1dfe 334 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 335 /* Write value to register. */
mbed_official 15:a81a8d6c1dfe 336 rtc_module->MODE0.COUNT.reg = count_value;
mbed_official 15:a81a8d6c1dfe 337
mbed_official 15:a81a8d6c1dfe 338 break;
mbed_official 15:a81a8d6c1dfe 339
mbed_official 15:a81a8d6c1dfe 340 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 341 /* Check if 16-bit value is provided. */
mbed_official 15:a81a8d6c1dfe 342 if(count_value > 0xffff) {
mbed_official 15:a81a8d6c1dfe 343 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 344 }
mbed_official 15:a81a8d6c1dfe 345
mbed_official 15:a81a8d6c1dfe 346 /* Write value to register. */
mbed_official 15:a81a8d6c1dfe 347 rtc_module->MODE1.COUNT.reg = (uint32_t)count_value;
mbed_official 15:a81a8d6c1dfe 348
mbed_official 15:a81a8d6c1dfe 349 break;
mbed_official 15:a81a8d6c1dfe 350
mbed_official 15:a81a8d6c1dfe 351 default:
mbed_official 15:a81a8d6c1dfe 352 Assert(false);
mbed_official 15:a81a8d6c1dfe 353 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 354 }
mbed_official 15:a81a8d6c1dfe 355 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 356 }
mbed_official 15:a81a8d6c1dfe 357
mbed_official 15:a81a8d6c1dfe 358 /**
mbed_official 15:a81a8d6c1dfe 359 * \brief Get the current count value.
mbed_official 15:a81a8d6c1dfe 360 *
mbed_official 15:a81a8d6c1dfe 361 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 362 *
mbed_official 15:a81a8d6c1dfe 363 * Returns the current count value.
mbed_official 15:a81a8d6c1dfe 364 *
mbed_official 15:a81a8d6c1dfe 365 * \return The current counter value as a 32-bit unsigned integer.
mbed_official 15:a81a8d6c1dfe 366 */
mbed_official 15:a81a8d6c1dfe 367 uint32_t rtc_count_get_count(struct rtc_module *const module)
mbed_official 15:a81a8d6c1dfe 368 {
mbed_official 15:a81a8d6c1dfe 369 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 370 Assert(module);
mbed_official 15:a81a8d6c1dfe 371 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 372
mbed_official 15:a81a8d6c1dfe 373 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 374
mbed_official 15:a81a8d6c1dfe 375 /* Initialize return value. */
mbed_official 15:a81a8d6c1dfe 376 uint32_t ret_val;
mbed_official 15:a81a8d6c1dfe 377
mbed_official 15:a81a8d6c1dfe 378 /* Change of read method based on value of continuously_update value in
mbed_official 15:a81a8d6c1dfe 379 * the configuration structure. */
mbed_official 15:a81a8d6c1dfe 380 if(!(module->continuously_update)) {
mbed_official 15:a81a8d6c1dfe 381 /* Request read on count register. */
mbed_official 15:a81a8d6c1dfe 382 rtc_module->MODE0.READREQ.reg = RTC_READREQ_RREQ;
mbed_official 15:a81a8d6c1dfe 383
mbed_official 15:a81a8d6c1dfe 384 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 385 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 386 }
mbed_official 15:a81a8d6c1dfe 387 }
mbed_official 15:a81a8d6c1dfe 388
mbed_official 15:a81a8d6c1dfe 389 /* Read value based on mode. */
mbed_official 15:a81a8d6c1dfe 390 switch (module->mode) {
mbed_official 15:a81a8d6c1dfe 391 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 392 /* Return count value in 32-bit mode. */
mbed_official 15:a81a8d6c1dfe 393 ret_val = rtc_module->MODE0.COUNT.reg;
mbed_official 15:a81a8d6c1dfe 394
mbed_official 15:a81a8d6c1dfe 395 break;
mbed_official 15:a81a8d6c1dfe 396
mbed_official 15:a81a8d6c1dfe 397 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 398 /* Return count value in 16-bit mode. */
mbed_official 15:a81a8d6c1dfe 399 ret_val = (uint32_t)rtc_module->MODE1.COUNT.reg;
mbed_official 15:a81a8d6c1dfe 400
mbed_official 15:a81a8d6c1dfe 401 break;
mbed_official 15:a81a8d6c1dfe 402
mbed_official 15:a81a8d6c1dfe 403 default:
mbed_official 15:a81a8d6c1dfe 404 Assert(false);
mbed_official 15:a81a8d6c1dfe 405 /* Counter not initialized. Assume counter value 0.*/
mbed_official 15:a81a8d6c1dfe 406 ret_val = 0;
mbed_official 15:a81a8d6c1dfe 407 break;
mbed_official 15:a81a8d6c1dfe 408 }
mbed_official 15:a81a8d6c1dfe 409
mbed_official 15:a81a8d6c1dfe 410 return ret_val;
mbed_official 15:a81a8d6c1dfe 411 }
mbed_official 15:a81a8d6c1dfe 412
mbed_official 15:a81a8d6c1dfe 413 /**
mbed_official 15:a81a8d6c1dfe 414 * \brief Set the compare value for the specified compare.
mbed_official 15:a81a8d6c1dfe 415 *
mbed_official 15:a81a8d6c1dfe 416 * Sets the value specified by the implementer to the requested compare.
mbed_official 15:a81a8d6c1dfe 417 *
mbed_official 15:a81a8d6c1dfe 418 * \note Compare 4 and 5 are only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 419 *
mbed_official 15:a81a8d6c1dfe 420 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 421 * \param[in] comp_value The value to be written to the compare
mbed_official 15:a81a8d6c1dfe 422 * \param[in] comp_index Index of the compare to set
mbed_official 15:a81a8d6c1dfe 423 *
mbed_official 15:a81a8d6c1dfe 424 * \return Status indicating if compare was successfully set.
mbed_official 15:a81a8d6c1dfe 425 * \retval STATUS_OK If compare was successfully set
mbed_official 15:a81a8d6c1dfe 426 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were provided
mbed_official 15:a81a8d6c1dfe 427 * \retval STATUS_ERR_BAD_FORMAT If the module was not initialized in a mode
mbed_official 15:a81a8d6c1dfe 428 */
mbed_official 15:a81a8d6c1dfe 429 enum status_code rtc_count_set_compare(
mbed_official 15:a81a8d6c1dfe 430 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 431 const uint32_t comp_value,
mbed_official 15:a81a8d6c1dfe 432 const enum rtc_count_compare comp_index)
mbed_official 15:a81a8d6c1dfe 433 {
mbed_official 15:a81a8d6c1dfe 434 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 435 Assert(module);
mbed_official 15:a81a8d6c1dfe 436 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 437
mbed_official 15:a81a8d6c1dfe 438 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 439
mbed_official 15:a81a8d6c1dfe 440 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 441 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 442 }
mbed_official 15:a81a8d6c1dfe 443
mbed_official 15:a81a8d6c1dfe 444 /* Set compare values based on operation mode. */
mbed_official 15:a81a8d6c1dfe 445 switch (module->mode) {
mbed_official 15:a81a8d6c1dfe 446 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 447 /* Check sanity of comp_index. */
mbed_official 15:a81a8d6c1dfe 448 if ((uint32_t)comp_index > RTC_NUM_OF_COMP32) {
mbed_official 15:a81a8d6c1dfe 449 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 450 }
mbed_official 15:a81a8d6c1dfe 451
mbed_official 15:a81a8d6c1dfe 452 /* Set compare value for COMP. */
mbed_official 15:a81a8d6c1dfe 453 rtc_module->MODE0.COMP[comp_index].reg = comp_value;
mbed_official 15:a81a8d6c1dfe 454
mbed_official 15:a81a8d6c1dfe 455 break;
mbed_official 15:a81a8d6c1dfe 456
mbed_official 15:a81a8d6c1dfe 457 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 458 /* Check sanity of comp_index. */
mbed_official 15:a81a8d6c1dfe 459 if ((uint32_t)comp_index > RTC_NUM_OF_COMP16) {
mbed_official 15:a81a8d6c1dfe 460 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 461 }
mbed_official 15:a81a8d6c1dfe 462
mbed_official 15:a81a8d6c1dfe 463 /* Check that 16-bit value is provided. */
mbed_official 15:a81a8d6c1dfe 464 if (comp_value > 0xffff) {
mbed_official 15:a81a8d6c1dfe 465 Assert(false);
mbed_official 15:a81a8d6c1dfe 466 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 467 }
mbed_official 15:a81a8d6c1dfe 468
mbed_official 15:a81a8d6c1dfe 469 /* Set compare value for COMP. */
mbed_official 15:a81a8d6c1dfe 470 rtc_module->MODE1.COMP[comp_index].reg = comp_value & 0xffff;
mbed_official 15:a81a8d6c1dfe 471
mbed_official 15:a81a8d6c1dfe 472 break;
mbed_official 15:a81a8d6c1dfe 473
mbed_official 15:a81a8d6c1dfe 474 default:
mbed_official 15:a81a8d6c1dfe 475 Assert(false);
mbed_official 15:a81a8d6c1dfe 476 return STATUS_ERR_BAD_FORMAT;
mbed_official 15:a81a8d6c1dfe 477 }
mbed_official 15:a81a8d6c1dfe 478
mbed_official 15:a81a8d6c1dfe 479 /* Return status if everything is OK. */
mbed_official 15:a81a8d6c1dfe 480 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 481 }
mbed_official 15:a81a8d6c1dfe 482
mbed_official 15:a81a8d6c1dfe 483 /**
mbed_official 15:a81a8d6c1dfe 484 * \brief Get the current compare value of specified compare.
mbed_official 15:a81a8d6c1dfe 485 *
mbed_official 15:a81a8d6c1dfe 486 * Retrieves the current value of the specified compare.
mbed_official 15:a81a8d6c1dfe 487 *
mbed_official 15:a81a8d6c1dfe 488 * \note Compare 4 and 5 are only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 489 *
mbed_official 15:a81a8d6c1dfe 490 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 491 * \param[out] comp_value Pointer to 32-bit integer that will be populated with
mbed_official 15:a81a8d6c1dfe 492 * the current compare value
mbed_official 15:a81a8d6c1dfe 493 * \param[in] comp_index Index of compare to check
mbed_official 15:a81a8d6c1dfe 494 *
mbed_official 15:a81a8d6c1dfe 495 * \return Status of the reading procedure.
mbed_official 15:a81a8d6c1dfe 496 * \retval STATUS_OK If the value was read correctly
mbed_official 15:a81a8d6c1dfe 497 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were provided
mbed_official 15:a81a8d6c1dfe 498 * \retval STATUS_ERR_BAD_FORMAT If the module was not initialized in a mode
mbed_official 15:a81a8d6c1dfe 499 */
mbed_official 15:a81a8d6c1dfe 500 enum status_code rtc_count_get_compare(
mbed_official 15:a81a8d6c1dfe 501 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 502 uint32_t *const comp_value,
mbed_official 15:a81a8d6c1dfe 503 const enum rtc_count_compare comp_index)
mbed_official 15:a81a8d6c1dfe 504 {
mbed_official 15:a81a8d6c1dfe 505 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 506 Assert(module);
mbed_official 15:a81a8d6c1dfe 507 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 508
mbed_official 15:a81a8d6c1dfe 509 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 510
mbed_official 15:a81a8d6c1dfe 511 switch (module->mode) {
mbed_official 15:a81a8d6c1dfe 512 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 513 /* Check sanity of comp_index. */
mbed_official 15:a81a8d6c1dfe 514 if ((uint32_t)comp_index > RTC_NUM_OF_COMP32) {
mbed_official 15:a81a8d6c1dfe 515 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 516 }
mbed_official 15:a81a8d6c1dfe 517
mbed_official 15:a81a8d6c1dfe 518 /* Get compare value for COMP. */
mbed_official 15:a81a8d6c1dfe 519 *comp_value = rtc_module->MODE0.COMP[comp_index].reg;
mbed_official 15:a81a8d6c1dfe 520
mbed_official 15:a81a8d6c1dfe 521 break;
mbed_official 15:a81a8d6c1dfe 522
mbed_official 15:a81a8d6c1dfe 523 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 524 /* Check sanity of comp_index. */
mbed_official 15:a81a8d6c1dfe 525 if ((uint32_t)comp_index > RTC_NUM_OF_COMP16) {
mbed_official 15:a81a8d6c1dfe 526 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 527 }
mbed_official 15:a81a8d6c1dfe 528
mbed_official 15:a81a8d6c1dfe 529 /* Get compare value for COMP. */
mbed_official 15:a81a8d6c1dfe 530 *comp_value = (uint32_t)rtc_module->MODE1.COMP[comp_index].reg;
mbed_official 15:a81a8d6c1dfe 531
mbed_official 15:a81a8d6c1dfe 532 break;
mbed_official 15:a81a8d6c1dfe 533
mbed_official 15:a81a8d6c1dfe 534 default:
mbed_official 15:a81a8d6c1dfe 535 Assert(false);
mbed_official 15:a81a8d6c1dfe 536 return STATUS_ERR_BAD_FORMAT;
mbed_official 15:a81a8d6c1dfe 537 }
mbed_official 15:a81a8d6c1dfe 538 /* Return status showing everything is OK. */
mbed_official 15:a81a8d6c1dfe 539 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 540 }
mbed_official 15:a81a8d6c1dfe 541
mbed_official 15:a81a8d6c1dfe 542 /**
mbed_official 15:a81a8d6c1dfe 543 * \brief Retrieves the value of period.
mbed_official 15:a81a8d6c1dfe 544 *
mbed_official 15:a81a8d6c1dfe 545 * Retrieves the value of the period for the 16-bit mode counter.
mbed_official 15:a81a8d6c1dfe 546 *
mbed_official 15:a81a8d6c1dfe 547 * \note Only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 548 *
mbed_official 15:a81a8d6c1dfe 549 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 550 * \param[out] period_value Pointer to value for return argument
mbed_official 15:a81a8d6c1dfe 551 *
mbed_official 15:a81a8d6c1dfe 552 * \return Status of getting the period value.
mbed_official 15:a81a8d6c1dfe 553 * \retval STATUS_OK If the period value was read correctly
mbed_official 15:a81a8d6c1dfe 554 * \retval STATUS_ERR_UNSUPPORTED_DEV If incorrect mode was set
mbed_official 15:a81a8d6c1dfe 555 */
mbed_official 15:a81a8d6c1dfe 556 enum status_code rtc_count_get_period(
mbed_official 15:a81a8d6c1dfe 557 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 558 uint16_t *const period_value)
mbed_official 15:a81a8d6c1dfe 559 {
mbed_official 15:a81a8d6c1dfe 560 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 561 Assert(module);
mbed_official 15:a81a8d6c1dfe 562 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 563
mbed_official 15:a81a8d6c1dfe 564 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 565
mbed_official 15:a81a8d6c1dfe 566 /* Check that correct mode is set. */
mbed_official 15:a81a8d6c1dfe 567 if (module->mode != RTC_COUNT_MODE_16BIT) {
mbed_official 15:a81a8d6c1dfe 568 return STATUS_ERR_UNSUPPORTED_DEV;
mbed_official 15:a81a8d6c1dfe 569 }
mbed_official 15:a81a8d6c1dfe 570
mbed_official 15:a81a8d6c1dfe 571 /* Returns the value. */
mbed_official 15:a81a8d6c1dfe 572 *period_value = rtc_module->MODE1.PER.reg;
mbed_official 15:a81a8d6c1dfe 573
mbed_official 15:a81a8d6c1dfe 574 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 575 }
mbed_official 15:a81a8d6c1dfe 576
mbed_official 15:a81a8d6c1dfe 577 /**
mbed_official 15:a81a8d6c1dfe 578 * \brief Set the given value to the period.
mbed_official 15:a81a8d6c1dfe 579 *
mbed_official 15:a81a8d6c1dfe 580 * Sets the given value to the period.
mbed_official 15:a81a8d6c1dfe 581 *
mbed_official 15:a81a8d6c1dfe 582 * \note Only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 583 *
mbed_official 15:a81a8d6c1dfe 584 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 585 * \param[in] period_value The value to set to the period
mbed_official 15:a81a8d6c1dfe 586 *
mbed_official 15:a81a8d6c1dfe 587 * \return Status of setting the period value.
mbed_official 15:a81a8d6c1dfe 588 * \retval STATUS_OK If the period was set correctly
mbed_official 15:a81a8d6c1dfe 589 * \retval STATUS_ERR_UNSUPPORTED_DEV If module is not operated in 16-bit mode
mbed_official 15:a81a8d6c1dfe 590 */
mbed_official 15:a81a8d6c1dfe 591 enum status_code rtc_count_set_period(
mbed_official 15:a81a8d6c1dfe 592 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 593 const uint16_t period_value)
mbed_official 15:a81a8d6c1dfe 594 {
mbed_official 15:a81a8d6c1dfe 595 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 596 Assert(module);
mbed_official 15:a81a8d6c1dfe 597 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 598
mbed_official 15:a81a8d6c1dfe 599 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 600
mbed_official 15:a81a8d6c1dfe 601 /* Check that correct mode is set. */
mbed_official 15:a81a8d6c1dfe 602 if (module->mode != RTC_COUNT_MODE_16BIT) {
mbed_official 15:a81a8d6c1dfe 603 return STATUS_ERR_UNSUPPORTED_DEV;
mbed_official 15:a81a8d6c1dfe 604 }
mbed_official 15:a81a8d6c1dfe 605
mbed_official 15:a81a8d6c1dfe 606 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 607 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 608 }
mbed_official 15:a81a8d6c1dfe 609
mbed_official 15:a81a8d6c1dfe 610 /* Write value to register. */
mbed_official 15:a81a8d6c1dfe 611 rtc_module->MODE1.PER.reg = period_value;
mbed_official 15:a81a8d6c1dfe 612
mbed_official 15:a81a8d6c1dfe 613 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 614 }
mbed_official 15:a81a8d6c1dfe 615
mbed_official 15:a81a8d6c1dfe 616 /**
mbed_official 15:a81a8d6c1dfe 617 * \brief Check if RTC compare match has occurred.
mbed_official 15:a81a8d6c1dfe 618 *
mbed_official 15:a81a8d6c1dfe 619 * Checks the compare flag to see if a match has occurred. The compare flag is
mbed_official 15:a81a8d6c1dfe 620 * set when there is a compare match between counter and the compare.
mbed_official 15:a81a8d6c1dfe 621 *
mbed_official 15:a81a8d6c1dfe 622 * \note Compare 4 and 5 are only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 623 *
mbed_official 15:a81a8d6c1dfe 624 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 625 * \param[in] comp_index Index of compare to check current flag
mbed_official 15:a81a8d6c1dfe 626 */
mbed_official 15:a81a8d6c1dfe 627 bool rtc_count_is_compare_match(
mbed_official 15:a81a8d6c1dfe 628 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 629 const enum rtc_count_compare comp_index)
mbed_official 15:a81a8d6c1dfe 630 {
mbed_official 15:a81a8d6c1dfe 631 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 632 Assert(module);
mbed_official 15:a81a8d6c1dfe 633 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 634
mbed_official 15:a81a8d6c1dfe 635 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 636
mbed_official 15:a81a8d6c1dfe 637 /* Check sanity. */
mbed_official 15:a81a8d6c1dfe 638 switch (module->mode) {
mbed_official 15:a81a8d6c1dfe 639 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 640 /* Check sanity for 32-bit mode. */
mbed_official 15:a81a8d6c1dfe 641 if (comp_index > RTC_NUM_OF_COMP32) {
mbed_official 15:a81a8d6c1dfe 642 return false;
mbed_official 15:a81a8d6c1dfe 643 }
mbed_official 15:a81a8d6c1dfe 644
mbed_official 15:a81a8d6c1dfe 645 break;
mbed_official 15:a81a8d6c1dfe 646
mbed_official 15:a81a8d6c1dfe 647 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 648 /* Check sanity for 16-bit mode. */
mbed_official 15:a81a8d6c1dfe 649 if (comp_index > RTC_NUM_OF_COMP16) {
mbed_official 15:a81a8d6c1dfe 650 return false;
mbed_official 15:a81a8d6c1dfe 651 }
mbed_official 15:a81a8d6c1dfe 652
mbed_official 15:a81a8d6c1dfe 653 break;
mbed_official 15:a81a8d6c1dfe 654
mbed_official 15:a81a8d6c1dfe 655 default:
mbed_official 15:a81a8d6c1dfe 656 Assert(false);
mbed_official 15:a81a8d6c1dfe 657 return false;
mbed_official 15:a81a8d6c1dfe 658 }
mbed_official 15:a81a8d6c1dfe 659
mbed_official 15:a81a8d6c1dfe 660 /* Set status of INTFLAG as return argument. */
mbed_official 15:a81a8d6c1dfe 661 return (rtc_module->MODE0.INTFLAG.reg & (1 << comp_index)) ? true : false;
mbed_official 15:a81a8d6c1dfe 662 }
mbed_official 15:a81a8d6c1dfe 663
mbed_official 15:a81a8d6c1dfe 664 /**
mbed_official 15:a81a8d6c1dfe 665 * \brief Clears RTC compare match flag.
mbed_official 15:a81a8d6c1dfe 666 *
mbed_official 15:a81a8d6c1dfe 667 * Clears the compare flag. The compare flag is set when there is a compare
mbed_official 15:a81a8d6c1dfe 668 * match between the counter and the compare.
mbed_official 15:a81a8d6c1dfe 669 *
mbed_official 15:a81a8d6c1dfe 670 * \note Compare 4 and 5 are only available in 16-bit mode.
mbed_official 15:a81a8d6c1dfe 671 *
mbed_official 15:a81a8d6c1dfe 672 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 673 * \param[in] comp_index Index of compare to check current flag
mbed_official 15:a81a8d6c1dfe 674 *
mbed_official 15:a81a8d6c1dfe 675 * \return Status indicating if flag was successfully cleared.
mbed_official 15:a81a8d6c1dfe 676 * \retval STATUS_OK If flag was successfully cleared
mbed_official 15:a81a8d6c1dfe 677 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were provided
mbed_official 15:a81a8d6c1dfe 678 * \retval STATUS_ERR_BAD_FORMAT If the module was not initialized in a mode
mbed_official 15:a81a8d6c1dfe 679 */
mbed_official 15:a81a8d6c1dfe 680 enum status_code rtc_count_clear_compare_match(
mbed_official 15:a81a8d6c1dfe 681 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 682 const enum rtc_count_compare comp_index)
mbed_official 15:a81a8d6c1dfe 683 {
mbed_official 15:a81a8d6c1dfe 684 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 685 Assert(module);
mbed_official 15:a81a8d6c1dfe 686 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 687
mbed_official 15:a81a8d6c1dfe 688 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 689
mbed_official 15:a81a8d6c1dfe 690 /* Check sanity. */
mbed_official 15:a81a8d6c1dfe 691 switch (module->mode) {
mbed_official 15:a81a8d6c1dfe 692 case RTC_COUNT_MODE_32BIT:
mbed_official 15:a81a8d6c1dfe 693 /* Check sanity for 32-bit mode. */
mbed_official 15:a81a8d6c1dfe 694 if (comp_index > RTC_NUM_OF_COMP32) {
mbed_official 15:a81a8d6c1dfe 695 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 696 }
mbed_official 15:a81a8d6c1dfe 697
mbed_official 15:a81a8d6c1dfe 698 break;
mbed_official 15:a81a8d6c1dfe 699
mbed_official 15:a81a8d6c1dfe 700 case RTC_COUNT_MODE_16BIT:
mbed_official 15:a81a8d6c1dfe 701 /* Check sanity for 16-bit mode. */
mbed_official 15:a81a8d6c1dfe 702 if (comp_index > RTC_NUM_OF_COMP16) {
mbed_official 15:a81a8d6c1dfe 703 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 704 }
mbed_official 15:a81a8d6c1dfe 705
mbed_official 15:a81a8d6c1dfe 706 break;
mbed_official 15:a81a8d6c1dfe 707
mbed_official 15:a81a8d6c1dfe 708 default:
mbed_official 15:a81a8d6c1dfe 709 Assert(false);
mbed_official 15:a81a8d6c1dfe 710 return STATUS_ERR_BAD_FORMAT;
mbed_official 15:a81a8d6c1dfe 711 }
mbed_official 15:a81a8d6c1dfe 712
mbed_official 15:a81a8d6c1dfe 713 /* Clear INTFLAG. */
mbed_official 15:a81a8d6c1dfe 714 rtc_module->MODE0.INTFLAG.reg = RTC_MODE1_INTFLAG_CMP(1 << comp_index);
mbed_official 15:a81a8d6c1dfe 715
mbed_official 15:a81a8d6c1dfe 716 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 717 }
mbed_official 15:a81a8d6c1dfe 718
mbed_official 15:a81a8d6c1dfe 719 /**
mbed_official 15:a81a8d6c1dfe 720 * \brief Calibrate for too-slow or too-fast oscillator.
mbed_official 15:a81a8d6c1dfe 721 *
mbed_official 15:a81a8d6c1dfe 722 * When used, the RTC will compensate for an inaccurate oscillator. The
mbed_official 15:a81a8d6c1dfe 723 * RTC module will add or subtract cycles from the RTC prescaler to adjust the
mbed_official 15:a81a8d6c1dfe 724 * frequency in approximately 1 PPM steps. The provided correction value should
mbed_official 15:a81a8d6c1dfe 725 * be between 0 and 127, allowing for a maximum 127 PPM correction.
mbed_official 15:a81a8d6c1dfe 726 *
mbed_official 15:a81a8d6c1dfe 727 * If no correction is needed, set value to zero.
mbed_official 15:a81a8d6c1dfe 728 *
mbed_official 15:a81a8d6c1dfe 729 * \note Can only be used when the RTC is operated in 1Hz.
mbed_official 15:a81a8d6c1dfe 730 *
mbed_official 15:a81a8d6c1dfe 731 * \param[in,out] module Pointer to the software instance struct
mbed_official 15:a81a8d6c1dfe 732 * \param[in] value Ranging from -127 to 127 used for the correction
mbed_official 15:a81a8d6c1dfe 733 *
mbed_official 15:a81a8d6c1dfe 734 * \return Status of the calibration procedure.
mbed_official 15:a81a8d6c1dfe 735 * \retval STATUS_OK If calibration was executed correctly
mbed_official 15:a81a8d6c1dfe 736 * \retval STATUS_ERR_INVALID_ARG If invalid argument(s) were provided
mbed_official 15:a81a8d6c1dfe 737 */
mbed_official 15:a81a8d6c1dfe 738 enum status_code rtc_count_frequency_correction(
mbed_official 15:a81a8d6c1dfe 739 struct rtc_module *const module,
mbed_official 15:a81a8d6c1dfe 740 const int8_t value)
mbed_official 15:a81a8d6c1dfe 741 {
mbed_official 15:a81a8d6c1dfe 742 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 743 Assert(module);
mbed_official 15:a81a8d6c1dfe 744 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 745
mbed_official 15:a81a8d6c1dfe 746 Rtc *const rtc_module = module->hw;
mbed_official 15:a81a8d6c1dfe 747
mbed_official 15:a81a8d6c1dfe 748 /* Check if valid argument. */
mbed_official 15:a81a8d6c1dfe 749 if (abs(value) > 0x7F) {
mbed_official 15:a81a8d6c1dfe 750 /* Value bigger than allowed, return invalid argument. */
mbed_official 15:a81a8d6c1dfe 751 return STATUS_ERR_INVALID_ARG;
mbed_official 15:a81a8d6c1dfe 752 }
mbed_official 15:a81a8d6c1dfe 753
mbed_official 15:a81a8d6c1dfe 754 uint32_t new_correction_value;
mbed_official 15:a81a8d6c1dfe 755
mbed_official 15:a81a8d6c1dfe 756 /* Load the new correction value as a positive value, sign added later */
mbed_official 15:a81a8d6c1dfe 757 new_correction_value = abs(value);
mbed_official 15:a81a8d6c1dfe 758
mbed_official 15:a81a8d6c1dfe 759 /* Convert to positive value and adjust register sign bit. */
mbed_official 15:a81a8d6c1dfe 760 if (value < 0) {
mbed_official 15:a81a8d6c1dfe 761 new_correction_value |= RTC_FREQCORR_SIGN;
mbed_official 15:a81a8d6c1dfe 762 }
mbed_official 15:a81a8d6c1dfe 763
mbed_official 15:a81a8d6c1dfe 764 while (rtc_count_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 765 /* Wait for synchronization */
mbed_official 15:a81a8d6c1dfe 766 }
mbed_official 15:a81a8d6c1dfe 767
mbed_official 15:a81a8d6c1dfe 768 /* Set value. */
mbed_official 15:a81a8d6c1dfe 769 rtc_module->MODE0.FREQCORR.reg = new_correction_value;
mbed_official 15:a81a8d6c1dfe 770
mbed_official 15:a81a8d6c1dfe 771 return STATUS_OK;
mbed_official 15:a81a8d6c1dfe 772 }
mbed_official 15:a81a8d6c1dfe 773