t

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM4/drivers/rtt/rtt.c@107:414e9c822e99
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /**
mbed_official 107:414e9c822e99 2 * \file
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * \brief Real-time Timer (RTT) driver for SAM.
mbed_official 107:414e9c822e99 5 *
mbed_official 107:414e9c822e99 6 * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * \asf_license_start
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * \page License
mbed_official 107:414e9c822e99 11 *
mbed_official 107:414e9c822e99 12 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 13 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 14 *
mbed_official 107:414e9c822e99 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 16 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 17 *
mbed_official 107:414e9c822e99 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 20 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 21 *
mbed_official 107:414e9c822e99 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 23 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 24 *
mbed_official 107:414e9c822e99 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 26 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 27 *
mbed_official 107:414e9c822e99 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 39 *
mbed_official 107:414e9c822e99 40 * \asf_license_stop
mbed_official 107:414e9c822e99 41 *
mbed_official 107:414e9c822e99 42 */
mbed_official 107:414e9c822e99 43 /*
mbed_official 107:414e9c822e99 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 45 */
mbed_official 107:414e9c822e99 46
mbed_official 107:414e9c822e99 47 #include "rtt.h"
mbed_official 107:414e9c822e99 48
mbed_official 107:414e9c822e99 49 /// @cond 0
mbed_official 107:414e9c822e99 50 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 51 #ifdef __cplusplus
mbed_official 107:414e9c822e99 52 extern "C" {
mbed_official 107:414e9c822e99 53 #endif
mbed_official 107:414e9c822e99 54 /**INDENT-ON**/
mbed_official 107:414e9c822e99 55 /// @endcond
mbed_official 107:414e9c822e99 56
mbed_official 107:414e9c822e99 57 /**
mbed_official 107:414e9c822e99 58 * \defgroup sam_drivers_rtt_group Real-time Timer (RTT)
mbed_official 107:414e9c822e99 59 *
mbed_official 107:414e9c822e99 60 * The Real-time Timer is built around a 32-bit counter used to count
mbed_official 107:414e9c822e99 61 * roll-over events of the programmable 16-bit prescaler, which enables
mbed_official 107:414e9c822e99 62 * counting elapsed seconds from a 32 kHz slow clock source.
mbed_official 107:414e9c822e99 63 * This is a driver for configuration and use of the RTT peripheral.
mbed_official 107:414e9c822e99 64 *
mbed_official 107:414e9c822e99 65 * @{
mbed_official 107:414e9c822e99 66 */
mbed_official 107:414e9c822e99 67
mbed_official 107:414e9c822e99 68 /*
mbed_official 107:414e9c822e99 69 * In follow series chip, the bit RTC1HZ and RTTDIS in RTT_MR are write only.
mbed_official 107:414e9c822e99 70 * So we use a variable to record status of these bits.
mbed_official 107:414e9c822e99 71 */
mbed_official 107:414e9c822e99 72 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 73 static uint32_t g_wobits_in_rtt_mr = 0;
mbed_official 107:414e9c822e99 74 #endif
mbed_official 107:414e9c822e99 75
mbed_official 107:414e9c822e99 76 /**
mbed_official 107:414e9c822e99 77 * \brief Initialize the given RTT.
mbed_official 107:414e9c822e99 78 *
mbed_official 107:414e9c822e99 79 * \note This function restarts the real-time timer. If w_prescaler is equal to zero,
mbed_official 107:414e9c822e99 80 * the prescaler period is equal to 2^16 * SCLK period. If not, the prescaler period
mbed_official 107:414e9c822e99 81 * is equal to us_prescaler * SCLK period.
mbed_official 107:414e9c822e99 82 *
mbed_official 107:414e9c822e99 83 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 84 * \param us_prescaler Prescaler value for the RTT.
mbed_official 107:414e9c822e99 85 *
mbed_official 107:414e9c822e99 86 * \return 0 if successful.
mbed_official 107:414e9c822e99 87 */
mbed_official 107:414e9c822e99 88 uint32_t rtt_init(Rtt *p_rtt, uint16_t us_prescaler)
mbed_official 107:414e9c822e99 89 {
mbed_official 107:414e9c822e99 90 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 91 p_rtt->RTT_MR = (us_prescaler | RTT_MR_RTTRST | g_wobits_in_rtt_mr);
mbed_official 107:414e9c822e99 92 #else
mbed_official 107:414e9c822e99 93 p_rtt->RTT_MR = (us_prescaler | RTT_MR_RTTRST);
mbed_official 107:414e9c822e99 94 #endif
mbed_official 107:414e9c822e99 95 return 0;
mbed_official 107:414e9c822e99 96 }
mbed_official 107:414e9c822e99 97
mbed_official 107:414e9c822e99 98 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 99 /**
mbed_official 107:414e9c822e99 100 * \brief Select RTT counter source.
mbed_official 107:414e9c822e99 101 *
mbed_official 107:414e9c822e99 102 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 103 * \param is_rtc_sel RTC 1Hz Clock Selection.
mbed_official 107:414e9c822e99 104 */
mbed_official 107:414e9c822e99 105 void rtt_sel_source(Rtt *p_rtt, bool is_rtc_sel)
mbed_official 107:414e9c822e99 106 {
mbed_official 107:414e9c822e99 107 if(is_rtc_sel) {
mbed_official 107:414e9c822e99 108 g_wobits_in_rtt_mr |= RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 109 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 110 } else {
mbed_official 107:414e9c822e99 111 g_wobits_in_rtt_mr &= ~RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 112 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 113 }
mbed_official 107:414e9c822e99 114 }
mbed_official 107:414e9c822e99 115
mbed_official 107:414e9c822e99 116 /**
mbed_official 107:414e9c822e99 117 * \brief Enable RTT.
mbed_official 107:414e9c822e99 118 *
mbed_official 107:414e9c822e99 119 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 120 */
mbed_official 107:414e9c822e99 121 void rtt_enable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 122 {
mbed_official 107:414e9c822e99 123 g_wobits_in_rtt_mr &= ~RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 124 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 125 }
mbed_official 107:414e9c822e99 126 /**
mbed_official 107:414e9c822e99 127 * \brief Disable RTT.
mbed_official 107:414e9c822e99 128 *
mbed_official 107:414e9c822e99 129 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 130 */
mbed_official 107:414e9c822e99 131 void rtt_disable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 132 {
mbed_official 107:414e9c822e99 133 g_wobits_in_rtt_mr |= RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 134 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 135 }
mbed_official 107:414e9c822e99 136 #elif (SAMG53 || SAMG54 || SAMG55)
mbed_official 107:414e9c822e99 137 void rtt_sel_source(Rtt *p_rtt, bool is_rtc_sel)
mbed_official 107:414e9c822e99 138 {
mbed_official 107:414e9c822e99 139 if(is_rtc_sel) {
mbed_official 107:414e9c822e99 140 p_rtt->RTT_MR |= RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 141 } else {
mbed_official 107:414e9c822e99 142 p_rtt->RTT_MR &= ~RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 143 }
mbed_official 107:414e9c822e99 144 }
mbed_official 107:414e9c822e99 145
mbed_official 107:414e9c822e99 146 void rtt_enable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 147 {
mbed_official 107:414e9c822e99 148 p_rtt->RTT_MR &= ~RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 149 }
mbed_official 107:414e9c822e99 150 /**
mbed_official 107:414e9c822e99 151 * \brief Disable RTT.
mbed_official 107:414e9c822e99 152 *
mbed_official 107:414e9c822e99 153 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 154 */
mbed_official 107:414e9c822e99 155 void rtt_disable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 156 {
mbed_official 107:414e9c822e99 157 p_rtt->RTT_MR |= RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 158 }
mbed_official 107:414e9c822e99 159 #endif
mbed_official 107:414e9c822e99 160
mbed_official 107:414e9c822e99 161 /**
mbed_official 107:414e9c822e99 162 * \brief Enable RTT interrupts.
mbed_official 107:414e9c822e99 163 *
mbed_official 107:414e9c822e99 164 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 165 * \param ul_sources Interrupts to be enabled.
mbed_official 107:414e9c822e99 166 */
mbed_official 107:414e9c822e99 167 void rtt_enable_interrupt(Rtt *p_rtt, uint32_t ul_sources)
mbed_official 107:414e9c822e99 168 {
mbed_official 107:414e9c822e99 169 uint32_t temp;
mbed_official 107:414e9c822e99 170
mbed_official 107:414e9c822e99 171 temp = p_rtt->RTT_MR;
mbed_official 107:414e9c822e99 172 temp |= ul_sources;
mbed_official 107:414e9c822e99 173 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 174 temp |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 175 #endif
mbed_official 107:414e9c822e99 176 p_rtt->RTT_MR = temp;
mbed_official 107:414e9c822e99 177 }
mbed_official 107:414e9c822e99 178
mbed_official 107:414e9c822e99 179 /**
mbed_official 107:414e9c822e99 180 * \brief Disable RTT interrupts.
mbed_official 107:414e9c822e99 181 *
mbed_official 107:414e9c822e99 182 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 183 * \param ul_sources Interrupts to be disabled.
mbed_official 107:414e9c822e99 184 */
mbed_official 107:414e9c822e99 185 void rtt_disable_interrupt(Rtt *p_rtt, uint32_t ul_sources)
mbed_official 107:414e9c822e99 186 {
mbed_official 107:414e9c822e99 187 uint32_t temp = 0;
mbed_official 107:414e9c822e99 188
mbed_official 107:414e9c822e99 189 temp = p_rtt->RTT_MR;
mbed_official 107:414e9c822e99 190 temp &= (~ul_sources);
mbed_official 107:414e9c822e99 191 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 192 temp |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 193 #endif
mbed_official 107:414e9c822e99 194 p_rtt->RTT_MR = temp;
mbed_official 107:414e9c822e99 195 }
mbed_official 107:414e9c822e99 196
mbed_official 107:414e9c822e99 197 /**
mbed_official 107:414e9c822e99 198 * \brief Read the current value of the RTT timer value.
mbed_official 107:414e9c822e99 199 *
mbed_official 107:414e9c822e99 200 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 201 *
mbed_official 107:414e9c822e99 202 * \return The current Real-time Timer value.
mbed_official 107:414e9c822e99 203 */
mbed_official 107:414e9c822e99 204 uint32_t rtt_read_timer_value(Rtt *p_rtt)
mbed_official 107:414e9c822e99 205 {
mbed_official 107:414e9c822e99 206 return p_rtt->RTT_VR;
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208
mbed_official 107:414e9c822e99 209 /**
mbed_official 107:414e9c822e99 210 * \brief Get the status register value of the given RTT.
mbed_official 107:414e9c822e99 211 *
mbed_official 107:414e9c822e99 212 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 213 *
mbed_official 107:414e9c822e99 214 * \return The Real-time Timer status.
mbed_official 107:414e9c822e99 215 */
mbed_official 107:414e9c822e99 216 uint32_t rtt_get_status(Rtt *p_rtt)
mbed_official 107:414e9c822e99 217 {
mbed_official 107:414e9c822e99 218 return p_rtt->RTT_SR;
mbed_official 107:414e9c822e99 219 }
mbed_official 107:414e9c822e99 220
mbed_official 107:414e9c822e99 221 /**
mbed_official 107:414e9c822e99 222 * \brief Configure the RTT to generate an alarm at the given time.
mbed_official 107:414e9c822e99 223 *
mbed_official 107:414e9c822e99 224 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 225 * \param ul_alarm_time Alarm time.
mbed_official 107:414e9c822e99 226 *
mbed_official 107:414e9c822e99 227 * \retval 0 Configuration is done.
mbed_official 107:414e9c822e99 228 * \retval 1 Parameter error.
mbed_official 107:414e9c822e99 229 */
mbed_official 107:414e9c822e99 230 uint32_t rtt_write_alarm_time(Rtt *p_rtt, uint32_t ul_alarm_time)
mbed_official 107:414e9c822e99 231 {
mbed_official 107:414e9c822e99 232 uint32_t flag;
mbed_official 107:414e9c822e99 233
mbed_official 107:414e9c822e99 234 if (ul_alarm_time == 0) {
mbed_official 107:414e9c822e99 235 return 1;
mbed_official 107:414e9c822e99 236 }
mbed_official 107:414e9c822e99 237
mbed_official 107:414e9c822e99 238 flag = p_rtt->RTT_MR & RTT_MR_ALMIEN;
mbed_official 107:414e9c822e99 239
mbed_official 107:414e9c822e99 240 rtt_disable_interrupt(RTT, RTT_MR_ALMIEN);
mbed_official 107:414e9c822e99 241
mbed_official 107:414e9c822e99 242 /* Alarm time = ALMV + 1 */
mbed_official 107:414e9c822e99 243 p_rtt->RTT_AR = ul_alarm_time - 1;
mbed_official 107:414e9c822e99 244
mbed_official 107:414e9c822e99 245 if (flag) {
mbed_official 107:414e9c822e99 246 rtt_enable_interrupt(RTT, RTT_MR_ALMIEN);
mbed_official 107:414e9c822e99 247 }
mbed_official 107:414e9c822e99 248
mbed_official 107:414e9c822e99 249 return 0;
mbed_official 107:414e9c822e99 250 }
mbed_official 107:414e9c822e99 251
mbed_official 107:414e9c822e99 252 //@}
mbed_official 107:414e9c822e99 253
mbed_official 107:414e9c822e99 254 /// @cond 0
mbed_official 107:414e9c822e99 255 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 256 #ifdef __cplusplus
mbed_official 107:414e9c822e99 257 }
mbed_official 107:414e9c822e99 258 #endif
mbed_official 107:414e9c822e99 259 /**INDENT-ON**/
mbed_official 107:414e9c822e99 260 /// @endcond