57 #include <adi_processor.h> 58 #include <drivers/rng/adi_rng.h> 59 #include "adi_rng_def.h" 60 #include <rtos_map/adi_rtos_map.h> 78 #pragma diag_suppress=Pm011,Pm073,Pm143,Pm050 81 #if defined(__ADUCM4x50__) || defined(__ADUCM302x__) 82 #define NUM_RNG_DEVICES (1u) 84 #error "Unsupported processor" 93 #pragma diag_suppress=Pm140 96 static ADI_RNG_DEV_TYPE gRNG_Device[NUM_RNG_DEVICES] =
98 {(ADI_RNG_TypeDef*)pADI_RNG0,NULL}
101 #pragma diag_default=Pm140 105 void RNG_Int_Handler(
void);
109 #define ADI_RNG_INVALID_HANDLE(h) (&gRNG_Device[0] != (h)) 141 uint32_t
const nDeviceNum,
143 uint32_t
const MemorySize,
147 ADI_RNG_DEV_TYPE *pDevice;
153 if (nDeviceNum >= NUM_RNG_DEVICES)
162 assert (ADI_RNG_MEMORY_SIZE ==
sizeof(ADI_RNG_DEV_DATA_TYPE));
166 pDevice = &gRNG_Device[nDeviceNum];
169 if (NULL != pDevice->pData)
176 pDevice->pData = pMemory;
179 pDevice->pData->IRQn = RNG0_EVT_IRQn;
180 pDevice->pData->CBFunc = NULL;
183 pDevice->pRNG->STAT = BITM_RNG_STAT_RNRDY | BITM_RNG_STAT_STUCK;
193 NVIC_ClearPendingIRQ(pDevice->pData->IRQn);
218 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
221 if (ADI_RNG_INVALID_HANDLE(pDevice)){
225 if (NULL == pDevice->pData) {
231 NVIC_DisableIRQ(pDevice->pData->IRQn);
232 pDevice->pData = NULL;
253 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
254 ADI_INT_STATUS_ALLOC();
257 if (ADI_RNG_INVALID_HANDLE(pDevice)) {
261 if (NULL == pDevice->pData) {
266 ADI_ENTER_CRITICAL_REGION();
268 pDevice->pRNG->CTL |= BITM_RNG_CTL_EN;
270 pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_EN);
272 ADI_EXIT_CRITICAL_REGION();
296 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
297 ADI_INT_STATUS_ALLOC();
300 if (ADI_RNG_INVALID_HANDLE(pDevice)) {
304 if (NULL == pDevice->pData) {
309 ADI_ENTER_CRITICAL_REGION();
311 pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_SINGLE);
313 pDevice->pRNG->CTL |= BITM_RNG_CTL_SINGLE;
315 ADI_EXIT_CRITICAL_REGION();
338 uint16_t
const nLenPrescaler,
339 uint16_t
const nLenReload
342 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
343 ADI_INT_STATUS_ALLOC();
346 if (ADI_RNG_INVALID_HANDLE(pDevice)){
350 if (NULL == pDevice->pData) {
354 if ( (nLenPrescaler > 10u)
355 || ((0u == nLenPrescaler) && (0u == nLenReload))
356 || (nLenReload > 4095u)) {
361 ADI_ENTER_CRITICAL_REGION();
363 pDevice->pRNG->LEN = (uint16_t)((uint16_t)(nLenReload << BITP_RNG_LEN_RELOAD) & BITM_RNG_LEN_RELOAD)
364 | (uint16_t)((uint16_t)(nLenPrescaler << BITP_RNG_LEN_PRESCALE) & BITM_RNG_LEN_PRESCALE);
365 ADI_EXIT_CRITICAL_REGION();
394 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
397 if (ADI_RNG_INVALID_HANDLE(pDevice)){
401 if (NULL == pDevice->pData) {
405 if (NULL == pbFlag) {
411 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) != 0u)
446 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
449 if (ADI_RNG_INVALID_HANDLE(pDevice)){
453 if (pDevice->pData == NULL) {
457 if (NULL == pbFlag) {
463 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_STUCK) != 0u)
499 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
502 if (ADI_RNG_INVALID_HANDLE(pDevice)){
506 if (NULL == pDevice->pData) {
510 if (NULL == pRegData) {
514 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
520 *pRegData = pDevice->pRNG->DATA;
544 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
547 if (ADI_RNG_INVALID_HANDLE(pDevice)){
551 if (NULL == pDevice->pData) {
555 if (NULL == pOscCount) {
559 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
565 *pOscCount = pDevice->pRNG->OSCCNT;
590 uint32_t
const nIndex,
591 uint8_t*
const pOscDiff
594 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
597 if (ADI_RNG_INVALID_HANDLE(pDevice)){
601 if (NULL == pDevice->pData) {
605 if ((NULL == pOscDiff) || (nIndex > 3u)) {
609 if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) {
615 *pOscDiff = (uint8_t)pDevice->pRNG->OSCDIFF[nIndex];
639 uint16_t*
const pLenPrescaler,
640 uint16_t*
const pLenReload
643 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
646 if (ADI_RNG_INVALID_HANDLE(pDevice)){
650 if (NULL == pDevice->pData) {
654 if ((NULL == pLenPrescaler) || (NULL == pLenReload)) {
659 *pLenPrescaler = (pDevice->pRNG->LEN & BITM_RNG_LEN_PRESCALE) >> BITP_RNG_LEN_PRESCALE;
660 *pLenReload = (pDevice->pRNG->LEN & BITM_RNG_LEN_RELOAD) >> BITP_RNG_LEN_RELOAD;
715 ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice;
718 if (ADI_RNG_INVALID_HANDLE(pDevice)){
722 if (NULL == pDevice->pData) {
728 pDevice->pData->CBFunc = cbFunc;
729 pDevice->pData->pCBParam = pCBParam;
731 if (NULL != cbFunc) {
733 NVIC_EnableIRQ(pDevice->pData->IRQn);
735 NVIC_DisableIRQ(pDevice->pData->IRQn);
743 void RNG_Int_Handler(
void)
746 ADI_RNG_DEV_TYPE *pDevice = &gRNG_Device[0];
747 register uint16_t candidate;
750 if (NULL != pDevice->pData)
753 if (NULL != pDevice->pData->CBFunc)
755 ADI_INT_STATUS_ALLOC();
757 ADI_ENTER_CRITICAL_REGION();
759 candidate = pDevice->pRNG->STAT;
760 ADI_EXIT_CRITICAL_REGION();
763 candidate = candidate & (BITM_RNG_STAT_STUCK | BITM_RNG_STAT_RNRDY);
765 while (0u != candidate) {
768 if (0u != (candidate & BITM_RNG_STAT_RNRDY)) {
770 candidate &= (uint16_t)~BITM_RNG_STAT_RNRDY;
771 }
else if (0u != (candidate & BITM_RNG_STAT_STUCK)) {
773 candidate &= (uint16_t)~BITM_RNG_STAT_STUCK;
778 pDevice->pData->CBFunc (
779 pDevice->pData->pCBParam,
785 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