mirror of https://github.com/ARMmbed/mbed-os.git
- Added code to clear temporary variable on the stack before exiting the
trng_get_bytes; - Removed lp ticker as it does not satisfy the requirements of the lp timer.pull/5144/head
parent
de2b5264e2
commit
2eff4c7569
|
@ -1,259 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2010-2017 Analog Devices, Inc.
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
* - Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* - Modified versions of the software must be conspicuously marked as such.
|
|
||||||
* - This software is licensed solely and exclusively for use with processors
|
|
||||||
* manufactured by or for Analog Devices, Inc.
|
|
||||||
* - This software may not be combined or merged with other code in any manner
|
|
||||||
* that would cause the software to become subject to terms and conditions
|
|
||||||
* which differ from those listed here.
|
|
||||||
* - Neither the name of Analog Devices, Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived
|
|
||||||
* from this software without specific prior written permission.
|
|
||||||
* - The use of this software may or may not infringe the patent rights of one
|
|
||||||
* or more patent holders. This license does not release you from the
|
|
||||||
* requirement that you obtain separate licenses from these patent holders
|
|
||||||
* to use this software.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-
|
|
||||||
* INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF
|
|
||||||
* CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#include <sys/platform.h>
|
|
||||||
#include "lp_ticker_api.h"
|
|
||||||
#include <drivers/rtc/adi_rtc.h>
|
|
||||||
#include <drivers/pwr/adi_pwr.h>
|
|
||||||
#include "adi_rtc_def.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEVICE_LOWPOWERTIMER
|
|
||||||
|
|
||||||
// define base LF clock frequncy in Hz
|
|
||||||
#define LFCLK_FREQUENCY_HZ 32768
|
|
||||||
// RTC prescaler for the LF clock
|
|
||||||
#define RTC_PRESCALER 0
|
|
||||||
|
|
||||||
/* time for each tick of the LF clock in us */
|
|
||||||
#define TIME_US_PER_TICK ((float)1000000/(float)(LFCLK_FREQUENCY_HZ>>RTC_PRESCALER))
|
|
||||||
|
|
||||||
// The number of RTC clock ticks it takes to set & enable the alarm
|
|
||||||
#define TICKS_TO_ENABLE_ALARM 10
|
|
||||||
|
|
||||||
// Mask to limit the value of the RTC value to 27 bits so the converted time in us fits
|
|
||||||
// in 32-bits
|
|
||||||
#define MAX_TICK_MASK ((1 << 27) - 1)
|
|
||||||
|
|
||||||
static unsigned char rtc1_memory[ADI_RTC_MEMORY_SIZE];
|
|
||||||
static ADI_RTC_HANDLE hRTC1_Device;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \defgroup hal_LpTicker Low Power Ticker Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Local stream-lined alarm setting function.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int set_rtc_alarm_interrupt(ADI_RTC_HANDLE const hDevice, uint32_t nAlarm)
|
|
||||||
{
|
|
||||||
ADI_RTC_DEVICE *pDevice = hDevice;
|
|
||||||
uint16_t cr0;
|
|
||||||
ADI_INT_STATUS_ALLOC();
|
|
||||||
|
|
||||||
// Section to enable interrupts
|
|
||||||
// The interrupt used is ADI_RTC_ALARM_INT
|
|
||||||
// Set the Alarm interrupt enable and Alarm enable bits in cr0
|
|
||||||
cr0 = BITM_RTC_CR0_ALMEN | (1u << BITP_RTC_CR0_ALMINTEN);
|
|
||||||
|
|
||||||
// Set the alarm value
|
|
||||||
/* Wait till previously posted write to Alram Register to complete */
|
|
||||||
PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1))
|
|
||||||
|
|
||||||
ADI_ENTER_CRITICAL_REGION();
|
|
||||||
/* Program the alarm count registers. */
|
|
||||||
pDevice->pRTCRegs->ALM0 = (uint16_t)nAlarm;
|
|
||||||
pDevice->pRTCRegs->ALM1 = (uint16_t)(nAlarm >> 16);
|
|
||||||
pDevice->pRTCRegs->ALM2 = 0u;
|
|
||||||
ADI_EXIT_CRITICAL_REGION();
|
|
||||||
|
|
||||||
/* Wait till write to Control Register to take effect */
|
|
||||||
SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCALM0|BITM_RTC_SR0_WSYNCALM1))
|
|
||||||
|
|
||||||
// Enable alarm
|
|
||||||
/* Wait till previously posted write to Control Register to complete */
|
|
||||||
PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDALM1|BITM_RTC_SR1_WPNDALM0)
|
|
||||||
|
|
||||||
ADI_ENTER_CRITICAL_REGION();
|
|
||||||
/* set RTC alarm and interrupt enable */
|
|
||||||
pDevice->pRTCRegs->CR0 |= cr0;
|
|
||||||
ADI_EXIT_CRITICAL_REGION();
|
|
||||||
|
|
||||||
/* Wait till write to Control Register to take effect */
|
|
||||||
SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0)
|
|
||||||
|
|
||||||
return ADI_RTC_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Local RTC 1 ISR callback function.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void rtc1_Callback(void *pCBParam, uint32_t nEvent, void *EventArg)
|
|
||||||
{
|
|
||||||
/* process RTC interrupts (cleared by driver) */
|
|
||||||
if (ADI_RTC_ALARM_INT & nEvent) {
|
|
||||||
lp_ticker_irq_handler();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* HAL lp ticker */
|
|
||||||
|
|
||||||
/** Initialize the low power ticker
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void lp_ticker_init()
|
|
||||||
{
|
|
||||||
// open the rtc device
|
|
||||||
adi_rtc_Open(1, rtc1_memory, ADI_RTC_MEMORY_SIZE, &hRTC1_Device);
|
|
||||||
|
|
||||||
// set the prescaler value
|
|
||||||
adi_rtc_SetPreScale(hRTC1_Device, RTC_PRESCALER);
|
|
||||||
|
|
||||||
// register call back for events
|
|
||||||
adi_rtc_RegisterCallback(hRTC1_Device, rtc1_Callback, hRTC1_Device);
|
|
||||||
|
|
||||||
// reset the RTC counter
|
|
||||||
adi_rtc_SetCount(hRTC1_Device, 0);
|
|
||||||
|
|
||||||
// set the trim value
|
|
||||||
adi_rtc_SetTrim(hRTC1_Device, ADI_RTC_TRIM_INTERVAL_14, ADI_RTC_TRIM_1, ADI_RTC_TRIM_SUB);
|
|
||||||
|
|
||||||
adi_rtc_EnableTrim(hRTC1_Device, true);
|
|
||||||
|
|
||||||
// enable the RTC
|
|
||||||
adi_rtc_Enable(hRTC1_Device, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Read the current counter
|
|
||||||
*
|
|
||||||
* @return The current timer's counter value in microseconds
|
|
||||||
*/
|
|
||||||
uint32_t lp_ticker_read()
|
|
||||||
{
|
|
||||||
uint32_t count;
|
|
||||||
float t;
|
|
||||||
|
|
||||||
// get current count
|
|
||||||
adi_rtc_GetCount(hRTC1_Device, &count);
|
|
||||||
|
|
||||||
// Throw away top 5 bits to avoid overflow and convert ticks to us
|
|
||||||
count &= MAX_TICK_MASK;
|
|
||||||
t = (float)count * TIME_US_PER_TICK;
|
|
||||||
|
|
||||||
return (uint32_t)t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set interrupt for specified timestamp
|
|
||||||
*
|
|
||||||
* @param timestamp The time in microseconds to be set
|
|
||||||
*/
|
|
||||||
void lp_ticker_set_interrupt(timestamp_t timestamp)
|
|
||||||
{
|
|
||||||
uint32_t rtcCount, trunc_rtcCount, set_tick, tick_delta, alarm_tick;
|
|
||||||
|
|
||||||
// compute the tick value based on the given alarm time
|
|
||||||
set_tick = (uint32_t)((float)(timestamp) / TIME_US_PER_TICK);
|
|
||||||
|
|
||||||
// get current count
|
|
||||||
adi_rtc_GetCount(hRTC1_Device, &rtcCount);
|
|
||||||
|
|
||||||
// compute the number of ticks required for the alarm
|
|
||||||
trunc_rtcCount = rtcCount & MAX_TICK_MASK;
|
|
||||||
|
|
||||||
// if set_tick is less than the current RTC count, the counter has
|
|
||||||
// missed the desired time, so set tick_delta to 0
|
|
||||||
if (set_tick >= trunc_rtcCount) {
|
|
||||||
tick_delta = set_tick - trunc_rtcCount;
|
|
||||||
} else {
|
|
||||||
tick_delta = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute the absolute RTC alarm count required
|
|
||||||
alarm_tick = rtcCount + tick_delta;
|
|
||||||
|
|
||||||
// check if the desired alarm duration is less than TICKS_TO_ENABLE_ALARM,
|
|
||||||
// if so just wait it out rather than setting the alarm
|
|
||||||
if (tick_delta <= TICKS_TO_ENABLE_ALARM) {
|
|
||||||
// otherwise if the alarm time is less than the current RTC count + the time
|
|
||||||
// it takes to enable the alarm, just wait until the desired number of counts
|
|
||||||
// has expired rather than using the interrupt, then call the user ISR directly.
|
|
||||||
do {
|
|
||||||
adi_rtc_GetCount(hRTC1_Device, &rtcCount);
|
|
||||||
} while (rtcCount < alarm_tick);
|
|
||||||
|
|
||||||
rtc1_Callback(NULL, ADI_RTC_ALARM_INT, NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the alarm otherwise
|
|
||||||
set_rtc_alarm_interrupt(hRTC1_Device, alarm_tick);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Disable low power ticker interrupt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void lp_ticker_disable_interrupt()
|
|
||||||
{
|
|
||||||
adi_rtc_EnableInterrupts(hRTC1_Device, ADI_RTC_ALARM_INT, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Clear the low power ticker interrupt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void lp_ticker_clear_interrupt()
|
|
||||||
{
|
|
||||||
ADI_RTC_DEVICE *pDevice = hRTC1_Device;
|
|
||||||
|
|
||||||
NVIC_ClearPendingIRQ(pDevice->eIRQn);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Set pending interrupt that should be fired right away.
|
|
||||||
*
|
|
||||||
* The ticker should be initialized prior calling this function.
|
|
||||||
*/
|
|
||||||
void lp_ticker_fire_interrupt(void)
|
|
||||||
{
|
|
||||||
ADI_RTC_DEVICE *pDevice = hRTC1_Device;
|
|
||||||
|
|
||||||
NVIC_SetPendingIRQ(pDevice->eIRQn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/**@}*/
|
|
|
@ -110,6 +110,9 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l
|
||||||
|
|
||||||
// Save the output
|
// Save the output
|
||||||
output[i] = (uint8_t)(nRandomNum & 0xFF);
|
output[i] = (uint8_t)(nRandomNum & 0xFF);
|
||||||
|
|
||||||
|
// Clear the nRandomNum variable for security purposes
|
||||||
|
nRandomNum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*output_length = length;
|
*output_length = length;
|
||||||
|
|
|
@ -618,7 +618,7 @@
|
||||||
"supported_toolchains": ["ARM", "GCC_ARM", "IAR"],
|
"supported_toolchains": ["ARM", "GCC_ARM", "IAR"],
|
||||||
"macros": ["__ADUCM4050__", "EV_COG_AD4050LZ"],
|
"macros": ["__ADUCM4050__", "EV_COG_AD4050LZ"],
|
||||||
"extra_labels": ["Analog_Devices", "ADUCM4X50", "ADUCM4050", "EV_COG_AD4050LZ", "FLASH_CMSIS_ALGO"],
|
"extra_labels": ["Analog_Devices", "ADUCM4X50", "ADUCM4050", "EV_COG_AD4050LZ", "FLASH_CMSIS_ALGO"],
|
||||||
"device_has": ["SERIAL", "STDIO_MESSAGES", "TRNG", "SLEEP", "INTERRUPTIN", "LOWPOWERTIMER", "RTC", "SPI", "I2C", "FLASH", "ANALOGIN"],
|
"device_has": ["SERIAL", "STDIO_MESSAGES", "TRNG", "SLEEP", "INTERRUPTIN", "RTC", "SPI", "I2C", "FLASH", "ANALOGIN"],
|
||||||
"device_name": "ADuCM4050",
|
"device_name": "ADuCM4050",
|
||||||
"detect_code": ["0603"],
|
"detect_code": ["0603"],
|
||||||
"release_versions": ["5"]
|
"release_versions": ["5"]
|
||||||
|
|
Loading…
Reference in New Issue