blob: caec656c69420850463436e5d1a50127b9dc7d40 [file] [log] [blame]
/*
* Copyright 2018 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _FSL_CLOCK_H_
#define _FSL_CLOCK_H_
#include "fsl_device_registers.h"
#include "fsl_common.h"
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include <stddef.h>
/*! @addtogroup clock */
/*! @{ */
/*! @file */
/*! @name Driver version */
/*@{*/
/*! @brief CLOCK driver version 2.1.0. */
#define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 1, 0))
/*@}*/
#ifdef FPGA_50MHZ
#define SYSCON_BASE_CLOCK_DIV (6)
#define SYSCON_BASE_CLOCK_MUL (5)
#define SYS_FREQ(A) ((A * SYSCON_BASE_CLOCK_MUL) / SYSCON_BASE_CLOCK_DIV)
#else
#define SYS_FREQ(A) (A)
#endif
/* Definition for delay API in clock driver, users can redefine it to the real application. */
#ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY
#define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (48000000UL)
#endif
/*! @brief Clock ip name array for FLEXCOMM. */
#define FLEXCOMM_CLOCKS \
{ \
kCLOCK_Usart0, kCLOCK_Usart1, kCLOCK_I2c0, kCLOCK_I2c1, kCLOCK_Spi0, kCLOCK_Spi1, kCLOCK_I2c2 \
}
/*! @brief Clock ip name array for CTIMER. */
#define CTIMER_CLOCKS \
{ \
kCLOCK_Timer0, kCLOCK_Timer1 \
}
/*! @brief Clock ip name array for GINT. */
#define GINT_CLOCKS \
{ \
kCLOCK_Gint \
}
/*! @brief Clock ip name array for WWDT. */
#define WWDT_CLOCKS \
{ \
kCLOCK_WdtOsc \
}
/*! @brief Clock ip name array for DMIC. */
#define DMIC_CLOCKS \
{ \
kCLOCK_DMic \
}
/*! @brief Clock ip name array for ADC. */
#define ADC_CLOCKS \
{ \
kCLOCK_Adc0 \
}
/*! @brief Clock ip name array for SPIFI. */
#define SPIFI_CLOCKS \
{ \
kCLOCK_Spifi \
}
/*! @brief Clock ip name array for GPIO. */
#define GPIO_CLOCKS \
{ \
kCLOCK_Gpio0 \
}
/*! @brief Clock ip name array for DMA. */
#define DMA_CLOCKS \
{ \
kCLOCK_Dma \
}
/* Test line to verify RCS */
/* Another test line to verify source control */
/* Test lines added by Robert Gee */
/**
* @brief Clock sources for main system clock.
*/
typedef enum
{
SYSCON_MAINCLKSRC_FRO12M, /*!< FRO 12MHz */
SYSCON_MAINCLKSRC_OSC32K, /*!< OSC 32kHz */
SYSCON_MAINCLKSRC_XTAL32M, /*!< XTAL 32MHz */
SYSCON_MAINCLKSRC_FRO32M, /*!< FRO 32MHz */
SYSCON_MAINCLKSRC_FRO48M, /*!< FRO 48MHz */
SYSCON_MAINCLKSRC_EXT, /*!< External clock */
SYSCON_MAINCLKSRC_FRO1M, /*!< FRO 1MHz */
} CHIP_SYSCON_MAINCLKSRC_T;
/**
* @brief Fractional Divider clock sources
*/
typedef enum
{
SYSCON_FRGCLKSRC_MAINCLK, /*!< Main Clock */
SYSCON_FRGCLKSRC_OSC32M, /*!< 32MHz Clock (XTAL or FRO) */
SYSCON_FRGCLKSRC_FRO48MHZ, /*!< FRO 48-MHz */
SYSCON_FRGCLKSRC_NONE, /*!< FRO 48-MHz */
} CHIP_SYSCON_FRGCLKSRC_T;
/*------------------------------------------------------------------------------
clock_ip_name_t definition:
------------------------------------------------------------------------------*/
#define CLK_GATE_REG_OFFSET_SHIFT 8U
#define CLK_GATE_REG_OFFSET_MASK 0xFFFFFF00U
#define CLK_GATE_BIT_SHIFT_SHIFT 0U
#define CLK_GATE_BIT_SHIFT_MASK 0x000000FFU
#define CLK_GATE_DEFINE(reg_offset, bit_shift) \
((((reg_offset) << CLK_GATE_REG_OFFSET_SHIFT) & CLK_GATE_REG_OFFSET_MASK) | \
(((bit_shift) << CLK_GATE_BIT_SHIFT_SHIFT) & CLK_GATE_BIT_SHIFT_MASK))
#define CLK_GATE_ABSTRACT_REG_OFFSET(x) (((uint32_t)(x)&CLK_GATE_REG_OFFSET_MASK) >> CLK_GATE_REG_OFFSET_SHIFT)
#define CLK_GATE_ABSTRACT_BITS_SHIFT(x) (((uint32_t)(x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT)
#define AHB_CLK_CTRL0 0
#define AHB_CLK_CTRL1 1
#define ASYNC_CLK_CTRL0 2
/**
* @brief Clock name definition
*/
typedef enum _clock_name
{
kCLOCK_Sram0 = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_SRAM_CTRL0_SHIFT), /*!< SRAM0 clock */
kCLOCK_Sram1 = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_SRAM_CTRL1_SHIFT), /*!< SRAM1 clock */
kCLOCK_Spifi = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_SPIFI_SHIFT), /*!< SPIFI clock */
kCLOCK_InputMux = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_MUX_SHIFT), /*!< InputMux clock */
kCLOCK_Iocon = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_IOCON_SHIFT), /*!< IOCON clock */
kCLOCK_Gpio0 = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_GPIO_SHIFT), /*!< GPIO0 clock */
kCLOCK_Pint = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_PINT_SHIFT), /*!< PINT clock */
kCLOCK_Gint = CLK_GATE_DEFINE(
AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_GINT_SHIFT), /* GPIO_GLOBALINT0 and GPIO_GLOBALINT1 share the same slot */
kCLOCK_Dma = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_DMA_SHIFT), /*!< DMA clock */
kCLOCK_Iso7816 = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_ISO7816_SHIFT), /*!< ISO7816 clock */
kCLOCK_WdtOsc = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_WWDT_SHIFT), /*!< WDTOSC clock */
kCLOCK_Rtc = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_RTC_SHIFT), /*!< RTC clock */
kCLOCK_AnaInt = CLK_GATE_DEFINE(
AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_ANA_INT_CTRL_SHIFT), /*!< Analog Interrupt Control module clock */
kCLOCK_WakeTmr =
CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_WAKE_UP_TIMERS_SHIFT), /*!< Wake up Timers clock */
kCLOCK_Adc0 = CLK_GATE_DEFINE(AHB_CLK_CTRL0, SYSCON_AHBCLKCTRL0_ADC_SHIFT), /*!< ADC0 clock */
kCLOCK_FlexComm0 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_USART0_SHIFT), /*!< FlexComm0 clock */
kCLOCK_FlexComm1 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_USART1_SHIFT), /*!< FlexComm1 clock */
kCLOCK_FlexComm2 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C0_SHIFT), /*!< FlexComm2 clock */
kCLOCK_FlexComm3 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C1_SHIFT), /*!< FlexComm3 clock */
kCLOCK_FlexComm4 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_SPI0_SHIFT), /*!< FlexComm4 clock */
kCLOCK_FlexComm5 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_SPI1_SHIFT), /*!< FlexComm5 clock */
kCLOCK_Ir = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_IR_SHIFT), /*!< Infra Red clock */
kCLOCK_Pwm = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_PWM_SHIFT), /*!< PWM clock */
kCLOCK_Rng = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_RNG_SHIFT), /*!< RNG clock */
kCLOCK_FlexComm6 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C2_SHIFT), /*!< FlexComm6 clock */
kCLOCK_Usart0 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_USART0_SHIFT), /*!< USART0 clock */
kCLOCK_Usart1 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_USART1_SHIFT), /*!< USART1 clock */
kCLOCK_I2c0 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C0_SHIFT), /*!< I2C0 clock */
kCLOCK_I2c1 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C1_SHIFT), /*!< I2C1 clock */
kCLOCK_Spi0 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_SPI0_SHIFT), /*!< SPI0 clock */
kCLOCK_Spi1 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_SPI1_SHIFT), /*!< SPI1 clock */
kCLOCK_I2c2 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_I2C2_SHIFT), /*!< I2C2 clock */
kCLOCK_Modem = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_MODEM_MASTER_SHIFT), /*!< MODEM clock */
kCLOCK_Aes = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_AES_SHIFT), /*!< AES clock */
kCLOCK_Rfp = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_RFP_SHIFT), /*!< RFP clock */
kCLOCK_DMic = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_DMIC_SHIFT), /*!< DMIC clock */
kCLOCK_Sha0 = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_HASH_SHIFT), /*!< SHA0 clock */
kCLOCK_Timer0 = CLK_GATE_DEFINE(ASYNC_CLK_CTRL0, 1), /*!< Timer0 clock */
kCLOCK_Timer1 = CLK_GATE_DEFINE(ASYNC_CLK_CTRL0, 2), /*!< Timer1 clock */
kCLOCK_MainClk = (1 << 16), /*!< MAIN_CLK */
kCLOCK_CoreSysClk, /*!< Core/system clock */
kCLOCK_BusClk, /*!< AHB bus clock */
kCLOCK_Xtal32k, /*!< 32kHz crystal oscillator */
kCLOCK_Xtal32M, /*!< 32MHz crystal oscillator */
kCLOCK_Fro32k, /*!< 32kHz free running oscillator */
kCLOCK_Fro1M, /*!< 1MHz Free Running Oscillator */
kCLOCK_Fro12M, /*!< 12MHz Free Running Oscillator */
kCLOCK_Fro32M, /*!< 32MHz Free Running Oscillator */
kCLOCK_Fro48M, /*!< 48MHz Free Running Oscillator */
kCLOCK_Fro64M, /*!< 64Mhz Free Running Oscillator */
kCLOCK_ExtClk, /*!< External clock */
kCLOCK_WdtClk, /*!< Watchdog clock */
kCLOCK_Frg, /*!< Fractional divider */
kCLOCK_ClkOut, /*!< Clock out */
kCLOCK_Fmeas, /*!< FMEAS clock */
kCLOCK_Sha = CLK_GATE_DEFINE(AHB_CLK_CTRL1, SYSCON_AHBCLKCTRL1_HASH_SHIFT), /*!< Hash clock */
} clock_name_t;
typedef clock_name_t clock_ip_name_t;
#define REG_OFST(block, member) (offsetof(block##_Type, member) / sizeof(uint32_t))
#define MUX_A(m, choice) (((m) << 0) | ((choice + 1) << 12))
/*! @brief Clock source selector definition */
typedef enum
{
CM_MAINCLKSEL = REG_OFST(SYSCON, MAINCLKSEL), /*!< Clock source selector of Main clock source */
CM_OSC32CLKSEL = REG_OFST(SYSCON, OSC32CLKSEL), /*!< Clock source selector of OSC32KCLK and OSC32MCLK */
CM_CLKOUTCLKSEL = REG_OFST(SYSCON, CLKOUTSEL), /*!< Clock source selector of CLKOUT */
CM_SPIFICLKSEL = REG_OFST(SYSCON, SPIFICLKSEL), /*!< Clock source selector of SPIFI */
CM_ADCCLKSEL = REG_OFST(SYSCON, ADCCLKSEL), /*!< Clock source selector of ADC */
CM_USARTCLKSEL = REG_OFST(SYSCON, USARTCLKSEL), /*!< Clock source selector of USART0 & 1 */
CM_I2CCLKSEL = REG_OFST(SYSCON, I2CCLKSEL), /*!< Clock source selector of I2C0, 1 and 2 */
CM_SPICLKSEL = REG_OFST(SYSCON, SPICLKSEL), /*!< Clock source selector of SPI0 & 1 */
CM_IRCLKSEL = REG_OFST(SYSCON, IRCLKSEL), /*!< Clock source selector of Infra Red */
CM_PWMCLKSEL = REG_OFST(SYSCON, PWMCLKSEL), /*!< Clock source selector of PWM */
CM_WDTCLKSEL = REG_OFST(SYSCON, WDTCLKSEL), /*!< Clock source selector of Watchdog Timer */
CM_MODEMCLKSEL = REG_OFST(SYSCON, MODEMCLKSEL), /*!< Clock source selector of Modem */
CM_FRGCLKSEL = REG_OFST(SYSCON, FRGCLKSEL), /*!< Clock source selector of Fractional Rate Generator (FRG) */
CM_DMICLKSEL = REG_OFST(SYSCON, DMICCLKSEL), /*!< Clock source selector of Digital microphone (DMIC) */
CM_WKTCLKSEL = REG_OFST(SYSCON, WKTCLKSEL), /*!< Clock source selector of Wake-up Timer */
CM_ASYNCAPB
} clock_sel_ofst_t;
/*! @brief Clock attach definition */
typedef enum _clock_attach_id
{
kFRO12M_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 0), /*!< Select FRO 12M for main clock */
kOSC32K_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 1), /*!< Select OSC 32K for main clock */
kXTAL32M_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 2), /*!< Select XTAL 32M for main clock */
kFRO32M_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 3), /*!< Select FRO 32M for main clock */
kFRO48M_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 4), /*!< Select FRO 48M for main clock */
kEXT_CLK_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 5), /*!< Select external clock for main clock */
kFROM1M_to_MAIN_CLK = MUX_A(CM_MAINCLKSEL, 6), /*!< Select FRO 1M for main clock */
kFRO32M_to_OSC32M_CLK = MUX_A(CM_OSC32CLKSEL, 0), /*!< Select FRO 32M for OSC32KCLK and OSC32MCLK */
kXTAL32M_to_OSC32M_CLK = MUX_A(CM_OSC32CLKSEL, 1), /*!< Select XTAL 32M for OSC32KCLK and OSC32MCLK */
kFRO32K_to_OSC32K_CLK = MUX_A(CM_OSC32CLKSEL, 2), /*!< Select FRO 32K for OSC32KCLK and OSC32MCLK */
kXTAL32K_to_OSC32K_CLK = MUX_A(CM_OSC32CLKSEL, 3), /*!< Select XTAL 32K for OSC32KCLK and OSC32MCLK */
kMAIN_CLK_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 0), /*!< Select main clock for CLKOUT */
kXTAL32K_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 1), /*!< Select XTAL 32K for CLKOUT */
kFRO32K_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 2), /*!< Select FRO 32K for CLKOUT */
kXTAL32M_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 3), /*!< Select XTAL 32M for CLKOUT */
kDCDC_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 4), /*!< Select DCDC for CLKOUT */
kFRO48M_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 5), /*!< Select FRO 48M for CLKOUT */
kFRO1M_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 6), /*!< Select FRO 1M for CLKOUT */
kNONE_to_CLKOUT = MUX_A(CM_CLKOUTCLKSEL, 7), /*!< No clock for CLKOUT */
kMAIN_CLK_to_SPIFI = MUX_A(CM_SPIFICLKSEL, 0), /*!< Select main clock for SPIFI */
kXTAL32M_to_SPIFI = MUX_A(CM_SPIFICLKSEL, 1), /*!< Select XTAL 32M for SPIFI */
kFRO64M_to_SPIFI = MUX_A(CM_SPIFICLKSEL, 2), /*!< Select FRO 64M for SPIFI */
kFRO48M_to_SPIFI = MUX_A(CM_SPIFICLKSEL, 3), /*!< Select FRO 48M for SPIFI */
kXTAL32M_to_ADC_CLK = MUX_A(CM_ADCCLKSEL, 0), /*!< Select XTAL 32M for ADC */
kFRO12M_to_ADC_CLK = MUX_A(CM_ADCCLKSEL, 1), /*!< Select FRO 12M for ADC */
kNONE_to_ADC_CLK = MUX_A(CM_ADCCLKSEL, 2), /*!< No clock for ADC */
kOSC32M_to_USART_CLK = MUX_A(CM_USARTCLKSEL, 0), /*!< Select OSC 32M for USART0 & 1 */
kFRO48M_to_USART_CLK = MUX_A(CM_USARTCLKSEL, 1), /*!< Select FRO 48M for USART0 & 1 */
kFRG_CLK_to_USART_CLK = MUX_A(CM_USARTCLKSEL, 2), /*!< Select FRG clock for USART0 & 1 */
kNONE_to_USART_CLK = MUX_A(CM_USARTCLKSEL, 3), /*!< No clock for USART0 & 1 */
kOSC32M_to_I2C_CLK = MUX_A(CM_I2CCLKSEL, 0), /*!< Select OSC 32M for I2C0, 1 and 2 */
kFRO48M_to_I2C_CLK = MUX_A(CM_I2CCLKSEL, 1), /*!< Select FRO 48M for I2C0, 1 and 2 */
kNONE_to_I2C_CLK = MUX_A(CM_I2CCLKSEL, 2), /*!< No clock for I2C0, 1 and 2 */
kOSC32M_to_SPI_CLK = MUX_A(CM_SPICLKSEL, 0), /*!< Select OSC 32M for SPI0 & 1 */
kFRO48M_to_SPI_CLK = MUX_A(CM_SPICLKSEL, 1), /*!< Select FRO 48M for SPI0 & 1 */
kNONE_to_SPI_CLK = MUX_A(CM_SPICLKSEL, 2), /*!< No clock for SPI0 & 1 */
kOSC32M_to_IR_CLK = MUX_A(CM_IRCLKSEL, 0), /*!< Select OSC 32M for Infra Red */
kFRO48M_to_IR_CLK = MUX_A(CM_IRCLKSEL, 1), /*!< Select FRO 48M for Infra Red */
kNONE_to_IR_CLK = MUX_A(CM_IRCLKSEL, 2), /*!< No clock for Infra Red */
kOSC32M_to_PWM_CLK = MUX_A(CM_PWMCLKSEL, 0), /*!< Select OSC 32M for PWM */
kFRO48M_to_PWM_CLK = MUX_A(CM_PWMCLKSEL, 1), /*!< Select FRO 48M for PWM */
kNONE_to_PWM_CLK = MUX_A(CM_PWMCLKSEL, 2), /*!< No clock for PWM */
kOSC32M_to_WDT_CLK = MUX_A(CM_WDTCLKSEL, 0), /*!< Select OSC 32M for Watchdog Timer */
kOSC32K_to_WDT_CLK = MUX_A(CM_WDTCLKSEL, 1), /*!< Select FRO 32K for Watchdog Timer */
kFRO1M_to_WDT_CLK = MUX_A(CM_WDTCLKSEL, 2), /*!< Select FRO 1M for Watchdog Timer */
kMAIN_CLK_to_FRG_CLK = MUX_A(CM_FRGCLKSEL, 0), /*!< Select main clock for FRG */
kOSC32M_to_FRG_CLK = MUX_A(CM_FRGCLKSEL, 1), /*!< Select OSC 32M for FRG */
kFRO48M_to_FRG_CLK = MUX_A(CM_FRGCLKSEL, 2), /*!< Select FRO 48M for FRG */
kNONE_to_FRG_CLK = MUX_A(CM_FRGCLKSEL, 3), /*!< No clock for FRG */
kMAIN_CLK_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 0), /*!< Select main clock for DMIC */
kOSC32K_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 1), /*!< Select OSC 32K for DMIC */
kFRO48M_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 2), /*!< Select FRO 48M for DMIC */
kMCLK_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 3), /*!< Select external clock for DMIC */
kFRO1M_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 4), /*!< Select FRO 1M for DMIC */
kFRO12M_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 5), /*!< Select FRO 12M for DMIC */
kNONE_to_DMI_CLK = MUX_A(CM_DMICLKSEL, 6), /*!< No clock for DMIC */
kOSC32K_to_WKT_CLK = MUX_A(CM_WKTCLKSEL, 0), /*!< Select OSC 32K for WKT */
kNONE_to_WKT_CLK = MUX_A(CM_WKTCLKSEL, 3), /*!< No clock for WKT */
kXTAL32M_DIV2_to_ZIGBEE_CLK = MUX_A(CM_MODEMCLKSEL, 0), /*!< Select XTAL 32M for ZIGBEE */
kNONE_to_ZIGBEE_CLK = MUX_A(CM_MODEMCLKSEL, 1), /*!< No clock for ZIGBEE */
kMAIN_CLK_to_ASYNC_APB = MUX_A(CM_ASYNCAPB, 0), /*!< Select main clock for Asynchronous APB */
kXTAL32M_to_ASYNC_APB = MUX_A(CM_ASYNCAPB, 1), /*!< Select XTAL 32M for Asynchronous APB */
kFRO32M_to_ASYNC_APB = MUX_A(CM_ASYNCAPB, 2), /*!< Select FRO 32M for Asynchronous APB */
kFRO48M_to_ASYNC_APB = MUX_A(CM_ASYNCAPB, 3), /*!< Select FRO 48M for Asynchronous APB */
kNONE_to_NONE = 0x80000000U,
} clock_attach_id_t;
/* Clock dividers */
#define FIRST_DIV_MEMBER SYSTICKCLKDIV
#define CLOCK_DIV_OFST(member) offsetof(SYSCON_Type, member)
/*! @brief Clock divider definition */
typedef enum _clock_div_name
{
kCLOCK_DivNone = 0,
kCLOCK_DivSystickClk = (offsetof(SYSCON_Type, SYSTICKCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivWdtClk = (offsetof(SYSCON_Type, WDTCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivIrClk = (offsetof(SYSCON_Type, IRCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivAhbClk = (offsetof(SYSCON_Type, AHBCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivClkout = (offsetof(SYSCON_Type, CLKOUTDIV) / sizeof(uint32_t)),
kCLOCK_DivSpifiClk = (offsetof(SYSCON_Type, SPIFICLKDIV) / sizeof(uint32_t)),
kCLOCK_DivAdcClk = (offsetof(SYSCON_Type, ADCCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivRtcClk = (offsetof(SYSCON_Type, RTCCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivDmicClk = (offsetof(SYSCON_Type, DMICCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivRtc1HzClk = (offsetof(SYSCON_Type, RTC1HZCLKDIV) / sizeof(uint32_t)),
kCLOCK_DivTraceClk = (offsetof(SYSCON_Type, TRACECLKDIV) / sizeof(uint32_t)),
kCLOCK_DivFrg = (offsetof(SYSCON_Type, FRGCTRL) / sizeof(uint32_t))
} clock_div_name_t;
/*! @brief Clock source selections for the Main Clock */
typedef enum _main_clock_src
{
kCLOCK_MainFro12M = 0, /*!< FRO 12M for main clock */
kCLOCK_MainOsc32k = 1, /*!< OSC 32K for main clock */
kCLOCK_MainXtal32M = 2, /*!< XTAL 32M for main clock */
kCLOCK_MainFro32M = 3, /*!< FRO 32M for main clock */
kCLOCK_MainFro48M = 4, /*!< FRO 48M for main clock */
kCLOCK_MainExtClk = 5, /*!< External clock for main clock */
kCLOCK_MainFro1M = 6, /*!< FRO 1M for main clock */
} main_clock_src_t;
/*! @brief Clock source selections for CLKOUT */
typedef enum _clkout_clock_src
{
kCLOCK_ClkoutMainClk = 0, /*!< CPU & System Bus clock for CLKOUT */
kCLOCK_ClkoutXtal32k = 1, /*!< XTAL 32K for CLKOUT */
kCLOCK_ClkoutFro32k = 2, /*!< FRO 32K for CLKOUT */
kCLOCK_ClkoutXtal32M = 3, /*!< XTAL 32M for CLKOUT */
kCLOCK_ClkoutDcDcTest = 4, /*!< DCDC Test for CLKOUT */
kCLOCK_ClkoutFro48M = 5, /*!< FRO 48M for CLKOUT */
kCLOCK_ClkoutFro1M = 6, /*!< FRO 1M for CLKOUT */
kCLOCK_ClkoutNoClock = 7 /*!< No clock for CLKOUT */
} clkout_clock_src_t;
/*! @brief Clock source definition for Watchdog timer */
typedef enum _wdt_clock_src
{
kCLOCK_WdtOsc32MClk = 0, /*!< OSC 32M for WDT */
kCLOCK_WdtOsc32kClk = 1, /*!< OSC 32K for WDT */
kCLOCK_WdtFro1M = 2, /*!< FRO 1M for WDT */
kCLOCK_WdtNoClock = 3 /*!< No clock for WDT */
} wdt_clock_src_t;
/*! @brief Clock source definition for fractional divider */
typedef enum _frg_clock_src
{
kCLOCK_FrgMainClk = 0, /*!< CPU & System Bus clock for FRG */
kCLOCK_FrgOsc32MClk = 1, /*!< OSC 32M clock for FRG */
kCLOCK_FrgFro48M = 2, /*!< FRO 48M for FRG */
kCLOCK_FrgNoClock = 3 /*!< No clock for FRG */
} frg_clock_src_t;
/*! @brief Clock source definition for the APB */
typedef enum _apb_clock_src
{
kCLOCK_ApbMainClk = 0, /*!< CPU & System Bus clock for APB bridge */
kCLOCK_ApbXtal32M = 1, /*!< XTAL 32M for APB bridge */
kCLOCK_ApbFro32M = 2, /*!< FRO 32M for APB bridge */
kCLOCK_ApbFro48M = 3 /*!< FRO 48M for APB bridge */
} apb_clock_src_t;
/*! @brief Clock source definition for frequency measure */
typedef enum _fmeas_clock_src
{
kCLOCK_fmeasClkIn = 0, /*!< Clock in for FMEAS */
kCLOCK_fmeasXtal32Mhz = 1, /*!< XTAL 32M for FMEAS */
kCLOCK_fmeasFRO1Mhz = 2, /*!< FRO 1M for FMEAS */
kCLOCK_fmeasXtal32kHz = 3, /*!< XTAL 32K for FMEAS */
kCLOCK_fmeasMainClock = 4, /*!< CPU & System Bus clock for FMEAS */
kCLOCK_fmeasGPIO_0_4 = 5, /*!< GPIO0_4 input for FMEAS */
kCLOCK_fmeasGPIO_0_20 = 6, /*!< GPIO0_20 input for FMEAS */
kCLOCK_fmeasGPIO_0_16 = 7, /*!< GPIO0_16 input for FMEAS */
kCLOCK_fmeasGPIO_0_15 = 8, /*!< GPIO0_15 input for FMEAS */
} fmeas_clock_src_t;
/*! @brief Clock source selection for SPIFI */
typedef enum _spifi_clock_src
{
kCLOCK_SpifiMainClk = 0, /*!< CPU & System Bus clock for SPIFI */
kCLOCK_SpifiXtal32M = 1, /*!< XTAL 32M for SPIFI */
kCLOCK_SpifiFro64M = 2, /*!< FRO 64M for SPIFI */
kCLOCK_SpifiFro48M = 3, /*!< FRO 48M for SPIFI */
kCLOCK_SpifiNoClock = 4 /*!< No clock for SPIFI */
} spifi_clock_src_t;
/*! @brief Clock definition for ADC */
typedef enum _adc_clock_src
{
kCLOCK_AdcXtal32M = 0, /*!< XTAL 32MHz for ADC */
kCLOCK_AdcFro12M = 1, /*!< FRO 12MHz for ADC */
kCLOCK_AdcNoClock = 2 /*!< No clock for ADC */
} adc_clock_src_t;
/*! @brief PWM Clock source selection values */
typedef enum _pwm_clock_source
{
kCLOCK_PWMOsc32Mclk = 0x0, /*!< 32MHz FRO or XTAL clock */
kCLOCK_PWMFro48Mclk = 0x1, /*!< FRO 48MHz clock */
kCLOCK_PWMNoClkSel = 0x2, /*!< No clock selected - Shutdown functional
PWM clock for power saving */
kCLOCK_PWMTestClk = 0x3, /*!< Test clock input - Shutdown functional
PWM clock for power saving */
} pwm_clock_source_t;
/*! @brief FRO clock selection values */
typedef enum
{
FRO12M_ENA = (1 << 0), /*!< FRO12M */
FRO32M_ENA = (1 << 1), /*!< FRO32M */
FRO48M_ENA = (1 << 2), /*!< FRO48M */
FRO64M_ENA = (1 << 3), /*!< FRO64M */
FRO96M_ENA = (1 << 4) /*!< FRO96M */
} Fro_ClkSel_t;
/*! @brief Board specific constant capacitance characteristics
* Should be supplied by board manufacturer for best performance.
* Capacitances are expressed in hundreds of pF
*/
typedef struct
{
uint32_t clk_XtalIecLoadpF_x100; /*< XTAL Load capacitance */
uint32_t clk_XtalPPcbParCappF_x100; /*< XTAL PCB +ve parasitic capacitance */
uint32_t clk_XtalNPcbParCappF_x100; /*< XTAL PCB -ve parasitic capacitance */
} ClockCapacitanceCompensation_t;
/*******************************************************************************
* API
******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
/**
* @brief Obtains frequency of specified clock
* @param clock_name_t specify clock to be read
* @return uint32_t frequency
* @note
*/
uint32_t CLOCK_GetFreq(clock_name_t clock);
/**
* @brief Selects clock source using <name>SEL register in syscon
* @param clock_attach_id_t specify clock mapping
* @return none
* @note
*/
void CLOCK_AttachClk(clock_attach_id_t connection);
/**
* @brief Selects clock divider using <name>DIV register in syscon
* @param clock_div_name_t specifies which DIV register we are accessing
* @param uint32_t specifies divisor
* @param bool true if a syscon clock reset should also be carried out
* @return none
* @note
*/
void CLOCK_SetClkDiv(clock_div_name_t div_name, uint32_t divided_by_value, bool reset);
/**
* @brief Enables specific AHB clock channel
* @param clock_ip_name_t specifies which peripheral clock we are controlling
* @return none
* @note clock_ip_name_t is a typedef clone of clock_name_t
*/
void CLOCK_EnableClock(clock_ip_name_t clk);
/**
* @brief Disables specific AHB clock channel
* @param clock_ip_name_t specifies which peripheral clock we are controlling
* @return none
* @note clock_ip_name_t is a typedef clone of clock_name_t
*/
void CLOCK_DisableClock(clock_ip_name_t clk);
/**
* @brief Check if clock is enabled
* @param clock_ip_name_t specifies which peripheral clock we are controlling
* @return bool
* @note clock_ip_name_t is a typedef clone of clock_name_t
*/
bool CLOCK_IsClockEnable(clock_ip_name_t clk);
/**
* @brief Obtains frequency of APB Bus clock
* @param none
* @return uint32_t frequency
* @note
*/
uint32_t CLOCK_GetApbCLkFreq(void);
void CLOCK_EnableAPBBridge(void);
void CLOCK_DisableAPBBridge(void);
/*! @brief Return Frequency of Spifi Clock
* @return Frequency of Spifi.
*/
uint32_t CLOCK_GetSpifiClkFreq(void);
/*! @brief Delay execution by busy waiting
* @param delayUs delay duration in micro seconds
* @return none
*/
void CLOCK_uDelay(uint32_t delayUs);
/**
* @brief Sets default trim values for 32MHz XTAL
* @param none
* @return none
* @note Has no effect if CLOCK_Xtal32M_Trim has been called
*/
void CLOCK_XtalBasicTrim(void);
/**
* @brief Sets board-specific trim values for 32MHz XTAL
* @param XO_32M_OSC_CAP_Delta_x1000 capacitance correction in fF (femtoFarad)
* @param capa_charac board 32M capacitance characteristics pointer
* @return none
* @note capa_charac must point to a struct set in board.c using
* CLOCK_32MfXtalIecLoadpF Load capacitance, pF
* CLOCK_32MfXtalPPcbParCappF PCB +ve parasitic capacitance, pF
* CLOCK_32MfXtalNPcbParCappF PCB -ve parasitic capacitance, pF
*/
void CLOCK_Xtal32M_Trim(int32_t XO_32M_OSC_CAP_Delta_x1000, const ClockCapacitanceCompensation_t *capa_charac);
/**
* @brief Sets board-specific trim values for 32kHz XTAL
* @param XO_32k_OSC_CAP_Delta_x1000 capacitance correction in fF
* @param capa_charac board 32k capacitance characteristics pointer
* @return none
* @note capa_charac must point to a struct set in board.c using
* CLOCK_32kfXtalIecLoadpF Load capacitance, pF
* CLOCK_32kfXtalPPcbParCappF PCB +ve parasitic capacitance, pF
* CLOCK_32kfXtalNPcbParCappF PCB -ve parasitic capacitance, pF
*/
void CLOCK_Xtal32k_Trim(int32_t XO_32k_OSC_CAP_Delta_x1000, const ClockCapacitanceCompensation_t *capa_charac);
/**
* @brief Enables and sets LDO for 32MHz XTAL
* @param none
* @return none
*/
void CLOCK_SetXtal32M_LDO(void);
/**
* @brief Waits for 32MHz XTAL to stabilise
* @param u32AdditionalWait_us Additional wait after hardware indicates that
* stability has been reached
* @return none
* @note Operates as a tight loop. Worst case would be ~600ms
*/
void CLOCK_Xtal32M_WaitUntilStable(uint32_t u32AdditionalWait_us);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/*! @} */
#endif /* _FSL_CLOCK_H_ */