Realtek/inc/peripheral/rtl876x_rcc.h
2025-11-25 10:21:47 +08:00

471 lines
18 KiB
C

/**
*********************************************************************************************************
* Copyright(c) 2015, Realtek Semiconductor Corporation. All rights reserved.
*********************************************************************************************************
* \file rtl876x_rcc.h
* \brief The header file of the clock control and reset driver.
* \details This file provides all peripheral clock control firmware functions.
* \author tifnan_ge
* \date 2015-05-16
* \version v0.1
* *********************************************************************************************************
*/
#ifndef _RTL876X_RCC_H_
#define _RTL876X_RCC_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup IO Peripheral Drivers
* \defgroup RCC RCC
*
* \brief Manage the RCC peripheral functions.
*
* \ingroup IO
*/
/*============================================================================*
* Includes
*============================================================================*/
#include "rtl876x.h"
/*============================================================================*
* Constants
*============================================================================*/
/**
* \defgroup RCC_Exported_Constants Macro Definitions
*
* \ingroup RCC
*/
/**
* \defgroup RCC_Peripheral_Clock RCC Peripheral Clock
* \{
* \ingroup RCC_Exported_Constants
*/
#define APBPeriph_I2S0_CLOCK ((uint32_t)((1 << 5) | (1 << 8) | (0x00 << 29)))
#define APBPeriph_I2S1_CLOCK ((uint32_t)((1 << 6) | (1 << 8) | (0x00 << 29)))
#define APBPeriph_CODEC_CLOCK ((uint32_t)((1 << 4) | (0x00 << 29)))
#define APBPeriph_GPIO_CLOCK ((uint32_t)((0x01 << 24) | (0x01 << 29)))
#define APBPeriph_GDMA_CLOCK ((uint32_t)((0x01 << 16) | (0x01 << 29)))
#define APBPeriph_TIMER_CLOCK ((uint32_t)((0x01 << 14) | (0x01 << 29)))
#define APBPeriph_ENHTIMER_CLOCK ((uint32_t)((0x01 << 14) | (0x01 << 29)))
#define APBPeriph_UART2_CLOCK ((uint32_t)((0x01 << 10) | (0x01 << 29)))
#define APBPeriph_UART1_CLOCK ((uint32_t)((0x01 << 12) | (0x01 << 29)))
#define APBPeriph_FLASH_CLOCK ((uint32_t)((0x01 << 8) | (0x01 << 29)))
#define APBPeriph_FLASH2_CLOCK ((uint32_t)((0x01 << 26) | (0x02 << 29)))
#define APBPeriph_FLASH1_CLOCK ((uint32_t)((0x01 << 24) | (0x02 << 29)))
#define APBPeriph_IR_CLOCK ((uint32_t)((0x01 << 20) | (0x02 << 29)))
#define APBPeriph_SPI1_CLOCK ((uint32_t)((0x01 << 18) | (0x02 << 29)))
#define APBPeriph_SPI0_CLOCK ((uint32_t)((0x01 << 16) | (0x02 << 29)))
#define APBPeriph_CTC_CLOCK ((uint32_t)((0x01 << 12) | (0x02 << 29)))
#define APBPeriph_UART0_CLOCK ((uint32_t)((0x01 << 0) | (0x02 << 29)))
#define APBPeriph_IF8080_CLOCK ((uint32_t)((0x01 << 28) | (0x03 << 29)))
#define APBPeriph_ADC_CLOCK ((uint32_t)((0x01 << 24) | (0x03 << 29)))
#define APBPeriph_SPI2W_CLOCK ((uint32_t)((0x01 << 16) | (0x03 << 29)))
#define APBPeriph_KEYSCAN_CLOCK ((uint32_t)((0x01 << 6) | (0x03 << 29)))
#define APBPeriph_QDEC_CLOCK ((uint32_t)((0x01 << 4) | (0x03 << 29)))
#define APBPeriph_I2C1_CLOCK ((uint32_t)((0x01 << 2) | (0x03 << 29)))
#define APBPeriph_I2C0_CLOCK ((uint32_t)((0x01 << 0) | (0x03 << 29)))
/** \} */
#define IS_APB_PERIPH_CLOCK(CLOCK) (((CLOCK) == APBPeriph_GPIO_CLOCK) || ((CLOCK) == APBPeriph_GDMA_CLOCK)\
|| ((CLOCK) == APBPeriph_TIMER_CLOCK) || ((CLOCK) == APBPeriph_IR_CLOCK)\
|| ((CLOCK) == APBPeriph_SPI1_CLOCK) || ((CLOCK) == APBPeriph_SPI0_CLOCK)\
|| ((CLOCK) == APBPeriph_UART0_CLOCK) || ((CLOCK) == APBPeriph_ADC_CLOCK)\
|| ((CLOCK) == APBPeriph_SPI2W_CLOCK) || ((CLOCK) == APBPeriph_KEYSCAN_CLOCK)\
|| ((CLOCK) == APBPeriph_QDEC_CLOCK) || ((CLOCK) == APBPeriph_I2C1_CLOCK)\
|| ((CLOCK) == APBPeriph_I2C0_CLOCK) || ((CLOCK) == APBPeriph_CODEC_CLOCK)\
|| ((CLOCK) == APBPeriph_UART1_CLOCK) || ((CLOCK) == APBPeriph_UART2_CLOCK)\
|| ((CLOCK) == APBPeriph_I2S0_CLOCK) || ((CLOCK) == APBPeriph_I2S1_CLOCK)\
|| ((CLOCK) == APBPeriph_IF8080_CLOCK) || ((CLOCK) == APBPeriph_ENHTIMER_CLOCK))
/**
* \defgroup APB_Peripheral_Define APB Peripheral Define
* \{
* \ingroup RCC_Exported_Constants
*/
#define APBPeriph_CTC ((uint32_t)((1 << 21) | (0x00 << 26)))
#define APBPeriph_TIMER ((uint32_t)((1 << 16) | (0x00 << 26)))
#define APBPeriph_ENHTIMER ((uint32_t)((1 << 16) | (0x00 << 26)))
#define APBPeriph_GDMA ((uint32_t)((1 << 13) | (0x00 << 26)))
#define APBPeriph_UART1 ((uint32_t)((1 << 12) | (0x00 << 26)))
#define APBPeriph_FLASH2 ((uint32_t)((1 << 5) | (0x00 << 26)))
#define APBPeriph_FLASH ((uint32_t)((1 << 4) | (0x00 << 26)))
#define APBPeriph_FLASH1 ((uint32_t)((1 << 3) | (0x00 << 26)))
#define APBPeriph_IF8080 ((uint32_t)((1 << 25) | (0x02 << 26)))
#define APBPeriph_SPI2W ((uint32_t)((1 << 24) | (0x02 << 26)))
#define APBPeriph_KEYSCAN ((uint32_t)((1 << 19) | (0x02 << 26)))
#define APBPeriph_QDEC ((uint32_t)((1 << 18) | (0x02 << 26)))
#define APBPeriph_I2C1 ((uint32_t)((1 << 17) | (0x02 << 26)))
#define APBPeriph_I2C0 ((uint32_t)((1 << 16) | (0x02 << 26)))
#define APBPeriph_IR ((uint32_t)((1 << 10) | (0x02 << 26)))
#define APBPeriph_SPI1 ((uint32_t)((1 << 9) | (0x02 << 26)))
#define APBPeriph_SPI0 ((uint32_t)((1 << 8) | (0x02 << 26)))
#define APBPeriph_UART0 ((uint32_t)((1 << 0) | (0x02 << 26)))
#define APBPeriph_UART2 ((uint32_t)((1 << 1) | (0x02 << 26)))
#define APBPeriph_GPIO ((uint32_t)((1 << 8) | (0x03 << 26)))
#define APBPeriph_ADC ((uint32_t)((1 << 0) | (0x03 << 26)))
#define APBPeriph_I2S1 ((uint32_t)((1 << 2) | (0x00 << 26)))
#define APBPeriph_I2S0 ((uint32_t)((1 << 1) | (0x00 << 26)))
#define APBPeriph_CODEC ((uint32_t)((1 << 0) | (0x00 << 26)))
/** \} */
#define IS_APB_PERIPH(PERIPH) (((PERIPH) == APBPeriph_TIMER) || ((PERIPH) == APBPeriph_GDMA)\
|| ((PERIPH) == APBPeriph_SPI2W) || ((PERIPH) == APBPeriph_KEYSCAN)\
|| ((PERIPH) == APBPeriph_QDEC) || ((PERIPH) == APBPeriph_I2C1)\
|| ((PERIPH) == APBPeriph_I2C0) || ((PERIPH) == APBPeriph_IR)\
|| ((PERIPH) == APBPeriph_SPI1) || ((PERIPH) == APBPeriph_SPI0)\
|| ((PERIPH) == APBPeriph_UART0) || ((PERIPH) == APBPeriph_GPIO)\
|| ((PERIPH) == APBPeriph_ADC) || ((PERIPH) == APBPeriph_CODEC)\
|| (PERIPH == APBPeriph_UART1) || (PERIPH == APBPeriph_UART2)\
|| ((PERIPH) == APBPeriph_I2S0) || ((PERIPH) == APBPeriph_I2S1)\
|| ((PERIPH) == APBPeriph_IF8080) || ((PERIPH) == APBPeriph_ENHTIMER))
/**
* \defgroup RCC_Peripheral_Clock RCC Peripheral Clock
* \{
* \ingroup RCC_Exported_Constants
*/
#define CLOCK_GATE_5M ((uint32_t)(0x01 << 29))/* 5M clock source for adc and keyscan */
#define CLOCK_GATE_20M ((uint32_t)(0x01 << 27))/* 20M clock source for 2wssi and qdec */
#define CLOCK_GATE_10M ((uint32_t)(0x01 << 28))/* 10M clock source for bluewiz */
/** \} */
#define IS_CLOCK_GATE(CLOCK) (((CLOCK) == CLOCK_GATE_5M) || ((CLOCK) == CLOCK_GATE_20M)\
|| ((CLOCK) == CLOCK_GATE_10M))
/**
* \defgroup I2C_Clock_Divider I2C Clock Divider
* \{
* \ingroup RCC_Exported_Constants
*/
#define I2C_CLOCK_DIV_1 ((uint16_t)0x0)
#define I2C_CLOCK_DIV_2 ((uint16_t)0x1)
#define I2C_CLOCK_DIV_4 ((uint16_t)0x2)
#define I2C_CLOCK_DIV_8 ((uint16_t)0x3)
/** \} */
#define IS_I2C_DIV(DIV) (((DIV) == I2C_CLOCK_DIV_1) || \
((DIV) == I2C_CLOCK_DIV_2) || \
((DIV) == I2C_CLOCK_DIV_4) || \
((DIV) == I2C_CLOCK_DIV_8))
/**
* \defgroup SPI_Clock_Divider SPI Clock Divider
* \{
* \ingroup RCC_Exported_Constants
*/
#define SPI_CLOCK_DIV_1 ((uint16_t)0x0)
#define SPI_CLOCK_DIV_2 ((uint16_t)0x1)
#define SPI_CLOCK_DIV_4 ((uint16_t)0x2)
#define SPI_CLOCK_DIV_8 ((uint16_t)0x3)
/** \} */
#define IS_SPI_DIV(DIV) (((DIV) == SPI_CLOCK_DIV_1) || \
((DIV) == SPI_CLOCK_DIV_2) || \
((DIV) == SPI_CLOCK_DIV_4) || \
((DIV) == SPI_CLOCK_DIV_8))
/**
* \defgroup UART_Clock_Divider UART Clock Divider
* \{
* \ingroup RCC_Exported_Constants
*/
#define UART_CLOCK_DIV_1 ((uint16_t)0x0)
#define UART_CLOCK_DIV_2 ((uint16_t)0x1)
#define UART_CLOCK_DIV_4 ((uint16_t)0x2)
#define UART_CLOCK_DIV_16 ((uint16_t)0x3)
/** \} */
#define IS_UART_DIV(DIV) (((DIV) == UART_CLOCK_DIV_1) || \
((DIV) == UART_CLOCK_DIV_2) || \
((DIV) == UART_CLOCK_DIV_4) || \
((DIV) == UART_CLOCK_DIV_16))
/**
* \defgroup TIM_Clock_Divider TIM Clock Divider
* \{
* \ingroup RCC_Exported_Constants
*/
#define TIM_CLOCK_DIV_1 0x00
#define TIM_CLOCK_DIV_125 0x03
#define TIM_CLOCK_DIV_2 0x04
#define TIM_CLOCK_DIV_4 0x05
#define TIM_CLOCK_DIV_8 0x06
#define TIM_CLOCK_DIV_40 0x07
/** \} */
#define IS_TIM_DIV(DIV) (((DIV) == TIM_CLOCK_DIV_1) || \
((DIV) == TIM_CLOCK_DIV_125) || \
((DIV) == TIM_CLOCK_DIV_2) || \
((DIV) == TIM_CLOCK_DIV_4) || \
((DIV) == TIM_CLOCK_DIV_8) || \
((DIV) == TIM_CLOCK_DIV_40))
/**
* \defgroup TIM_Clock_Divider TIM Clock Divider
* \{
* \ingroup RCC_Exported_Constants
*/
typedef enum
{
TIM_CLK_2 = 2,
TIM_CLK_3,
TIM_CLK_4,
TIM_CLK_5,
TIMENH_CLK_0,
TIMENH_CLK_1,
} E_TIM_NUM;
#define TIM0_CLK 0x00
#define TIM_CLOCK_DIV_125 0x03
#define TIM_CLOCK_DIV_2 0x04
#define TIM_CLOCK_DIV_4 0x05
#define TIM_CLOCK_DIV_8 0x06
#define TIM_CLOCK_DIV_40 0x07
/** \} */
#define IS_TIM_DIV(DIV) (((DIV) == TIM_CLOCK_DIV_1) || \
((DIV) == TIM_CLOCK_DIV_125) || \
((DIV) == TIM_CLOCK_DIV_2) || \
((DIV) == TIM_CLOCK_DIV_4) || \
((DIV) == TIM_CLOCK_DIV_8) || \
((DIV) == TIM_CLOCK_DIV_40))
/*============================================================================*
* Functions
*============================================================================*/
/**
* \defgroup RCC_Exported_Functions Peripheral APIs
* \ingroup RCC
* \{
*/
/**
* \brief Enables or disables the APB peripheral clock.
* \param APBPeriph: Specifies the APB peripheral to gates its clock.
* This parameter can be one of the following values:
* \arg APBPeriph_ADC
* \arg APBPeriph_CODEC
* \arg APBPeriph_GDMA
* \arg APBPeriph_GPIO
* \arg APBPeriph_I2C1
* \arg APBPeriph_I2C0
* \arg APBPeriph_I2S0
* \arg APBPeriph_I2S1
* \arg APBPeriph_IF8080
* \arg APBPeriph_IR
* \arg APBPeriph_KEYSCAN
* \arg APBPeriph_QDEC
* \arg APBPeriph_SPI2W
* \arg APBPeriph_SPI1
* \arg APBPeriph_SPI0
* \arg APBPeriph_TIMER
* \arg APBPeriph_UART0
* \arg APBPeriph_UART1
* \arg APBPeriph_UART2
* \param APBPeriph_Clock: Specifies the APB peripheral clock config.
* This parameter can be one of the following values(must be the same with APBPeriph):
* \arg APBPeriph_ADC_CLOCK
* \arg APBPeriph_CODEC_CLOCK
* \arg APBPeriph_GDMA_CLOCK
* \arg APBPeriph_GPIO_CLOCK
* \arg APBPeriph_I2C1_CLOCK
* \arg APBPeriph_I2C0_CLOCK
* \arg APBPeriph_I2S0_CLOCK
* \arg APBPeriph_I2S1_CLOCK
* \arg APBPeriph_IR_CLOCK
* \arg APBPeriph_KEYSCAN_CLOCK
* \arg APBPeriph_QDEC_CLOCK
* \arg APBPeriph_SPI1_CLOCK
* \arg APBPeriph_SPI0_CLOCK
* \arg APBPeriph_SPI2W_CLOCK
* \arg APBPeriph_TIMER_CLOCK
* \arg APBPeriph_UART0_CLOCK
* \arg APBPeriph_UART1_CLOCK
* \arg APBPeriph_UART2_CLOCK
* \param NewState: New state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* \retval None.
*/
void RCC_PeriphClockCmd(uint32_t APBPeriph, uint32_t APBPeriph_Clock,
FunctionalState NewState);
/**
* \brief I2C clock divider config.
* \param I2Cx: Where x can be 0 or 1 to select the I2C peripheral.
* \param ClockDiv: Specifies the APB peripheral to gates its clock.
* This parameter can be one of the following values:
* \arg I2C_CLOCK_DIV_1
* \arg I2C_CLOCK_DIV_2
* \arg I2C_CLOCK_DIV_4
* \arg I2C_CLOCK_DIV_8
* \retval None.
*/
void RCC_I2CClkDivConfig(I2C_TypeDef *I2Cx, uint16_t ClockDiv);
/**
* \brief SPI clock divider config.
* \param SPIx: Where x can be 0 or 1 to select the SPI peripheral.
* \param ClockDiv: Specifies the APB peripheral to gates its clock.
* This parameter can be one of the following values:
* \arg SPI_CLOCK_DIV_1
* \arg SPI_CLOCK_DIV_2
* \arg SPI_CLOCK_DIV_4
* \arg SPI_CLOCK_DIV_8
* \retval None.
*/
void RCC_SPIClkDivConfig(SPI_TypeDef *SPIx, uint16_t ClockDiv);
/**
* @brief TIMER & ENH-TIMER clock divider config.
* @param TIMx: selected TIM number.
* @param ClockDiv: specifies the APB peripheral to gates its clock.
* This parameter can be one of the following values:
* @arg TIM_CLOCK_DIV_1
* @arg TIM_CLOCK_DIV_125
* @arg TIM_CLOCK_DIV_2
* @arg TIM_CLOCK_DIV_4
* @arg TIM_CLOCK_DIV_8
* @arg TIM_CLOCK_DIV_40
* @retval None
*/
void RCC_TIMClkDivConfig(E_TIM_NUM TIMx, uint16_t ClockDiv);
/**
* \brief UART clock divider config.
* \param UARTx: Selected UART peripheral.
* \param ClockDiv: Specifies the APB peripheral to gates its clock.
* This parameter can be one of the following values:
* \arg UART_CLOCK_DIV_1
* \arg UART_CLOCK_DIV_2
* \arg UART_CLOCK_DIV_4
* \arg UART_CLOCK_DIV_16
* \retval None.
*/
void RCC_UARTClkDivConfig(UART_TypeDef *UARTx, uint16_t ClockDiv);
/**
* \brief Enables or disables the APB peripheral function.
* \param APBPeriph: Specifies the APB peripheral .
* This parameter can be one of the following values:
* \arg APBPeriph_ADC
* \arg APBPeriph_CODEC
* \arg APBPeriph_GDMA
* \arg APBPeriph_GPIO
* \arg APBPeriph_I2C1
* \arg APBPeriph_I2C0
* \arg APBPeriph_I2S0
* \arg APBPeriph_I2S1
* \arg APBPeriph_IF8080
* \arg APBPeriph_IR
* \arg APBPeriph_KEYSCAN
* \arg APBPeriph_QDEC
* \arg APBPeriph_SPI2W
* \arg APBPeriph_SPI1
* \arg APBPeriph_SPI0
* \arg APBPeriph_TIMER
* \arg APBPeriph_UART0
* \arg APBPeriph_UART1
* \arg APBPeriph_UART2
* \param NewState: New state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* \retval None.
*/
void RCC_PeriFunctionConfig(uint32_t APBPeriph, FunctionalState NewState);
/**
* \brief Enables or disables the APB peripheral clock.
* \param APBPeriph_Clock: Specifies the APB peripheral clock config.
* This parameter can be one of the following values(must be the same with APBPeriph):
* \arg APBPeriph_ADC_CLOCK
* \arg APBPeriph_CODEC_CLOCK
* \arg APBPeriph_GDMA_CLOCK
* \arg APBPeriph_GPIO_CLOCK
* \arg APBPeriph_I2C1_CLOCK
* \arg APBPeriph_I2C0_CLOCK
* \arg APBPeriph_I2S0_CLOCK
* \arg APBPeriph_I2S1_CLOCK
* \arg APBPeriph_IR_CLOCK
* \arg APBPeriph_KEYSCAN_CLOCK
* \arg APBPeriph_QDEC_CLOCK
* \arg APBPeriph_SPI1_CLOCK
* \arg APBPeriph_SPI0_CLOCK
* \arg APBPeriph_SPI2W_CLOCK
* \arg APBPeriph_TIMER_CLOCK
* \arg APBPeriph_UART0_CLOCK
* \arg APBPeriph_UART1_CLOCK
* \arg APBPeriph_UART2_CLOCK
* \param NewState: New state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* \retval None.
*/
void RCC_PeriClockConfig(uint32_t APBPeriph_Clock, FunctionalState NewState);
/**
* \brief Enable clock 5M source.
* \param None.
* \return None.
*/
__STATIC_INLINE void RCC_ClockSrc5MCmd(void)
{
/*Open 5M clock source*/
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT26;
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT29;
}
/**
* \brief Enable clock 10M source.
* \param None.
* \return None.
*/
__STATIC_INLINE void RCC_ClockSrc10MCmd(void)
{
/*Open 10M clock source*/
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT26;
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT28;
}
/**
* \brief Enable clock 20M source.
* \param None.
* \return None.
*/
__STATIC_INLINE void RCC_ClockSrc20MCmd(void)
{
/*Open 20M clock source*/
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT26;
SYSBLKCTRL->u_20C.PERION_REG_SYS_CLK_SEL_2 |= BIT27;
}
/** \} */ /* End of group RCC_Exported_Functions */
#ifdef __cplusplus
}
#endif
#endif /* _RTL876X_RCC_H_ */
/******************* (C) COPYRIGHT 2015 Realtek Semiconductor *****END OF FILE****/