zhang boie / mbed-dev-f30333
Committer:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4
Date:
Tue Jun 14 09:21:18 2022 +0000
Revision:
0:bdf663c61a82
lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1 /**
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2 * @file
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3 * @brief Peripheral Management Unit (PMU) Function Implementations.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 5 /* *****************************************************************************
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 6 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 7 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 8 * Permission is hereby granted, free of charge, to any person obtaining a
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 9 * copy of this software and associated documentation files (the "Software"),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 10 * to deal in the Software without restriction, including without limitation
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 12 * and/or sell copies of the Software, and to permit persons to whom the
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 13 * Software is furnished to do so, subject to the following conditions:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 14 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 15 * The above copyright notice and this permission notice shall be included
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 16 * in all copies or substantial portions of the Software.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 17 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 21 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 22 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 24 * OTHER DEALINGS IN THE SOFTWARE.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 25 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 26 * Except as contained in this notice, the name of Maxim Integrated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 27 * Products, Inc. shall not be used except as stated in the Maxim Integrated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 28 * Products, Inc. Branding Policy.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 29 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 30 * The mere transfer of this software does not imply any licenses
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 31 * of trade secrets, proprietary technology, copyrights, patents,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 32 * trademarks, maskwork rights, or any other form of intellectual
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 33 * property whatsoever. Maxim Integrated Products, Inc. retains all
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 34 * ownership rights.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 35 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 36 * $Date: 2016-09-08 17:44:03 -0500 (Thu, 08 Sep 2016) $
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 37 * $Revision: 24328 $
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 38 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 39 **************************************************************************** */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 40
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 41 /* **** Includes **** */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 42 #include <stdio.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 43 #include <stddef.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 44 #include "mxc_config.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 45 #include "mxc_assert.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 46 #include "pmu.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 47 /**
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 48 * @ingroup pmuGroup
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 49 * @{
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 50 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 51
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 52 #if (MXC_PMU_REV == 0)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 53 /* MAX32630 A1 & A2 Erratum #6: PMU only supports channels 0-4 -- workaround */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 54 #include "clkman_regs.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 55 /* Channel 5 infinite loop program */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 56 static const uint32_t pmu_0[] = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 57 PMU_JUMP(0, 0, (uint32_t)pmu_0)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 58 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 59 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 60
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 61 /* **** Local Function Prototypes **** */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 62 static void (*callbacks[MXC_CFG_PMU_CHANNELS])(int);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 63
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 64
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 65 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 66 void PMU_Handler(void)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 67 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 68 int channel;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 69 uint32_t cfg1, cfg2;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 70 mxc_pmu_regs_t *MXC_PMUn;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 71
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 72 for (channel = 0; channel < MXC_CFG_PMU_CHANNELS; channel++) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 73 MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 74
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 75 if (MXC_PMUn->cfg & MXC_F_PMU_CFG_INTERRUPT) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 76 cfg1 = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 77 /* Since any set flags will be cleared by the write-back below, mask them off */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 78 cfg2 = cfg1 & ~(MXC_F_PMU_CFG_LL_STOPPED | MXC_F_PMU_CFG_BUS_ERROR | MXC_F_PMU_CFG_TO_STAT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 79
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 80 /* Clear the interrupt flag */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 81 MXC_PMUn->cfg = cfg2 | MXC_F_PMU_CFG_INTERRUPT;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 82
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 83 if (callbacks[channel]) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 84 callbacks[channel](cfg1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 85 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 86 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 87 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 88 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 89
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 90 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 91 int PMU_Start(unsigned int channel, const void *program_address, pmu_callback callback)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 92 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 93 if(channel >= MXC_CFG_PMU_CHANNELS)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 94 return E_BAD_PARAM;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 95
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 96 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 97 uint32_t cfg = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 98
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 99 /* is this channel already running? */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 100 if (cfg & MXC_F_PMU_CFG_ENABLE) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 101 return E_BUSY;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 102 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 103
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 104 #if (MXC_PMU_REV == 0)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 105 /* MAX32630 A1 & A2 Erratum #6: PMU only supports channels 0-4 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 106 if (channel == 5) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 107 /* Channel 5 is used for the work-around */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 108 return E_BUSY;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 109 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 110 /* Select always-ON clock for PMU */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 111 MXC_CLKMAN->clk_gate_ctrl0 |= MXC_F_CLKMAN_CLK_GATE_CTRL0_PMU_CLK_GATER;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 112 /* Start channel 5 with infinite-loop program */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 113 MXC_PMU5->cfg &= ~MXC_F_PMU_CFG_ENABLE; /* Clear enable and wipe W1C flags */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 114 MXC_PMU5->dscadr = (uint32_t)pmu_0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 115 MXC_PMU5->cfg = MXC_F_PMU_CFG_ENABLE | (0x1c << MXC_F_PMU_CFG_BURST_SIZE_POS);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 116 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 117 /* Set callback */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 118 callbacks[channel] = callback;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 119
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 120 /* Set start op-code */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 121 MXC_PMUn->dscadr = (uint32_t)program_address;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 122
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 123 /* Configure the channel */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 124 cfg = (cfg & ~(MXC_F_PMU_CFG_MANUAL | MXC_F_PMU_CFG_BURST_SIZE)) | (0x1c << MXC_F_PMU_CFG_BURST_SIZE_POS);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 125
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 126 /* Enable if necessary */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 127 if (callback) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 128 cfg |= MXC_F_PMU_CFG_INT_EN;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 129 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 130 cfg &= ~MXC_F_PMU_CFG_INT_EN;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 131 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 132
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 133 /* Start the channel */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 134 cfg |= MXC_F_PMU_CFG_ENABLE;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 135
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 136 /*If any W1C flags are set, this write will clear them */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 137 MXC_PMUn->cfg = cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 138
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 139 return E_NO_ERROR;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 140 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 141
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 142 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 143 void PMU_Stop(unsigned int channel)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 144 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 145 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 146 uint32_t cfg = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 147
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 148 /* Since any set flags will be cleared by the write-back below, mask them off */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 149 cfg &= ~(MXC_F_PMU_CFG_LL_STOPPED | MXC_F_PMU_CFG_BUS_ERROR | MXC_F_PMU_CFG_TO_STAT | MXC_F_PMU_CFG_INTERRUPT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 150
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 151 /* Clear the enable bit to stop the channel */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 152 cfg &= ~MXC_F_PMU_CFG_ENABLE;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 153
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 154 MXC_PMUn->cfg = cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 155
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 156 /* Remove callback */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 157 callbacks[channel] = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 158
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 159 #if (MXC_PMU_REV == 0)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 160 /* MAX32630 A1 & A2 Erratum #6: PMU only supports channels 0-4 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 161 /* Check channels 0-4 for any running channels. If none found, stop channel 5 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 162 if ((MXC_PMU0->cfg & MXC_F_PMU_CFG_ENABLE) == 0 &&
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 163 (MXC_PMU1->cfg & MXC_F_PMU_CFG_ENABLE) == 0 &&
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 164 (MXC_PMU2->cfg & MXC_F_PMU_CFG_ENABLE) == 0 &&
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 165 (MXC_PMU3->cfg & MXC_F_PMU_CFG_ENABLE) == 0 &&
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 166 (MXC_PMU4->cfg & MXC_F_PMU_CFG_ENABLE) == 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 167 MXC_PMU5->cfg &= ~MXC_F_PMU_CFG_ENABLE;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 168 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 169 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 170
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 171 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 172
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 173 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 174 int PMU_SetCounter(unsigned int channel, unsigned int counter, uint16_t value)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 175 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 176 if((channel >= MXC_CFG_PMU_CHANNELS) || counter > 1)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 177 return E_BAD_PARAM;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 178
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 179 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 180
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 181 if (counter == 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 182 MXC_PMUn->loop = (MXC_PMUn->loop & ~MXC_F_PMU_LOOP_COUNTER_0) | (value << MXC_F_PMU_LOOP_COUNTER_0_POS);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 183 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 184 MXC_PMUn->loop = (MXC_PMUn->loop & ~MXC_F_PMU_LOOP_COUNTER_1) | (value << MXC_F_PMU_LOOP_COUNTER_1_POS);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 185 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 186
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 187 return E_NO_ERROR;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 188 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 189
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 190 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 191 int PMU_SetTimeout(unsigned int channel, pmu_ps_sel_t timeoutClkScale, pmu_to_sel_t timeoutTicks)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 192 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 193 if(channel >= MXC_CFG_PMU_CHANNELS)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 194 return E_BAD_PARAM;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 195
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 196 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 197 uint32_t cfg = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 198
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 199 /* Since any set flags will be cleared by the write-back below, mask them off */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 200 cfg &= ~(MXC_F_PMU_CFG_LL_STOPPED | MXC_F_PMU_CFG_BUS_ERROR | MXC_F_PMU_CFG_TO_STAT | MXC_F_PMU_CFG_INTERRUPT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 201
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 202 /* Adjust timeout settings */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 203 cfg &= ~(MXC_F_PMU_CFG_TO_SEL | MXC_F_PMU_CFG_PS_SEL);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 204 cfg |= ((timeoutClkScale << MXC_F_PMU_CFG_PS_SEL_POS) & MXC_F_PMU_CFG_PS_SEL) |
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 205 ((timeoutTicks << MXC_F_PMU_CFG_TO_SEL_POS) & MXC_F_PMU_CFG_TO_SEL);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 206
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 207 MXC_PMUn->cfg = cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 208
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 209 return E_NO_ERROR;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 210 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 211
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 212 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 213 uint32_t PMU_GetFlags(unsigned int channel)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 214 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 215 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 216 uint32_t cfg = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 217
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 218 /* Mask off configuration bits leaving only flag bits */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 219 cfg &= ~(MXC_F_PMU_CFG_ENABLE | MXC_F_PMU_CFG_MANUAL | MXC_F_PMU_CFG_TO_SEL | MXC_F_PMU_CFG_PS_SEL |
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 220 MXC_F_PMU_CFG_INT_EN | MXC_F_PMU_CFG_BURST_SIZE);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 221
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 222 return cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 223 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 224
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 225 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 226 void PMU_ClearFlags(unsigned int channel, unsigned int mask)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 227 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 228 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 229 uint32_t cfg = MXC_PMUn->cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 230
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 231 /* Since any set flags will be cleared by the write-back below, mask them off */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 232 cfg &= ~(MXC_F_PMU_CFG_LL_STOPPED | MXC_F_PMU_CFG_BUS_ERROR | MXC_F_PMU_CFG_TO_STAT | MXC_F_PMU_CFG_INTERRUPT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 233
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 234 /* Now, apply the caller-supplied bits to clear */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 235 cfg |= mask;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 236
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 237 MXC_PMUn->cfg = cfg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 238 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 239
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 240 /* ************************************************************************* */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 241 uint32_t PMU_IsActive(unsigned int channel)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 242 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 243 mxc_pmu_regs_t *MXC_PMUn = &MXC_PMU0[channel];
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 244 return (MXC_PMUn->cfg & MXC_F_PMU_CFG_ENABLE);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 245 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 246 /**@} end of ingroup pmuGroup */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 247