Newer
Older
mbed-os / targets / TARGET_Samsung / TARGET_SIDK_S1SBP6A / device / s1sbp6a_cmu.h
@Heuisam Kwag Heuisam Kwag on 11 Aug 2020 14 KB introduce S1SBP6A
/****************************************************************************
 *
 * Copyright 2020 Samsung Electronics All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific
 * language governing permissions and limitations under the License.
 *
 ****************************************************************************/

#ifndef __S1SBP6A_CMU_H
#define __S1SBP6A_CMU_H

#define LSOSC_CLK_FREQ                                     (4096000)
#define HSOSC_CLK_FREQ                                     (LSOSC_CLK_FREQ * 6)
#define EXT_CLK_FREQ                                       (4096000)
#define CMU_PLL_AMP_GAIN                                   (25)

#define CMU_MCU_CLK_CTRL_OFFSET                            (0x0100)
#define CMU_MCU_CLK_GATE_OFFSET                            (0x0104)
#define CMU_PERI_CLK_CTRL_OFFSET                           (0x0110)
#define CMU_PERI_CLK_GATE_OFFSET                           (0x0114)
#define CMU_PERI_CLK_MUX_OFFSET                            (0x0118)
#define CMU_AFE_CLK_CTRL_OFFSET                            (0x0120)
#define CMU_HOSC_CTRL_OFFSET                               (0x060C)
#define CMU_WAIT_PERI_CLK_GATE_OFFSET                      (0x0918)

#define CMU_MCU_CLK_CTRL_SEL_MCU_SRC_SHIFT                 (0)
#define CMU_MCU_CLK_CTRL_AHBCLK_DIV_SHIFT                  (4)
#define CMU_MCU_CLK_CTRL_APBCLK_DIV_SHIFT                  (12)
#define CMU_MCU_CLK_CTRL_SRPCLK_DIV_SHIFT                  (20)

#define CMU_MCU_CLK_CTRL_SEL_MCU_SRC_MASK                  (0x03 << CMU_MCU_CLK_CTRL_SEL_MCU_SRC_SHIFT)
#define CMU_MCU_CLK_CTRL_AHBCLK_DIV_MASK                   (0xFF << CMU_MCU_CLK_CTRL_AHBCLK_DIV_SHIFT)
#define CMU_MCU_CLK_CTRL_APBCLK_DIV_MASK                   (0xFF << CMU_MCU_CLK_CTRL_APBCLK_DIV_SHIFT)
#define CMU_MCU_CLK_CTRL_SRPCLK_DIV_MASK                   (0xFF << CMU_MCU_CLK_CTRL_SRPCLK_DIV_SHIFT)

#define CMU_MCU_CLK_CTRL_SEL_MCU_SRC(c)                    ((c) << CMU_MCU_CLK_CTRL_SEL_MCU_SRC_SHIFT)
#define CMU_MCU_CLK_CTRL_AHBCLK_DIV(c)                     ((c) << CMU_MCU_CLK_CTRL_AHBCLK_DIV_SHIFT)
#define CMU_MCU_CLK_CTRL_APBCLK_DIV(c)                     ((c) << CMU_MCU_CLK_CTRL_APBCLK_DIV_SHIFT)
#define CMU_MCU_CLK_CTRL_SRPCLK_DIV(c)                     ((c) << CMU_MCU_CLK_CTRL_SRPCLK_DIV_SHIFT)

#define CMU_MCU_CLK_GATE_FCLK_SHIFT                        (0)
#define CMU_MCU_CLK_GATE_SRP_SHIFT                         (1)
#define CMU_MCU_CLK_GATE_GPIO_SHIFT                        (2)
#define CMU_MCU_CLK_GATE_UDMAC_SHIFT                       (3)
#define CMU_MCU_CLK_GATE_DTRNG_SHIFT                       (4)
#define CMU_MCU_CLK_GATE_AES_SHIFT                         (5)
#define CMU_MCU_CLK_GATE_SRC_SHIFT                         (6)
#define CMU_MCU_CLK_GATE_QSPI_SHIFT                        (7)
#define CMU_MCU_CLK_GATE_TIMER_SHIFT                       (8)
#define CMU_MCU_CLK_GATE_PTIMER_SHIFT                      (14)
#define CMU_MCU_CLK_GATE_DTIMER_SHIFT                      (16)
#define CMU_MCU_CLK_GATE_WATCHDOG_SHIFT                    (17)
#define CMU_MCU_CLK_GATE_UDMAC_ACG_SHIFT                   (18)
#define CMU_MCU_CLK_GATE_BYPASS_SHIFT                      (19)

