24 #include <adi_processor.h> 25 #include <drivers/rng/adi_rng.h> 26 #include "adi_rng_def.h" 27 #include <rtos_map/adi_rtos_map.h> 45 #pragma diag_suppress=Pm011,Pm073,Pm143,Pm050 48 #if defined(__ADUCM4x50__) || defined(__ADUCM302x__) 49 #define NUM_RNG_DEVICES (1u) 51 #error "Unsupported processor" 60 #pragma diag_suppress=Pm140 63 static ADI_RNG_DEV_TYPE gRNG_Device[NUM_RNG_DEVICES] =
65 {(ADI_RNG_TypeDef*)pADI_RNG0,NULL}
68 #pragma diag_default=Pm140 72 void RNG_Int_Handler(
void);
76 #define ADI_RNG_INVALID_HANDLE(h) (&gRNG_Device[0] != (h)) 108 uint32_t
const nDeviceNum,
110 uint32_t
const MemorySize,
114 ADI_RNG_DEV_TYPE *pDevice;
120 if (nDeviceNum >= NUM_RNG_DEVICES)
133 pDevice = &gRNG_Device[nDeviceNum];
136 if (NULL != pDevice->pData)
143 pDevice->pData = pMemory;
146 pDevice->pData->IRQn = RNG0_EVT_IRQn;
147 pDevice->pData->CBFunc = NULL;
150 pDevice->pRNG->STAT = BITM_RNG_STAT_RNRDY | BITM_RNG_STAT_STUCK;
160 NVIC_ClearPendingIRQ(pDevice->pData->IRQn);
185 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
188 if (ADI_RNG_INVALID_HANDLE(pDevice)){
192 if (NULL == pDevice->pData) {
198 NVIC_DisableIRQ(pDevice->pData->IRQn);
199 pDevice->pData = NULL;
220 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
221 ADI_INT_STATUS_ALLOC();
224 if (ADI_RNG_INVALID_HANDLE(pDevice)) {
228 if (NULL == pDevice->pData) {
233 ADI_ENTER_CRITICAL_REGION();
235 pDevice->pRNG->CTL |= BITM_RNG_CTL_EN;
237 pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_EN);
239 ADI_EXIT_CRITICAL_REGION();
263 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
264 ADI_INT_STATUS_ALLOC();
267 if (ADI_RNG_INVALID_HANDLE(pDevice)) {
271 if (NULL == pDevice->pData) {
276 ADI_ENTER_CRITICAL_REGION();
278 pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_SINGLE);
280 pDevice->pRNG->CTL |= BITM_RNG_CTL_SINGLE;
282 ADI_EXIT_CRITICAL_REGION();
305 uint16_t
const nLenPrescaler,
306 uint16_t
const nLenReload
309 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
310 ADI_INT_STATUS_ALLOC();
313 if (ADI_RNG_INVALID_HANDLE(pDevice)){
317 if (NULL == pDevice->pData) {
321 if ( (nLenPrescaler > 10u)
322 || ((0u == nLenPrescaler) && (0u == nLenReload))
323 || (nLenReload > 4095u)) {
328 ADI_ENTER_CRITICAL_REGION();
330 pDevice->pRNG->LEN = (uint16_t)((uint16_t)(nLenReload << BITP_RNG_LEN_RELOAD) & BITM_RNG_LEN_RELOAD)
331 | (uint16_t)((uint16_t)(nLenPrescaler << BITP_RNG_LEN_PRESCALE) & BITM_RNG_LEN_PRESCALE);
332 ADI_EXIT_CRITICAL_REGION();
361 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
364 if (ADI_RNG_INVALID_HANDLE(pDevice)){
368 if (NULL == pDevice->pData) {
372 if (NULL == pbFlag) {
378 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) != 0u)
413 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
416 if (ADI_RNG_INVALID_HANDLE(pDevice)){
420 if (pDevice->pData == NULL) {
424 if (NULL == pbFlag) {
430 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_STUCK) != 0u)
466 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
469 if (ADI_RNG_INVALID_HANDLE(pDevice)){
473 if (NULL == pDevice->pData) {
477 if (NULL == pRegData) {
481 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
487 *pRegData = pDevice->pRNG->DATA;
511 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
514 if (ADI_RNG_INVALID_HANDLE(pDevice)){
518 if (NULL == pDevice->pData) {
522 if (NULL == pOscCount) {
526 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
532 *pOscCount = pDevice->pRNG->OSCCNT;
557 uint32_t
const nIndex,
558 uint8_t*
const pOscDiff
561 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
564 if (ADI_RNG_INVALID_HANDLE(pDevice)){
568 if (NULL == pDevice->pData) {
572 if ((NULL == pOscDiff) || (nIndex > 3u)) {
576 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
582 *pOscDiff = (uint8_t)pDevice->pRNG->OSCDIFF[nIndex];
606 uint16_t*
const pLenPrescaler,
607 uint16_t*
const pLenReload
610 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
613 if (ADI_RNG_INVALID_HANDLE(pDevice)){
617 if (NULL == pDevice->pData) {
621 if ((NULL == pLenPrescaler) || (NULL == pLenReload)) {
626 *pLenPrescaler = (pDevice->pRNG->LEN & BITM_RNG_LEN_PRESCALE) >> BITP_RNG_LEN_PRESCALE;
627 *pLenReload = (pDevice->pRNG->LEN & BITM_RNG_LEN_RELOAD) >> BITP_RNG_LEN_RELOAD;
682 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
685 if (ADI_RNG_INVALID_HANDLE(pDevice)){
689 if (NULL == pDevice->pData) {
695 pDevice->pData->CBFunc = cbFunc;
696 pDevice->pData->pCBParam = pCBParam;
698 if (NULL != cbFunc) {
700 NVIC_EnableIRQ(pDevice->pData->IRQn);
702 NVIC_DisableIRQ(pDevice->pData->IRQn);
710 void RNG_Int_Handler(
void)
713 ADI_RNG_DEV_TYPE *pDevice = &gRNG_Device[0];
714 register uint16_t candidate;
717 if (NULL != pDevice->pData)
720 if (NULL != pDevice->pData->CBFunc)
722 ADI_INT_STATUS_ALLOC();
724 ADI_ENTER_CRITICAL_REGION();
726 candidate = pDevice->pRNG->STAT;
727 ADI_EXIT_CRITICAL_REGION();
730 candidate = candidate & (BITM_RNG_STAT_STUCK | BITM_RNG_STAT_RNRDY);
732 while (0u != candidate) {
735 if (0u != (candidate & BITM_RNG_STAT_RNRDY)) {
737 candidate &= (uint16_t)~BITM_RNG_STAT_RNRDY;
738 }
else if (0u != (candidate & BITM_RNG_STAT_STUCK)) {
740 candidate &= (uint16_t)~BITM_RNG_STAT_STUCK;
745 pDevice->pData->CBFunc (
746 pDevice->pData->pCBParam,
752 pDevice->pRNG->STAT = BITM_RNG_STAT_RNRDY | BITM_RNG_STAT_STUCK;
ADI_RNG_RESULT adi_rng_GetStuckStatus(ADI_RNG_HANDLE const hDevice, bool *const pbFlag)
Retrieve whether the RNG oscillator output is stuck at a constant value.
ADI_RNG_RESULT adi_rng_GetOscCount(ADI_RNG_HANDLE const hDevice, uint32_t *const pOscCount)
Retrieve the current RNG Oscillator count.
#define RNG0_CFG_ONLY_8_BIT
ADI_RNG_RESULT adi_rng_GetRngData(ADI_RNG_HANDLE const hDevice, uint32_t *const pRegData)
Retrieve the current value of the RNG data register.
ADI_RNG_RESULT adi_rng_GetOscDiff(ADI_RNG_HANDLE const hDevice, uint32_t const nIndex, uint8_t *const pOscDiff)
Retrieve the current RNG Oscillator difference value for the given index.
ADI_RNG_RESULT adi_rng_RegisterCallback(ADI_RNG_HANDLE hDevice, ADI_CALLBACK cbFunc, void *pCBParam)
RNG Application callback registration API.
ADI_RNG_RESULT adi_rng_GetSampleLen(ADI_RNG_HANDLE const hDevice, uint16_t *const pLenPrescaler, uint16_t *const pLenReload)
Retrieve the current RNG sample length prescale and reload value configured in the device.
ADI_RNG_RESULT adi_rng_GetRdyStatus(ADI_RNG_HANDLE const hDevice, bool *const pbFlag)
Retrieves the current state of RNG data/CRC accumulator register.
ADI_RNG_RESULT adi_rng_EnableBuffering(ADI_RNG_HANDLE const hDevice, bool const bFlag)
Enables/Disables Buffering for RNG.
ADI_RNG_RESULT adi_rng_SetSampleLen(ADI_RNG_HANDLE const hDevice, uint16_t const nLenPrescaler, uint16_t const nLenReload)
Sets the reload and prescale value for the sample counter. The Sample Length will be nLenReload*2^nLe...
ADI_RNG_RESULT adi_rng_Open(uint32_t const nDeviceNum, void *const pMemory, uint32_t const MemorySize, ADI_RNG_HANDLE *const phDevice)
Opena a Random Number Generator Device.
ADI_RNG_RESULT adi_rng_Close(ADI_RNG_HANDLE hDevice)
Uninitializes and deallocates the RNG device.
#define RNG0_CFG_LENGTH_RELOAD
ADI_RNG_RESULT adi_rng_Enable(ADI_RNG_HANDLE const hDevice, bool const bFlag)
Enables/Disables the RNG device.
#define ADI_RNG_MEMORY_SIZE
#define RNG0_CFG_LENGTH_PRESCALER