mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
screamer
Date:
Tue Aug 02 14:07:36 2016 +0000
Revision:
144:423e1876dc07
Parent:
18:da299f395b9e
Added targets.json file for the supported targets in the release

Who changed what in which revision?

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