#define CMU_MCU_CLK_GATE_FCLK_MASK                         (0x01 << CMU_MCU_CLK_GATE_FCLK_SHIFT)
#define CMU_MCU_CLK_GATE_SRP_MASK                          (0x01 << CMU_MCU_CLK_GATE_SRP_SHIFT)
#define CMU_MCU_CLK_GATE_GPIO_MASK                         (0x01 << CMU_MCU_CLK_GATE_GPIO_SHIFT)
#define CMU_MCU_CLK_GATE_UDMAC_MASK                        (0x01 << CMU_MCU_CLK_GATE_UDMAC_SHIFT)
#define CMU_MCU_CLK_GATE_DTRNG_MASK                        (0x01 << CMU_MCU_CLK_GATE_DTRNG_SHIFT)
#define CMU_MCU_CLK_GATE_AES_MASK                          (0x01 << CMU_MCU_CLK_GATE_AES_SHIFT)
#define CMU_MCU_CLK_GATE_SRC_MASK                          (0x01 << CMU_MCU_CLK_GATE_SRC_SHIFT)
#define CMU_MCU_CLK_GATE_QSPI_MASK                         (0x01 << CMU_MCU_CLK_GATE_QSPI_SHIFT)
#define CMU_MCU_CLK_GATE_TIMER_MASK                        (0x3F << CMU_MCU_CLK_GATE_TIMER_SHIFT)
#define CMU_MCU_CLK_GATE_PTIMER_MASK                       (0x03 << CMU_MCU_CLK_GATE_PTIMER_SHIFT)
#define CMU_MCU_CLK_GATE_DTIMER_MASK                       (0x01 << CMU_MCU_CLK_GATE_DTIMER_SHIFT)
#define CMU_MCU_CLK_GATE_WATCHDOG_MASK                     (0x01 << CMU_MCU_CLK_GATE_WATCHDOG_SHIFT)
#define CMU_MCU_CLK_GATE_UDMAC_ACG_MASK                    (0x01 << CMU_MCU_CLK_GATE_UDMAC_ACG_SHIFT)
#define CMU_MCU_CLK_GATE_BYPASS_MASK                       (0x01 << CMU_MCU_CLK_GATE_BYPASS_SHIFT)

#define CMU_MCU_CLK_GATE_FCLK(c)                           ((c) << CMU_MCU_CLK_GATE_FCLK_SHIFT)
#define CMU_MCU_CLK_GATE_SRP(c)                            ((c) << CMU_MCU_CLK_GATE_SRP_SHIFT)
#define CMU_MCU_CLK_GATE_GPIO(c)                           ((c) << CMU_MCU_CLK_GATE_GPIO_SHIFT)
#define CMU_MCU_CLK_GATE_UDMAC(c)                          ((c) << CMU_MCU_CLK_GATE_UDMAC_SHIFT)
#define CMU_MCU_CLK_GATE_DTRNG(c)                          ((c) << CMU_MCU_CLK_GATE_DTRNG_SHIFT)
#define CMU_MCU_CLK_GATE_AES(c)                            ((c) << CMU_MCU_CLK_GATE_AES_SHIFT)
#define CMU_MCU_CLK_GATE_SRC(c)                            ((c) << CMU_MCU_CLK_GATE_SRC_SHIFT)
#define CMU_MCU_CLK_GATE_QSPI(c)                           ((c) << CMU_MCU_CLK_GATE_QSPI_SHIFT)
#define CMU_MCU_CLK_GATE_TIMER(c)                          ((c) << CMU_MCU_CLK_GATE_TIMER_SHIFT)
#define CMU_MCU_CLK_GATE_PTIMER(c)                         ((c) << CMU_MCU_CLK_GATE_PTIMER_SHIFT)
#define CMU_MCU_CLK_GATE_DTIMER(c)                         ((c) << CMU_MCU_CLK_GATE_DTIMER_SHIFT)
#define CMU_MCU_CLK_GATE_WATCHDOG(c)                       ((c) << CMU_MCU_CLK_GATE_WATCHDOG_SHIFT)
#define CMU_MCU_CLK_GATE_UDMAC_ACG(c)                      ((c) << CMU_MCU_CLK_GATE_UDMAC_ACG_SHIFT)
#define CMU_MCU_CLK_GATE_BYPASS(c)                         ((c) << CMU_MCU_CLK_GATE_BYPASS_SHIFT)

