#ifndef __W55MH32_TRNG_H
#define __W55MH32_TRNG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "w55mh32.h"

typedef enum
{
    TRNG_PDSource_0 = 0xE,
    TRNG_PDSource_1 = 0xD,
    TRNG_PDSource_2 = 0xB,
    TRNG_PDSource_3 = 0x7,
} TRNG_PDSourceTypeDef;

#define TRNG_Periph_Div_None                       ((uint32_t)0x00)
#define TRNG_Periph_Div2                           ((uint32_t)0x01)
#define TRNG_Periph_Div4                           ((uint32_t)0x10)
#define TRNG_Periph_Div8                           ((uint32_t)0x11)

#define IS_TRNG_DIV(DIV)                          	(((DIV) == TRNG_Periph_Div_None)  || \
                                                    ((DIV) == TRNG_Periph_Div2)  || \
                                                    ((DIV) == TRNG_Periph_Div4)  || \
                                                    ((DIV) == TRNG_Periph_Div8))


#define IS_TRNG_PDSource(PDSOURCE)  	    (((PDSOURCE) == TRNG_PDSource_0) ||\
                                             ((PDSOURCE) == TRNG_PDSource_1) ||\
                                             ((PDSOURCE) == TRNG_PDSource_2) ||\
                                             ((PDSOURCE) == TRNG_PDSource_3))

#define TRNG_IT_RNG0_S128           ((uint32_t)0x00000001)
#define TRNG_IT_RNG0_ATTACK         ((uint32_t)0x00000004)    
#define IS_TRNG_GET_IT(IT)  		(((IT) == TRNG_IT_RNG0_S128) || \
									((IT) == TRNG_IT_RNG0_ATTACK))



/************ bit definition for TRNG RNG_INDEX REGISTER ************/

#define RNG_FIFO_INDEX_Mask                         BIT(31)
/************ bit definition for TRNG RNG_CSR REGISTER ************/
#define TRNG_RNG_CSR_INTP_EN_Mask                   ((uint32_t)0x0010)
#define TRNG_RNG_CSR_ATTACK_TRNG0_Mask              ((uint32_t)0x0004)
#define TRNG_RNG_CSR_S128_TRNG0_Mask                ((uint32_t)0x0001)

/************ bit definition for TRNG RNG_AMA REGISTER ************/
#define TRNG_RNG_AMA_OUT_TRNG0_Mask             	((uint32_t)0x10000000)
#define TRNG_RNG_AMA_PD_TRNG0_Mask                  ((uint32_t)0x00001000)
#define TRNG_RNG_AMA_PD_TRNG1_Mask                  ((uint32_t)0x00002000)
#define TRNG_RNG_AMA_PD_TRNG2_Mask                  ((uint32_t)0x00004000)
#define TRNG_RNG_AMA_PD_TRNG3_Mask                  ((uint32_t)0x00008000)
#define TRNG_RNG_AMA_PD_ALL_Mask                    ((uint32_t)0x0000F000)
/************ bit definition for TRNG ENABLE REGISTER ************/
#define TRNG_RNG_ENABLE                    					((uint32_t)0x00000001)

/** @defgroup RNG_Exported_Functions
  * @{
  */
void TRNG_Start(void);
void TRNG_Stop(void);
uint32_t TRNG_Get(uint32_t TRNG_Data[4]);
void TRNG_SetPseudoRandom(uint32_t TRNG_PseudoRandom);;
void TRNG_DirectOutANA(FunctionalState NewState);

void TRNG_ITConfig(FunctionalState NewState);
ITStatus TRNG_GetITStatus(uint32_t TRNG_IT);
void TRNG_ClearITPendingBit(uint32_t TRNG_IT);
void TRNG_SelectPDSource(TRNG_PDSourceTypeDef TRNG_Source);
void TRNG_Out(FunctionalState NewState);
#ifdef __cplusplus
}
#endif

#endif 

/**************************      (C) COPYRIGHT  2024  WIZnet    *****END OF FILE****/
