Marco Zecchini / Mbed OS Example_RTOS
Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /**
marcozecchini 0:9fca2b23d0ba 2 * @file
marcozecchini 0:9fca2b23d0ba 3 * @brief System Clock Management (CLKMAN) Function Implementations.
marcozecchini 0:9fca2b23d0ba 4 */
marcozecchini 0:9fca2b23d0ba 5 /* *****************************************************************************
marcozecchini 0:9fca2b23d0ba 6 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
marcozecchini 0:9fca2b23d0ba 7 *
marcozecchini 0:9fca2b23d0ba 8 * Permission is hereby granted, free of charge, to any person obtaining a
marcozecchini 0:9fca2b23d0ba 9 * copy of this software and associated documentation files (the "Software"),
marcozecchini 0:9fca2b23d0ba 10 * to deal in the Software without restriction, including without limitation
marcozecchini 0:9fca2b23d0ba 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
marcozecchini 0:9fca2b23d0ba 12 * and/or sell copies of the Software, and to permit persons to whom the
marcozecchini 0:9fca2b23d0ba 13 * Software is furnished to do so, subject to the following conditions:
marcozecchini 0:9fca2b23d0ba 14 *
marcozecchini 0:9fca2b23d0ba 15 * The above copyright notice and this permission notice shall be included
marcozecchini 0:9fca2b23d0ba 16 * in all copies or substantial portions of the Software.
marcozecchini 0:9fca2b23d0ba 17 *
marcozecchini 0:9fca2b23d0ba 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
marcozecchini 0:9fca2b23d0ba 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
marcozecchini 0:9fca2b23d0ba 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
marcozecchini 0:9fca2b23d0ba 21 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
marcozecchini 0:9fca2b23d0ba 22 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
marcozecchini 0:9fca2b23d0ba 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
marcozecchini 0:9fca2b23d0ba 24 * OTHER DEALINGS IN THE SOFTWARE.
marcozecchini 0:9fca2b23d0ba 25 *
marcozecchini 0:9fca2b23d0ba 26 * Except as contained in this notice, the name of Maxim Integrated
marcozecchini 0:9fca2b23d0ba 27 * Products, Inc. shall not be used except as stated in the Maxim Integrated
marcozecchini 0:9fca2b23d0ba 28 * Products, Inc. Branding Policy.
marcozecchini 0:9fca2b23d0ba 29 *
marcozecchini 0:9fca2b23d0ba 30 * The mere transfer of this software does not imply any licenses
marcozecchini 0:9fca2b23d0ba 31 * of trade secrets, proprietary technology, copyrights, patents,
marcozecchini 0:9fca2b23d0ba 32 * trademarks, maskwork rights, or any other form of intellectual
marcozecchini 0:9fca2b23d0ba 33 * property whatsoever. Maxim Integrated Products, Inc. retains all
marcozecchini 0:9fca2b23d0ba 34 * ownership rights.
marcozecchini 0:9fca2b23d0ba 35 *
marcozecchini 0:9fca2b23d0ba 36 * $Date: 2016-08-15 11:08:12 -0500 (Mon, 15 Aug 2016) $
marcozecchini 0:9fca2b23d0ba 37 * $Revision: 24058 $
marcozecchini 0:9fca2b23d0ba 38 *
marcozecchini 0:9fca2b23d0ba 39 **************************************************************************** */
marcozecchini 0:9fca2b23d0ba 40
marcozecchini 0:9fca2b23d0ba 41 /* **** Includes **** */
marcozecchini 0:9fca2b23d0ba 42 #include "mxc_config.h"
marcozecchini 0:9fca2b23d0ba 43 #include "mxc_assert.h"
marcozecchini 0:9fca2b23d0ba 44 #include "clkman.h"
marcozecchini 0:9fca2b23d0ba 45 #include "pwrseq_regs.h"
marcozecchini 0:9fca2b23d0ba 46
marcozecchini 0:9fca2b23d0ba 47 /**
marcozecchini 0:9fca2b23d0ba 48 * @ingroup clkman
marcozecchini 0:9fca2b23d0ba 49 * @{
marcozecchini 0:9fca2b23d0ba 50 */
marcozecchini 0:9fca2b23d0ba 51
marcozecchini 0:9fca2b23d0ba 52 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 53 void CLKMAN_SetSystemClock(clkman_system_source_select_t select, clkman_system_scale_t scale)
marcozecchini 0:9fca2b23d0ba 54 {
marcozecchini 0:9fca2b23d0ba 55 MXC_CLKMAN->clk_ctrl = ((MXC_CLKMAN->clk_ctrl & ~MXC_F_CLKMAN_CLK_CTRL_SYSTEM_SOURCE_SELECT) |
marcozecchini 0:9fca2b23d0ba 56 (MXC_V_CLKMAN_CLK_CTRL_SYSTEM_SOURCE_SELECT_96MHZ_RO));
marcozecchini 0:9fca2b23d0ba 57
marcozecchini 0:9fca2b23d0ba 58 switch(select) {
marcozecchini 0:9fca2b23d0ba 59 case CLKMAN_SYSTEM_SOURCE_96MHZ:
marcozecchini 0:9fca2b23d0ba 60 default:
marcozecchini 0:9fca2b23d0ba 61 // Enable and select the 96MHz oscillator
marcozecchini 0:9fca2b23d0ba 62 MXC_PWRSEQ->reg0 |= (MXC_F_PWRSEQ_REG0_PWR_ROEN_RUN);
marcozecchini 0:9fca2b23d0ba 63 MXC_PWRSEQ->reg0 &= ~(MXC_F_PWRSEQ_REG0_PWR_OSC_SELECT);
marcozecchini 0:9fca2b23d0ba 64
marcozecchini 0:9fca2b23d0ba 65 // Disable the 4MHz oscillator
marcozecchini 0:9fca2b23d0ba 66 MXC_PWRSEQ->reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_RCEN_RUN;
marcozecchini 0:9fca2b23d0ba 67
marcozecchini 0:9fca2b23d0ba 68 // Divide the system clock by the scale
marcozecchini 0:9fca2b23d0ba 69 MXC_PWRSEQ->reg3 = ((MXC_PWRSEQ->reg3 & ~MXC_F_PWRSEQ_REG3_PWR_RO_DIV) |
marcozecchini 0:9fca2b23d0ba 70 (scale << MXC_F_PWRSEQ_REG3_PWR_RO_DIV_POS));
marcozecchini 0:9fca2b23d0ba 71
marcozecchini 0:9fca2b23d0ba 72 break;
marcozecchini 0:9fca2b23d0ba 73 case CLKMAN_SYSTEM_SOURCE_4MHZ:
marcozecchini 0:9fca2b23d0ba 74 // Enable and select the 4MHz oscillator
marcozecchini 0:9fca2b23d0ba 75 MXC_PWRSEQ->reg0 |= (MXC_F_PWRSEQ_REG0_PWR_RCEN_RUN);
marcozecchini 0:9fca2b23d0ba 76 MXC_PWRSEQ->reg0 |= (MXC_F_PWRSEQ_REG0_PWR_OSC_SELECT);
marcozecchini 0:9fca2b23d0ba 77
marcozecchini 0:9fca2b23d0ba 78 // Disable the 96MHz oscillator
marcozecchini 0:9fca2b23d0ba 79 MXC_PWRSEQ->reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_ROEN_RUN;
marcozecchini 0:9fca2b23d0ba 80
marcozecchini 0:9fca2b23d0ba 81 // 4MHz System source can only be divided down by a maximum factor of 8
marcozecchini 0:9fca2b23d0ba 82 MXC_ASSERT(scale <= CLKMAN_SYSTEM_SCALE_DIV_8);
marcozecchini 0:9fca2b23d0ba 83
marcozecchini 0:9fca2b23d0ba 84 // Divide the system clock by the scale
marcozecchini 0:9fca2b23d0ba 85 MXC_PWRSEQ->reg3 = ((MXC_PWRSEQ->reg3 & ~MXC_F_PWRSEQ_REG3_PWR_RC_DIV) |
marcozecchini 0:9fca2b23d0ba 86 (scale << MXC_F_PWRSEQ_REG3_PWR_RC_DIV_POS));
marcozecchini 0:9fca2b23d0ba 87 break;
marcozecchini 0:9fca2b23d0ba 88 }
marcozecchini 0:9fca2b23d0ba 89
marcozecchini 0:9fca2b23d0ba 90 SystemCoreClockUpdate();
marcozecchini 0:9fca2b23d0ba 91 }
marcozecchini 0:9fca2b23d0ba 92
marcozecchini 0:9fca2b23d0ba 93 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 94 void CLKMAN_CryptoClockEnable(int enable)
marcozecchini 0:9fca2b23d0ba 95 {
marcozecchini 0:9fca2b23d0ba 96 if (enable) {
marcozecchini 0:9fca2b23d0ba 97 /* Enable oscillator */
marcozecchini 0:9fca2b23d0ba 98 MXC_CLKMAN->clk_config |= MXC_F_CLKMAN_CLK_CONFIG_CRYPTO_ENABLE;
marcozecchini 0:9fca2b23d0ba 99 /* Un-gate clock to TPU modules */
marcozecchini 0:9fca2b23d0ba 100 MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_CRYPTO_CLOCK_ENABLE;
marcozecchini 0:9fca2b23d0ba 101 } else {
marcozecchini 0:9fca2b23d0ba 102 /* Gate clock off */
marcozecchini 0:9fca2b23d0ba 103 MXC_CLKMAN->clk_ctrl &= ~MXC_F_CLKMAN_CLK_CTRL_CRYPTO_CLOCK_ENABLE;
marcozecchini 0:9fca2b23d0ba 104 /* Disable oscillator */
marcozecchini 0:9fca2b23d0ba 105 MXC_CLKMAN->clk_config &= ~MXC_F_CLKMAN_CLK_CONFIG_CRYPTO_ENABLE;
marcozecchini 0:9fca2b23d0ba 106 }
marcozecchini 0:9fca2b23d0ba 107 }
marcozecchini 0:9fca2b23d0ba 108
marcozecchini 0:9fca2b23d0ba 109 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 110 void CLKMAN_SetClkScale(clkman_clk_t clk, clkman_scale_t scale)
marcozecchini 0:9fca2b23d0ba 111 {
marcozecchini 0:9fca2b23d0ba 112 volatile uint32_t *clk_ctrl_reg;
marcozecchini 0:9fca2b23d0ba 113
marcozecchini 0:9fca2b23d0ba 114 MXC_ASSERT(clk <= CLKMAN_CLK_MAX);
marcozecchini 0:9fca2b23d0ba 115 MXC_ASSERT(scale != CLKMAN_SCALE_AUTO);
marcozecchini 0:9fca2b23d0ba 116
marcozecchini 0:9fca2b23d0ba 117 if (clk < CLKMAN_CRYPTO_CLK_AES) {
marcozecchini 0:9fca2b23d0ba 118 clk_ctrl_reg = &MXC_CLKMAN->sys_clk_ctrl_0_cm4 + clk;
marcozecchini 0:9fca2b23d0ba 119 } else {
marcozecchini 0:9fca2b23d0ba 120 clk_ctrl_reg = &MXC_CLKMAN->crypt_clk_ctrl_0_aes + (clk - CLKMAN_CRYPTO_CLK_AES);
marcozecchini 0:9fca2b23d0ba 121 }
marcozecchini 0:9fca2b23d0ba 122
marcozecchini 0:9fca2b23d0ba 123 *clk_ctrl_reg = scale;
marcozecchini 0:9fca2b23d0ba 124 }
marcozecchini 0:9fca2b23d0ba 125
marcozecchini 0:9fca2b23d0ba 126 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 127 clkman_scale_t CLKMAN_GetClkScale(clkman_clk_t clk)
marcozecchini 0:9fca2b23d0ba 128 {
marcozecchini 0:9fca2b23d0ba 129 volatile uint32_t *clk_ctrl_reg;
marcozecchini 0:9fca2b23d0ba 130 MXC_ASSERT(clk <= CLKMAN_CLK_MAX);
marcozecchini 0:9fca2b23d0ba 131
marcozecchini 0:9fca2b23d0ba 132 if (clk < CLKMAN_CRYPTO_CLK_AES) {
marcozecchini 0:9fca2b23d0ba 133 clk_ctrl_reg = &MXC_CLKMAN->sys_clk_ctrl_0_cm4 + clk;
marcozecchini 0:9fca2b23d0ba 134 } else {
marcozecchini 0:9fca2b23d0ba 135 clk_ctrl_reg = &MXC_CLKMAN->crypt_clk_ctrl_0_aes + (clk - CLKMAN_CRYPTO_CLK_AES);
marcozecchini 0:9fca2b23d0ba 136 }
marcozecchini 0:9fca2b23d0ba 137
marcozecchini 0:9fca2b23d0ba 138 return (clkman_scale_t)*clk_ctrl_reg;
marcozecchini 0:9fca2b23d0ba 139 }
marcozecchini 0:9fca2b23d0ba 140
marcozecchini 0:9fca2b23d0ba 141 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 142 void CLKMAN_ClockGate(clkman_enable_clk_t clk, int enable)
marcozecchini 0:9fca2b23d0ba 143 {
marcozecchini 0:9fca2b23d0ba 144 if (enable) {
marcozecchini 0:9fca2b23d0ba 145 MXC_CLKMAN->clk_ctrl |= clk;
marcozecchini 0:9fca2b23d0ba 146 } else {
marcozecchini 0:9fca2b23d0ba 147 MXC_CLKMAN->clk_ctrl &= ~clk;
marcozecchini 0:9fca2b23d0ba 148 }
marcozecchini 0:9fca2b23d0ba 149 }
marcozecchini 0:9fca2b23d0ba 150
marcozecchini 0:9fca2b23d0ba 151 /* ************************************************************************ */
marcozecchini 0:9fca2b23d0ba 152 int CLKMAN_WdtClkSelect(unsigned int idx, clkman_wdt_clk_select_t select)
marcozecchini 0:9fca2b23d0ba 153 {
marcozecchini 0:9fca2b23d0ba 154 MXC_ASSERT(idx < MXC_CFG_WDT_INSTANCES);
marcozecchini 0:9fca2b23d0ba 155
marcozecchini 0:9fca2b23d0ba 156 if (select == CLKMAN_WDT_SELECT_DISABLED) {
marcozecchini 0:9fca2b23d0ba 157 if (idx == 0) {
marcozecchini 0:9fca2b23d0ba 158 MXC_CLKMAN->clk_ctrl &= ~MXC_F_CLKMAN_CLK_CTRL_WDT0_CLOCK_ENABLE;
marcozecchini 0:9fca2b23d0ba 159 } else if (idx == 1) {
marcozecchini 0:9fca2b23d0ba 160 MXC_CLKMAN->clk_ctrl &= ~MXC_F_CLKMAN_CLK_CTRL_WDT1_CLOCK_ENABLE;
marcozecchini 0:9fca2b23d0ba 161 } else {
marcozecchini 0:9fca2b23d0ba 162 return E_BAD_PARAM;
marcozecchini 0:9fca2b23d0ba 163 }
marcozecchini 0:9fca2b23d0ba 164 } else {
marcozecchini 0:9fca2b23d0ba 165 if (idx == 0) {
marcozecchini 0:9fca2b23d0ba 166 MXC_CLKMAN->clk_ctrl = (MXC_CLKMAN->clk_ctrl & ~MXC_F_CLKMAN_CLK_CTRL_WDT0_CLOCK_SELECT) |
marcozecchini 0:9fca2b23d0ba 167 MXC_F_CLKMAN_CLK_CTRL_WDT0_CLOCK_ENABLE |
marcozecchini 0:9fca2b23d0ba 168 ((select << MXC_F_CLKMAN_CLK_CTRL_WDT0_CLOCK_SELECT_POS) & MXC_F_CLKMAN_CLK_CTRL_WDT0_CLOCK_SELECT);
marcozecchini 0:9fca2b23d0ba 169 } else if (idx == 1) {
marcozecchini 0:9fca2b23d0ba 170 MXC_CLKMAN->clk_ctrl = (MXC_CLKMAN->clk_ctrl & ~MXC_F_CLKMAN_CLK_CTRL_WDT1_CLOCK_SELECT) |
marcozecchini 0:9fca2b23d0ba 171 MXC_F_CLKMAN_CLK_CTRL_WDT1_CLOCK_ENABLE |
marcozecchini 0:9fca2b23d0ba 172 ((select << MXC_F_CLKMAN_CLK_CTRL_WDT1_CLOCK_SELECT_POS) & MXC_F_CLKMAN_CLK_CTRL_WDT1_CLOCK_SELECT);
marcozecchini 0:9fca2b23d0ba 173 } else {
marcozecchini 0:9fca2b23d0ba 174 return E_BAD_PARAM;
marcozecchini 0:9fca2b23d0ba 175 }
marcozecchini 0:9fca2b23d0ba 176 }
marcozecchini 0:9fca2b23d0ba 177
marcozecchini 0:9fca2b23d0ba 178 return E_NO_ERROR;
marcozecchini 0:9fca2b23d0ba 179 }
marcozecchini 0:9fca2b23d0ba 180
marcozecchini 0:9fca2b23d0ba 181 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 182 /* NOTE: CLKMAN_TrimRO() is implemented in system_max32XXX.c */
marcozecchini 0:9fca2b23d0ba 183 /* ************************************************************************* */
marcozecchini 0:9fca2b23d0ba 184
marcozecchini 0:9fca2b23d0ba 185 /**@} end of group clkman */