#define CMU_AFE_CLK_CTRL_SEL_SRC_SHIFT                     (0)
#define CMU_AFE_CLK_CTRL_AFE_DIV_ON_SHIFT                  (2)
#define CMU_AFE_CLK_CTRL_SEL_AFECON32_SHIFT                (3)
#define CMU_AFE_CLK_CTRL_SMP_CLK_DIV_SHIFT                 (4)

#define CMU_AFE_CLK_CTRL_SEL_SRC_MASK                      (0x03 << CMU_AFE_CLK_CTRL_SEL_SRC_SHIFT)
#define CMU_AFE_CLK_CTRL_AFE_DIV_ON_MASK                   (0x01 << CMU_AFE_CLK_CTRL_AFE_DIV_ON_SHIFT)
#define CMU_AFE_CLK_CTRL_SEL_AFECON32_MASK                 (0x01 << CMU_AFE_CLK_CTRL_SEL_AFECON32_SHIFT)
#define CMU_AFE_CLK_CTRL_SMP_CLK_DIV_MASK                  (0xFFFF << CMU_AFE_CLK_CTRL_SMP_CLK_DIV_SHIFT)

#define CMU_AFE_CLK_CTRL_SEL_SRC(c)                         ((c) << CMU_AFE_CLK_CTRL_SEL_SRC_SHIFT)
#define CMU_AFE_CLK_CTRL_AFE_DIV_ON(c)                      ((c) << CMU_AFE_CLK_CTRL_AFE_DIV_ON_SHIFT)
#define CMU_AFE_CLK_CTRL_SEL_AFECON32(c)                    ((c) << CMU_AFE_CLK_CTRL_SEL_AFECON32_SHIFT)
#define CMU_AFE_CLK_CTRL_SMP_CLK_DIV(c)                     ((c) << CMU_AFE_CLK_CTRL_SMP_CLK_DIV_SHIFT)

#define CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT                  (0)
#define CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT                   (3)
#define CMU_PERI_CLK_MUX_I2CCLK_MUX_SHIFT                   (8)


#define CMU_PERI_CLK_MUX_UARTCLK_MUX_MASK                   (0x07 << CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_SPICLK_MUX_MASK                    (0x0F << CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_I2CCLK_MUX_MASK                    (0x1F << CMU_PERI_CLK_MUX_I2CCLK_MUX_SHIFT)

#define CMU_PERI_CLK_MUX_UARTCLK_MUX(c)                     ((c) << CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_SPICLK_MUX(c)                      ((c) << CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT)

#define CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT                  (0)
#define CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT                   (3)
#define CMU_PERI_CLK_MUX_I2CCLK_MUX_SHIFT                   (8)

#define CMU_PERI_CLK_MUX_UARTCLK_MUX_MASK                   (0x07 << CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_SPICLK_MUX_MASK                    (0x0F << CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_I2CCLK_MUX_MASK                    (0x1F << CMU_PERI_CLK_MUX_I2CCLK_MUX_SHIFT)

#define CMU_PERI_CLK_MUX_UARTCLK_MUX(c)                     ((c) << CMU_PERI_CLK_MUX_UARTCLK_MUX_SHIFT)
#define CMU_PERI_CLK_MUX_SPICLK_MUX(c)                      ((c) << CMU_PERI_CLK_MUX_SPICLK_MUX_SHIFT)

#define CMU_PERI_CLK_CTRL_SEL_SRC_SHIFT                     (0)
#define CMU_PERI_CLK_CTRL_CLK_DIV_SHIFT                     (4)

#define CMU_PERI_CLK_CTRL_SEL_SRC_MASK                      (0x03 << CMU_PERI_CLK_CTRL_SEL_SRC_SHIFT)
#define CMU_PERI_CLK_CTRL_CLK_DIV_MASK                      (0xFF << CMU_PERI_CLK_CTRL_CLK_DIV_SHIFT)

#define CMU_PERI_CLK_CTRL_SEL_SRC(c)                        ((c) << CMU_PERI_CLK_CTRL_SEL_SRC_SHIFT)
#define CMU_PERI_CLK_CTRL_CLK_DIV(c)                        ((c) << CMU_PERI_CLK_CTRL_CLK_DIV_SHIFT)

#define CMU_HOSC_CTRL_MODE_SHIFT                            (1)
#define CMU_HOSC_CTRL_CAL_SHIFT                             (2)
#define CMU_HOSC_CTRL_TOL_SHIFT                             (10)

#define CMU_HOSC_CTRL_MODE_MASK                             (0x01 << CMU_HOSC_CTRL_MODE_SHIFT)
#define CMU_HOSC_CTRL_CAL_MASK                              (0xFF << CMU_HOSC_CTRL_CAL_SHIFT)
#define CMU_HOSC_CTRL_TOL_MASK                              (0x03 << CMU_HOSC_CTRL_TOL_SHIFT)

#define CMU_HOSC_CTRL_MODE(c)                               ((c) << CMU_HOSC_CTRL_MODE_SHIFT)
#define CMU_HOSC_CTRL_CAL(c)                                ((c) << CMU_HOSC_CTRL_CAL_SHIFT)
#define CMU_HOSC_CTRL_TOL(c)                                ((c) << CMU_HOSC_CTRL_TOL_SHIFT)

#define ENABLE                                  1
#define DISABLE                                 0

#define CONFIG_CMU_FCLK_AHBCLK                  (ENABLE  << 0)
#define CONFIG_CMU_SRP_SRPCLK                   (DISABLE << 1)
#define CONFIG_CMU_GPIO_AHBCLK                  (ENABLE << 2)
#define CONFIG_CMU_UDMAC_AHBCLK                 (ENABLE << 3)
#define CONFIG_CMU_DTRNG_AHBCLK                 (DISABLE << 4)
#define CONFIG_CMU_AES_AHBCLK                   (DISABLE << 5)
#define CONFIG_CMU_SRC_AHBCLK                   (DISABLE << 6)
#define CONFIG_CMU_QSPI_AHBCLK                  (DISABLE << 7)
#define CONFIG_CMU_TIMER0_APBCLK                (DISABLE << 8)
#define CONFIG_CMU_TIMER1_APBCLK                (DISABLE << 9)
#define CONFIG_CMU_TIMER2_APBCLK                (DISABLE << 10)
#define CONFIG_CMU_TIMER3_APBCLK                (DISABLE << 11)
#define CONFIG_CMU_TIMER4_APBCLK                (DISABLE << 12)
#define CONFIG_CMU_TIMER5_APBCLK                (DISABLE << 13)
#define CONFIG_CMU_TIMER6_APBCLK                (DISABLE << 14)
#define CONFIG_CMU_PWMTIMER_APBCLK              (DISABLE << 15)
#define CONFIG_CMU_DUALTIMER_APBCLK             (ENABLE << 16)
#define CONFIG_CMU_WATCHDOG_APBCLK              (ENABLE << 17)
#define CONFIG_CMU_UART0_CLK                    (DISABLE  << 18)
#define CONFIG_CMU_UART1_CLK                    (DISABLE << 19)
#define CONFIG_CMU_UART2_CLK                    (DISABLE << 20)
#define CONFIG_CMU_SPI0_CLK                     (DISABLE  << 21)
#define CONFIG_CMU_SPI1_CLK                     (DISABLE << 22)
#define CONFIG_CMU_SPI2_CLK                     (DISABLE << 23)
#define CONFIG_CMU_SPI3_CLK                     (DISABLE << 24)
#define CONFIG_CMU_SPI4_CLK                     (DISABLE << 25)
#define CONFIG_CMU_I2C0_CLK                     (DISABLE << 26)
#define CONFIG_CMU_I2C1_CLK                     (DISABLE << 27)
#define CONFIG_CMU_I2C2_CLK                     (DISABLE << 28)
#define CONFIG_CMU_I2C3_CLK                     (DISABLE << 29)
#define CONFIG_CMU_I2C4_CLK                     (DISABLE << 30)

#define INIT_CLOCK_CONFIG  (CONFIG_CMU_FCLK_AHBCLK | CONFIG_CMU_SRP_SRPCLK |  \
                CONFIG_CMU_GPIO_AHBCLK | CONFIG_CMU_UDMAC_AHBCLK |         \
                CONFIG_CMU_DTRNG_AHBCLK |CONFIG_CMU_AES_AHBCLK |           \
                CONFIG_CMU_SRC_AHBCLK | CONFIG_CMU_QSPI_AHBCLK |           \
                CONFIG_CMU_TIMER0_APBCLK | CONFIG_CMU_TIMER1_APBCLK |      \
                CONFIG_CMU_TIMER2_APBCLK | CONFIG_CMU_TIMER3_APBCLK |      \
                CONFIG_CMU_TIMER4_APBCLK | CONFIG_CMU_TIMER5_APBCLK |      \
                CONFIG_CMU_TIMER6_APBCLK | CONFIG_CMU_PWMTIMER_APBCLK |    \
                CONFIG_CMU_DUALTIMER_APBCLK | CONFIG_CMU_WATCHDOG_APBCLK | \
                CONFIG_CMU_UART0_CLK | CONFIG_CMU_UART1_CLK |              \
                CONFIG_CMU_UART2_CLK | CONFIG_CMU_SPI0_CLK |               \
                CONFIG_CMU_SPI1_CLK | CONFIG_CMU_SPI2_CLK |                \
                CONFIG_CMU_SPI3_CLK | CONFIG_CMU_SPI4_CLK |                \
                CONFIG_CMU_I2C0_CLK | CONFIG_CMU_I2C1_CLK |                \
                CONFIG_CMU_I2C2_CLK | CONFIG_CMU_I2C3_CLK |                \
                CONFIG_CMU_I2C4_CLK )

typedef enum _cmu_sel_sample_clk_t {
    CMU_SELECT_INTERNAL_CLK = 0,
    CMU_SELECT_EXTERNAL_XTAL_32768_CLK,

    CMU_SELECT_INVALID
} cmu_sel_smp_clk_t;

typedef enum {
    CMU_SRC_CLK_LSOSC = 0,          // Internal LOSC 4.096MHz
    CMU_SRC_CLK_EXT_4M,             // External XTAL 4.096MHz
    CMU_SRC_CLK_HSOSC,              // Internal  HOSC 24.576MHz
    CMU_SRC_CLK_PLL,                // Internal PLL 102.4MHz
    CMU_SRC_32768Hz,                // External XTAL  32.768KHz

    CMU_SOURCE_CLK_INVALID
} cmu_src_clk_t;

typedef enum {
    CMU_SAMPLE_CLK_AFTER_DIV = 0,
    CMU_SRPCLK_AFTER_DIV,
    CMU_AHBCLK_AFTER_DIV,
    CMU_APBCLK_AFTER_DIV,
    CMU_PERICLK_AFTER_DIV,

    CMU_RTC_CLK,
    CMU_AFECON_CLK,
    CMU_SAMPLE_CLK,

    CMU_FCLK_AHBCLK,   //  eFlash, MCU core clock
    CMU_SRP_SRPCLK,
    CMU_GPIO_AHBCLK,
    CMU_UDMAC_AHBCLK,
    CMU_DTRNG_AHBCLK,
    CMU_AES_AHBCLK,
    CMU_SRC_AHBCLK,
    CMU_QSPI_AHBCLK,
    CMU_TIMER0_APBCLK,
    CMU_TIMER1_APBCLK,
    CMU_TIMER2_APBCLK,
    CMU_TIMER3_APBCLK,
    CMU_TIMER4_APBCLK,
    CMU_TIMER5_APBCLK,
    CMU_TIMER6_APBCLK,
    CMU_PWMTIMER_APBCLK,
    CMU_DUALTIMER_APBCLK,
    CMU_WATCHDOG_APBCLK,

    CMU_UART0_CLK,
    CMU_UART1_CLK,
    CMU_UART2_CLK,

    CMU_SPI0_CLK,
    CMU_SPI1_CLK,
    CMU_SPI2_CLK,
    CMU_SPI3_CLK,
    CMU_SPI4_CLK,

    CMU_I2C0_CLK,
    CMU_I2C1_CLK,
    CMU_I2C2_CLK,
    CMU_I2C3_CLK,
    CMU_I2C4_CLK,

    CMU_CLK_INVALID
} cmu_clock_t;

typedef enum {
    CMU_MUX_MCU_CLK = 0,
    CMU_MUX_PERI_CLK,

    CMU_MUX_INVALID
} cmu_mux_peri_clock_t;

void bp6a_cmu_init(cmu_src_clk_t mcu_clk, cmu_src_clk_t peri_clk);
bool bp6a_cmu_get_clock_enabled(cmu_clock_t clock);
int bp6a_cmu_enable_clock(cmu_clock_t clock, bool en);
uint32_t bp6a_get_clock_src_freq(cmu_clock_t clock);
uint32_t bp6a_cmu_get_clock_freq(cmu_clock_t clock);

#endif  /*__S1SBP6A_CMU_H */