Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.

Upstream: https://github.com/ARMmbed/DAPLink

Committer:
Pawel Zarembski
Date:
Tue Apr 07 12:55:42 2020 +0200
Revision:
0:01f31e923fe2
hani: DAPLink with reset workaround

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:01f31e923fe2 1 /**
Pawel Zarembski 0:01f31e923fe2 2 * @file lpc43xx_cgu.c
Pawel Zarembski 0:01f31e923fe2 3 * @brief
Pawel Zarembski 0:01f31e923fe2 4 *
Pawel Zarembski 0:01f31e923fe2 5 * DAPLink Interface Firmware
Pawel Zarembski 0:01f31e923fe2 6 * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
Pawel Zarembski 0:01f31e923fe2 7 * SPDX-License-Identifier: Apache-2.0
Pawel Zarembski 0:01f31e923fe2 8 *
Pawel Zarembski 0:01f31e923fe2 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Pawel Zarembski 0:01f31e923fe2 10 * not use this file except in compliance with the License.
Pawel Zarembski 0:01f31e923fe2 11 * You may obtain a copy of the License at
Pawel Zarembski 0:01f31e923fe2 12 *
Pawel Zarembski 0:01f31e923fe2 13 * http://www.apache.org/licenses/LICENSE-2.0
Pawel Zarembski 0:01f31e923fe2 14 *
Pawel Zarembski 0:01f31e923fe2 15 * Unless required by applicable law or agreed to in writing, software
Pawel Zarembski 0:01f31e923fe2 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Pawel Zarembski 0:01f31e923fe2 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Pawel Zarembski 0:01f31e923fe2 18 * See the License for the specific language governing permissions and
Pawel Zarembski 0:01f31e923fe2 19 * limitations under the License.
Pawel Zarembski 0:01f31e923fe2 20 */
Pawel Zarembski 0:01f31e923fe2 21
Pawel Zarembski 0:01f31e923fe2 22 #include "lpc_types.h"
Pawel Zarembski 0:01f31e923fe2 23 #include "lpc43xx_scu.h"
Pawel Zarembski 0:01f31e923fe2 24 #include "lpc43xx_cgu.h"
Pawel Zarembski 0:01f31e923fe2 25
Pawel Zarembski 0:01f31e923fe2 26 /** This define used to fix mistake when run with IAR compiler */
Pawel Zarembski 0:01f31e923fe2 27 #ifdef __ICCARM__
Pawel Zarembski 0:01f31e923fe2 28 #define CGU_BRANCH_STATUS_ENABLE_MASK 0x80000001
Pawel Zarembski 0:01f31e923fe2 29 #else
Pawel Zarembski 0:01f31e923fe2 30 #define CGU_BRANCH_STATUS_ENABLE_MASK 0x01
Pawel Zarembski 0:01f31e923fe2 31 #endif
Pawel Zarembski 0:01f31e923fe2 32
Pawel Zarembski 0:01f31e923fe2 33 /*TODO List:
Pawel Zarembski 0:01f31e923fe2 34 * SET PLL0
Pawel Zarembski 0:01f31e923fe2 35 * UPDATE Clock from PLL0
Pawel Zarembski 0:01f31e923fe2 36 * SetDIV uncheck value
Pawel Zarembski 0:01f31e923fe2 37 * GetBaseStatus BASE_SAFE
Pawel Zarembski 0:01f31e923fe2 38 * */
Pawel Zarembski 0:01f31e923fe2 39 /* Local definition */
Pawel Zarembski 0:01f31e923fe2 40 #define CGU_ADDRESS32(x,y) (*(uint32_t*)((uint32_t)x+y))
Pawel Zarembski 0:01f31e923fe2 41
Pawel Zarembski 0:01f31e923fe2 42 /* Local Variable */
Pawel Zarembski 0:01f31e923fe2 43 const int16_t CGU_Entity_ControlReg_Offset[CGU_ENTITY_NUM] = {
Pawel Zarembski 0:01f31e923fe2 44 -1, //CGU_CLKSRC_32KHZ_OSC,
Pawel Zarembski 0:01f31e923fe2 45 -1, //CGU_CLKSRC_IRC,
Pawel Zarembski 0:01f31e923fe2 46 -1, //CGU_CLKSRC_ENET_RX_CLK,
Pawel Zarembski 0:01f31e923fe2 47 -1, //CGU_CLKSRC_ENET_TX_CLK,
Pawel Zarembski 0:01f31e923fe2 48 -1, //CGU_CLKSRC_GP_CLKIN,
Pawel Zarembski 0:01f31e923fe2 49 -1, //CGU_CLKSRC_TCK,
Pawel Zarembski 0:01f31e923fe2 50 0x18, //CGU_CLKSRC_XTAL_OSC,
Pawel Zarembski 0:01f31e923fe2 51 0x20, //CGU_CLKSRC_PLL0,
Pawel Zarembski 0:01f31e923fe2 52 0x30, //CGU_CLKSRC_PLL0_AUDIO **REV A**
Pawel Zarembski 0:01f31e923fe2 53 0x44, //CGU_CLKSRC_PLL1,
Pawel Zarembski 0:01f31e923fe2 54 -1, //CGU_CLKSRC_RESERVE,
Pawel Zarembski 0:01f31e923fe2 55 -1, //CGU_CLKSRC_RESERVE,
Pawel Zarembski 0:01f31e923fe2 56 0x48, //CGU_CLKSRC_IDIVA,,
Pawel Zarembski 0:01f31e923fe2 57 0x4C, //CGU_CLKSRC_IDIVB,
Pawel Zarembski 0:01f31e923fe2 58 0x50, //CGU_CLKSRC_IDIVC,
Pawel Zarembski 0:01f31e923fe2 59 0x54, //CGU_CLKSRC_IDIVD,
Pawel Zarembski 0:01f31e923fe2 60 0x58, //CGU_CLKSRC_IDIVE,
Pawel Zarembski 0:01f31e923fe2 61
Pawel Zarembski 0:01f31e923fe2 62 0x5C, //CGU_BASE_SAFE,
Pawel Zarembski 0:01f31e923fe2 63 0x60, //CGU_BASE_USB0,
Pawel Zarembski 0:01f31e923fe2 64 0x64, //CGU_BASE_PERIPH, // used for SPGPIO, peripheral control
Pawel Zarembski 0:01f31e923fe2 65 0x68, //CGU_BASE_USB1,
Pawel Zarembski 0:01f31e923fe2 66 0x6C, //CGU_BASE_M4,
Pawel Zarembski 0:01f31e923fe2 67 0x70, //CGU_BASE_SPIFI,
Pawel Zarembski 0:01f31e923fe2 68 -1, //CGU_BASE_RESERVE,
Pawel Zarembski 0:01f31e923fe2 69 0x78, //CGU_BASE_PHY_RX,
Pawel Zarembski 0:01f31e923fe2 70 0x7C, //CGU_BASE_PHY_TX,
Pawel Zarembski 0:01f31e923fe2 71 0x80, //CGU_BASE_APB1,
Pawel Zarembski 0:01f31e923fe2 72 0x84, //CGU_BASE_APB3,
Pawel Zarembski 0:01f31e923fe2 73 0x88, //CGU_BASE_LCD,
Pawel Zarembski 0:01f31e923fe2 74 0X8C, //CGU_BASE_ENET_CSR, **REV A**
Pawel Zarembski 0:01f31e923fe2 75 0x90, //CGU_BASE_SDIO,
Pawel Zarembski 0:01f31e923fe2 76 0x94, //CGU_BASE_SSP0,
Pawel Zarembski 0:01f31e923fe2 77 0x98, //CGU_BASE_SSP1,
Pawel Zarembski 0:01f31e923fe2 78 0x9C, //CGU_BASE_UART0,
Pawel Zarembski 0:01f31e923fe2 79 0xA0, //CGU_BASE_UART1,
Pawel Zarembski 0:01f31e923fe2 80 0xA4, //CGU_BASE_UART2,
Pawel Zarembski 0:01f31e923fe2 81 0xA8, //CGU_BASE_UART3,
Pawel Zarembski 0:01f31e923fe2 82 0xAC, //CGU_BASE_CLKOUT
Pawel Zarembski 0:01f31e923fe2 83 -1,
Pawel Zarembski 0:01f31e923fe2 84 -1,
Pawel Zarembski 0:01f31e923fe2 85 -1,
Pawel Zarembski 0:01f31e923fe2 86 -1,
Pawel Zarembski 0:01f31e923fe2 87 0xC0, //CGU_BASE_APLL
Pawel Zarembski 0:01f31e923fe2 88 0xC4, //CGU_BASE_OUT0
Pawel Zarembski 0:01f31e923fe2 89 0xC8 //CGU_BASE_OUT1
Pawel Zarembski 0:01f31e923fe2 90 };
Pawel Zarembski 0:01f31e923fe2 91
Pawel Zarembski 0:01f31e923fe2 92 const uint8_t CGU_ConnectAlloc_Tbl[CGU_CLKSRC_NUM][CGU_ENTITY_NUM] = {
Pawel Zarembski 0:01f31e923fe2 93 // 3 I E E G T X P P P x x D D D D D S U P U M S x P P A A L E S S S U U U U C x x x x A O O
Pawel Zarembski 0:01f31e923fe2 94 // 2 R R T P C T L L L I I I I I A S E S 3 P H H P P C N D S S R R R R O P U U
Pawel Zarembski 0:01f31e923fe2 95 // C X X I K A 0 A 1 A B C D E F B R B F RxTx1 3 D T I 0 1 0 1 2 3 L T T
Pawel Zarembski 0:01f31e923fe2 96 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_32KHZ_OSC = 0,*/
Pawel Zarembski 0:01f31e923fe2 97 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_IRC,*/
Pawel Zarembski 0:01f31e923fe2 98 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_ENET_RX_CLK,*/
Pawel Zarembski 0:01f31e923fe2 99 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_ENET_TX_CLK,*/
Pawel Zarembski 0:01f31e923fe2 100 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_GP_CLKIN,*/
Pawel Zarembski 0:01f31e923fe2 101 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, /*CGU_CLKSRC_TCK,*/
Pawel Zarembski 0:01f31e923fe2 102 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_XTAL_OSC,*/
Pawel Zarembski 0:01f31e923fe2 103 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1}, /*CGU_CLKSRC_PLL0,*/
Pawel Zarembski 0:01f31e923fe2 104 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_PLL0_AUDIO,*/
Pawel Zarembski 0:01f31e923fe2 105 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_PLL1,*/
Pawel Zarembski 0:01f31e923fe2 106 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
Pawel Zarembski 0:01f31e923fe2 107 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
Pawel Zarembski 0:01f31e923fe2 108 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_IDIVA = CGU_CLKSRC_PLL1 + 3,*/
Pawel Zarembski 0:01f31e923fe2 109 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_IDIVB,*/
Pawel Zarembski 0:01f31e923fe2 110 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_IDIVC,*/
Pawel Zarembski 0:01f31e923fe2 111 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1}, /*CGU_CLKSRC_IDIVD,*/
Pawel Zarembski 0:01f31e923fe2 112 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1} /*CGU_CLKSRC_IDIVE,*/
Pawel Zarembski 0:01f31e923fe2 113 };
Pawel Zarembski 0:01f31e923fe2 114
Pawel Zarembski 0:01f31e923fe2 115 const CGU_PERIPHERAL_S CGU_PERIPHERAL_Info[CGU_PERIPHERAL_NUM] = {
Pawel Zarembski 0:01f31e923fe2 116 /* Register Clock | Peripheral Clock
Pawel Zarembski 0:01f31e923fe2 117 | BASE | BRANCH | BASE | BRANCH */
Pawel Zarembski 0:01f31e923fe2 118 {CGU_BASE_APB3, 0x1118, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_ADC0,
Pawel Zarembski 0:01f31e923fe2 119 {CGU_BASE_APB3, 0x1120, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_ADC1,
Pawel Zarembski 0:01f31e923fe2 120 {CGU_BASE_M4, 0x1460, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_AES,
Pawel Zarembski 0:01f31e923fe2 121 //// CGU_PERIPHERAL_ALARMTIMER_CGU_RGU_RTC_WIC,
Pawel Zarembski 0:01f31e923fe2 122 {CGU_BASE_APB1, 0x1200, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_APB1_BUS,
Pawel Zarembski 0:01f31e923fe2 123 {CGU_BASE_APB3, 0x1100, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_APB3_BUS,
Pawel Zarembski 0:01f31e923fe2 124 {CGU_BASE_APB3, 0x1128, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_CAN0,
Pawel Zarembski 0:01f31e923fe2 125 {CGU_BASE_M4, 0x1538, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_CREG,
Pawel Zarembski 0:01f31e923fe2 126 {CGU_BASE_APB3, 0x1110, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_DAC,
Pawel Zarembski 0:01f31e923fe2 127 {CGU_BASE_M4, 0x1440, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_DMA,
Pawel Zarembski 0:01f31e923fe2 128 {CGU_BASE_M4, 0x1430, CGU_BASE_M4, 0x1478, 0},//CGU_PERIPHERAL_EMC,
Pawel Zarembski 0:01f31e923fe2 129 {CGU_BASE_M4, 0x1420, CGU_BASE_PHY_RX, 0x0000, CGU_PERIPHERAL_ETHERNET_TX},//CGU_PERIPHERAL_ETHERNET,
Pawel Zarembski 0:01f31e923fe2 130 {CGU_ENTITY_NONE, 0x0000, CGU_BASE_PHY_TX, 0x0000, 0}, //CGU_PERIPHERAL_ETHERNET_TX
Pawel Zarembski 0:01f31e923fe2 131 {CGU_BASE_M4, 0x1410, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_GPIO,
Pawel Zarembski 0:01f31e923fe2 132 {CGU_BASE_APB1, 0x1210, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_I2C0,
Pawel Zarembski 0:01f31e923fe2 133 {CGU_BASE_APB3, 0x1108, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_I2C1,
Pawel Zarembski 0:01f31e923fe2 134 {CGU_BASE_APB1, 0x1218, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_I2S,
Pawel Zarembski 0:01f31e923fe2 135 {CGU_BASE_M4, 0x1418, CGU_BASE_LCD, 0x0000, 0},//CGU_PERIPHERAL_LCD,
Pawel Zarembski 0:01f31e923fe2 136 {CGU_BASE_M4, 0x1448, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_M3CORE,
Pawel Zarembski 0:01f31e923fe2 137 {CGU_BASE_M4, 0x1400, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_M3_BUS,
Pawel Zarembski 0:01f31e923fe2 138 {CGU_BASE_APB1, 0x1208, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_MOTOCON,
Pawel Zarembski 0:01f31e923fe2 139 {CGU_BASE_M4, 0x1630, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_QEI,
Pawel Zarembski 0:01f31e923fe2 140 {CGU_BASE_M4, 0x1600, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_RITIMER,
Pawel Zarembski 0:01f31e923fe2 141 {CGU_BASE_M4, 0x1468, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_SCT,
Pawel Zarembski 0:01f31e923fe2 142 {CGU_BASE_M4, 0x1530, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_SCU,
Pawel Zarembski 0:01f31e923fe2 143 {CGU_BASE_M4, 0x1438, CGU_BASE_SDIO, 0x2800, 0},//CGU_PERIPHERAL_SDIO,
Pawel Zarembski 0:01f31e923fe2 144 {CGU_BASE_M4, 0x1408, CGU_BASE_SPIFI, 0x1300, 0},//CGU_PERIPHERAL_SPIFI,
Pawel Zarembski 0:01f31e923fe2 145 {CGU_BASE_M4, 0x1518, CGU_BASE_SSP0, 0x2700, 0},//CGU_PERIPHERAL_SSP0,
Pawel Zarembski 0:01f31e923fe2 146 {CGU_BASE_M4, 0x1628, CGU_BASE_SSP1, 0x2600, 0},//CGU_PERIPHERAL_SSP1,
Pawel Zarembski 0:01f31e923fe2 147 {CGU_BASE_M4, 0x1520, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_TIMER0,
Pawel Zarembski 0:01f31e923fe2 148 {CGU_BASE_M4, 0x1528, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_TIMER1,
Pawel Zarembski 0:01f31e923fe2 149 {CGU_BASE_M4, 0x1618, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_TIMER2,
Pawel Zarembski 0:01f31e923fe2 150 {CGU_BASE_M4, 0x1620, CGU_ENTITY_NONE, 0x0000, 0},//CGU_PERIPHERAL_TIMER3,
Pawel Zarembski 0:01f31e923fe2 151 {CGU_BASE_M4, 0x1508, CGU_BASE_UART0, 0x2500, 0},//CGU_PERIPHERAL_UART0,
Pawel Zarembski 0:01f31e923fe2 152 {CGU_BASE_M4, 0x1510, CGU_BASE_UART1, 0x2400, 0},//CGU_PERIPHERAL_UART1,
Pawel Zarembski 0:01f31e923fe2 153 {CGU_BASE_M4, 0x1608, CGU_BASE_UART2, 0x2300, 0},//CGU_PERIPHERAL_UART2,
Pawel Zarembski 0:01f31e923fe2 154 {CGU_BASE_M4, 0x1610, CGU_BASE_UART3, 0x2200, 0},//CGU_PERIPHERAL_UART3,
Pawel Zarembski 0:01f31e923fe2 155 {CGU_BASE_M4, 0x1428, CGU_BASE_USB0, 0x1800, 0},//CGU_PERIPHERAL_USB0,
Pawel Zarembski 0:01f31e923fe2 156 {CGU_BASE_M4, 0x1470, CGU_BASE_USB1, 0x1900, 0},//CGU_PERIPHERAL_USB1,
Pawel Zarembski 0:01f31e923fe2 157 {CGU_BASE_M4, 0x1500, CGU_BASE_SAFE, 0x0000, 0},//CGU_PERIPHERAL_WWDT,
Pawel Zarembski 0:01f31e923fe2 158 };
Pawel Zarembski 0:01f31e923fe2 159
Pawel Zarembski 0:01f31e923fe2 160 uint32_t CGU_ClockSourceFrequency[CGU_CLKSRC_NUM] = {0, 12000000, 0, 0, 0, 0, 0, 480000000, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Pawel Zarembski 0:01f31e923fe2 161
Pawel Zarembski 0:01f31e923fe2 162 #define CGU_CGU_ADDR ((uint32_t)LPC_CGU)
Pawel Zarembski 0:01f31e923fe2 163 #define CGU_REG_BASE_CTRL(x) (*(uint32_t*)(CGU_CGU_ADDR+CGU_Entity_ControlReg_Offset[CGU_PERIPHERAL_Info[x].RegBaseEntity]))
Pawel Zarembski 0:01f31e923fe2 164 #define CGU_REG_BRANCH_CTRL(x) (*(uint32_t*)(CGU_CGU_ADDR+CGU_PERIPHERAL_Info[x].RegBranchOffset))
Pawel Zarembski 0:01f31e923fe2 165 #define CGU_REG_BRANCH_STATUS(x) (*(volatile uint32_t*)(CGU_CGU_ADDR+CGU_PERIPHERAL_Info[x].RegBranchOffset+4))
Pawel Zarembski 0:01f31e923fe2 166
Pawel Zarembski 0:01f31e923fe2 167 #define CGU_PER_BASE_CTRL(x) (*(uint32_t*)(CGU_CGU_ADDR+CGU_Entity_ControlReg_Offset[CGU_PERIPHERAL_Info[x].PerBaseEntity]))
Pawel Zarembski 0:01f31e923fe2 168 #define CGU_PER_BRANCH_CTRL(x) (*(uint32_t*)(CGU_CGU_ADDR+CGU_PERIPHERAL_Info[x].PerBranchOffset))
Pawel Zarembski 0:01f31e923fe2 169 #define CGU_PER_BRANCH_STATUS(x) (*(volatile uint32_t*)(CGU_CGU_ADDR+CGU_PERIPHERAL_Info[x].PerBranchOffset+4))
Pawel Zarembski 0:01f31e923fe2 170
Pawel Zarembski 0:01f31e923fe2 171 /**************************************************************************//**
Pawel Zarembski 0:01f31e923fe2 172 *
Pawel Zarembski 0:01f31e923fe2 173 * @brief Rough approximation of a delay function with microsecond resolution.
Pawel Zarembski 0:01f31e923fe2 174 *
Pawel Zarembski 0:01f31e923fe2 175 * Used during initial clock setup as the Timers are not configured yet.
Pawel Zarembski 0:01f31e923fe2 176 *
Pawel Zarembski 0:01f31e923fe2 177 * @param [in] us The number of microseconds to wait
Pawel Zarembski 0:01f31e923fe2 178 *
Pawel Zarembski 0:01f31e923fe2 179 *****************************************************************************/
Pawel Zarembski 0:01f31e923fe2 180 static void cgu_WaitUS(volatile uint32_t us)
Pawel Zarembski 0:01f31e923fe2 181 {
Pawel Zarembski 0:01f31e923fe2 182 us *= (SystemCoreClock / 1000000) / 3;
Pawel Zarembski 0:01f31e923fe2 183
Pawel Zarembski 0:01f31e923fe2 184 while (us--);
Pawel Zarembski 0:01f31e923fe2 185 }
Pawel Zarembski 0:01f31e923fe2 186
Pawel Zarembski 0:01f31e923fe2 187 /**************************************************************************//**
Pawel Zarembski 0:01f31e923fe2 188 *
Pawel Zarembski 0:01f31e923fe2 189 * @brief Simple lookup of best MSEL and NSEL values for wanted frequency
Pawel Zarembski 0:01f31e923fe2 190 *
Pawel Zarembski 0:01f31e923fe2 191 * Not optimized.
Pawel Zarembski 0:01f31e923fe2 192 *
Pawel Zarembski 0:01f31e923fe2 193 * @param [in] wantedFreq The wanted PLL1 frequency
Pawel Zarembski 0:01f31e923fe2 194 * @param [out] pMsel The best MSEL value for the PLL1_CTRL register
Pawel Zarembski 0:01f31e923fe2 195 * @param [out] pNsel The best NSEL value for the PLL1_CTRL register
Pawel Zarembski 0:01f31e923fe2 196 *
Pawel Zarembski 0:01f31e923fe2 197 *****************************************************************************/
Pawel Zarembski 0:01f31e923fe2 198 static void cgu_findMN(uint32_t wantedFreq, uint32_t *pMsel, uint32_t *pNsel)
Pawel Zarembski 0:01f31e923fe2 199 {
Pawel Zarembski 0:01f31e923fe2 200 uint32_t besterr = wantedFreq;
Pawel Zarembski 0:01f31e923fe2 201 uint32_t m, n, f, tmp, err;
Pawel Zarembski 0:01f31e923fe2 202 #define ABSDIFF(__a, __b) ( ((__a) < (__b)) ? ((__b) - (__a)) : ((__a) - (__b)) )
Pawel Zarembski 0:01f31e923fe2 203
Pawel Zarembski 0:01f31e923fe2 204 for (n = 1; n <= 4; n++) {
Pawel Zarembski 0:01f31e923fe2 205 f = 12000000 / n;
Pawel Zarembski 0:01f31e923fe2 206 tmp = 0;
Pawel Zarembski 0:01f31e923fe2 207
Pawel Zarembski 0:01f31e923fe2 208 for (m = 1; m <= 256; m++) {
Pawel Zarembski 0:01f31e923fe2 209 tmp += f;
Pawel Zarembski 0:01f31e923fe2 210 err = ABSDIFF(tmp, wantedFreq);
Pawel Zarembski 0:01f31e923fe2 211
Pawel Zarembski 0:01f31e923fe2 212 if (err == 0) {
Pawel Zarembski 0:01f31e923fe2 213 // found perfect match
Pawel Zarembski 0:01f31e923fe2 214 *pMsel = m - 1;
Pawel Zarembski 0:01f31e923fe2 215 *pNsel = n - 1;
Pawel Zarembski 0:01f31e923fe2 216 return;
Pawel Zarembski 0:01f31e923fe2 217
Pawel Zarembski 0:01f31e923fe2 218 } else if (err < besterr) {
Pawel Zarembski 0:01f31e923fe2 219 *pMsel = m - 1;
Pawel Zarembski 0:01f31e923fe2 220 *pNsel = n - 1;
Pawel Zarembski 0:01f31e923fe2 221 besterr = err;
Pawel Zarembski 0:01f31e923fe2 222 }
Pawel Zarembski 0:01f31e923fe2 223
Pawel Zarembski 0:01f31e923fe2 224 if (tmp > wantedFreq) {
Pawel Zarembski 0:01f31e923fe2 225 // no point in continuing to increase tmp as value is too high already
Pawel Zarembski 0:01f31e923fe2 226 break;
Pawel Zarembski 0:01f31e923fe2 227 }
Pawel Zarembski 0:01f31e923fe2 228 }
Pawel Zarembski 0:01f31e923fe2 229 }
Pawel Zarembski 0:01f31e923fe2 230 }
Pawel Zarembski 0:01f31e923fe2 231
Pawel Zarembski 0:01f31e923fe2 232 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 233 * @brief Initialize default clock for LPC4300 Eval board
Pawel Zarembski 0:01f31e923fe2 234 * @param[in] None
Pawel Zarembski 0:01f31e923fe2 235 * @return Initialize status, could be:
Pawel Zarembski 0:01f31e923fe2 236 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 237 * - Other: error
Pawel Zarembski 0:01f31e923fe2 238 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 239 uint32_t CGU_Init(uint32_t wantedFreq)
Pawel Zarembski 0:01f31e923fe2 240 {
Pawel Zarembski 0:01f31e923fe2 241 uint32_t msel = 0;
Pawel Zarembski 0:01f31e923fe2 242 uint32_t nsel = 0;
Pawel Zarembski 0:01f31e923fe2 243 uint32_t tmp;
Pawel Zarembski 0:01f31e923fe2 244 // Setup PLL1 to 204MHz
Pawel Zarembski 0:01f31e923fe2 245 // 0. Select IRC as BASE_M4_CLK source
Pawel Zarembski 0:01f31e923fe2 246 CGU_EntityConnect(CGU_CLKSRC_IRC, CGU_BASE_M4);
Pawel Zarembski 0:01f31e923fe2 247 SystemCoreClock = 96000000;
Pawel Zarembski 0:01f31e923fe2 248 // 1. Enable the crystal oscillator
Pawel Zarembski 0:01f31e923fe2 249 CGU_SetXTALOSC(12000000);
Pawel Zarembski 0:01f31e923fe2 250 CGU_EnableEntity(CGU_CLKSRC_XTAL_OSC, ENABLE);
Pawel Zarembski 0:01f31e923fe2 251 // 2. Wait 250us
Pawel Zarembski 0:01f31e923fe2 252 cgu_WaitUS(250);
Pawel Zarembski 0:01f31e923fe2 253 // 3. Reconfigure PLL1 as follows:
Pawel Zarembski 0:01f31e923fe2 254 // - Select the M and N divider values to produce the final desired
Pawel Zarembski 0:01f31e923fe2 255 // PLL1 output frequency (204MHz => M=17,N=1 => msel=16,nsel=0)
Pawel Zarembski 0:01f31e923fe2 256 // - Select the crystal oscillator as clock source for PLL1
Pawel Zarembski 0:01f31e923fe2 257 cgu_findMN(wantedFreq, &msel, &nsel);
Pawel Zarembski 0:01f31e923fe2 258 tmp = LPC_CGU->PLL1_CTRL & ~((0xFF << 16) | (0x03 << 12));
Pawel Zarembski 0:01f31e923fe2 259 LPC_CGU->PLL1_CTRL = tmp | (msel << 16) | (nsel << 12);
Pawel Zarembski 0:01f31e923fe2 260 CGU_EntityConnect(CGU_CLKSRC_XTAL_OSC, CGU_CLKSRC_PLL1);
Pawel Zarembski 0:01f31e923fe2 261
Pawel Zarembski 0:01f31e923fe2 262 // 4. Wait for the PLL1 to lock
Pawel Zarembski 0:01f31e923fe2 263 while ((LPC_CGU->PLL1_STAT & 1) == 0x0);
Pawel Zarembski 0:01f31e923fe2 264
Pawel Zarembski 0:01f31e923fe2 265 // 5. Set PLL1 P-divider to divide by 2 (DIRECT=0 and PSEL=0)
Pawel Zarembski 0:01f31e923fe2 266 LPC_CGU->PLL1_CTRL &= ~((0x03 << 8) | CGU_PLL1_DIRECT_MASK);
Pawel Zarembski 0:01f31e923fe2 267 // 6. Select PLL1 as BASE_M4_CLK source. The BASE_M4_CLK now operates at
Pawel Zarembski 0:01f31e923fe2 268 // the mid frequency range
Pawel Zarembski 0:01f31e923fe2 269 CGU_EntityConnect(CGU_CLKSRC_PLL1, CGU_BASE_M4);
Pawel Zarembski 0:01f31e923fe2 270 SystemCoreClock = (12000000 * (msel + 1)) / ((nsel + 1) * 2);
Pawel Zarembski 0:01f31e923fe2 271 // 7. Wait 20us
Pawel Zarembski 0:01f31e923fe2 272 cgu_WaitUS(20);
Pawel Zarembski 0:01f31e923fe2 273 // 8. Set PLL P-divider to direct output mode (DIRECT=1)
Pawel Zarembski 0:01f31e923fe2 274 LPC_CGU->PLL1_CTRL |= CGU_PLL1_DIRECT_MASK;
Pawel Zarembski 0:01f31e923fe2 275 // The BASE_M4_CLK now operates in the high frequency range
Pawel Zarembski 0:01f31e923fe2 276 CGU_UpdateClock();
Pawel Zarembski 0:01f31e923fe2 277 SystemCoreClock = (12000000 * (msel + 1)) / (nsel + 1);
Pawel Zarembski 0:01f31e923fe2 278 return 0;
Pawel Zarembski 0:01f31e923fe2 279 }
Pawel Zarembski 0:01f31e923fe2 280
Pawel Zarembski 0:01f31e923fe2 281 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 282 * @brief Configure power for individual peripheral
Pawel Zarembski 0:01f31e923fe2 283 * @param[in] PPType peripheral type, should be:
Pawel Zarembski 0:01f31e923fe2 284 * - CGU_PERIPHERAL_ADC0 :ADC0
Pawel Zarembski 0:01f31e923fe2 285 * - CGU_PERIPHERAL_ADC1 :ADC1
Pawel Zarembski 0:01f31e923fe2 286 * - CGU_PERIPHERAL_AES :AES
Pawel Zarembski 0:01f31e923fe2 287 * - CGU_PERIPHERAL_APB1_BUS :APB1 bus
Pawel Zarembski 0:01f31e923fe2 288 * - CGU_PERIPHERAL_APB3_BUS :APB3 bus
Pawel Zarembski 0:01f31e923fe2 289 * - CGU_PERIPHERAL_CAN :CAN
Pawel Zarembski 0:01f31e923fe2 290 * - CGU_PERIPHERAL_CREG :CREG
Pawel Zarembski 0:01f31e923fe2 291 * - CGU_PERIPHERAL_DAC :DAC
Pawel Zarembski 0:01f31e923fe2 292 * - CGU_PERIPHERAL_DMA :DMA
Pawel Zarembski 0:01f31e923fe2 293 * - CGU_PERIPHERAL_EMC :EMC
Pawel Zarembski 0:01f31e923fe2 294 * - CGU_PERIPHERAL_ETHERNET :ETHERNET
Pawel Zarembski 0:01f31e923fe2 295 * - CGU_PERIPHERAL_GPIO :GPIO
Pawel Zarembski 0:01f31e923fe2 296 * - CGU_PERIPHERAL_I2C0 :I2C0
Pawel Zarembski 0:01f31e923fe2 297 * - CGU_PERIPHERAL_I2C1 :I2C1
Pawel Zarembski 0:01f31e923fe2 298 * - CGU_PERIPHERAL_I2S :I2S
Pawel Zarembski 0:01f31e923fe2 299 * - CGU_PERIPHERAL_LCD :LCD
Pawel Zarembski 0:01f31e923fe2 300 * - CGU_PERIPHERAL_M3CORE :M3 core
Pawel Zarembski 0:01f31e923fe2 301 * - CGU_PERIPHERAL_M3_BUS :M3 bus
Pawel Zarembski 0:01f31e923fe2 302 * - CGU_PERIPHERAL_MOTOCON :Motor control
Pawel Zarembski 0:01f31e923fe2 303 * - CGU_PERIPHERAL_QEI :QEI
Pawel Zarembski 0:01f31e923fe2 304 * - CGU_PERIPHERAL_RITIMER :RIT timer
Pawel Zarembski 0:01f31e923fe2 305 * - CGU_PERIPHERAL_SCT :SCT
Pawel Zarembski 0:01f31e923fe2 306 * - CGU_PERIPHERAL_SCU :SCU
Pawel Zarembski 0:01f31e923fe2 307 * - CGU_PERIPHERAL_SDIO :SDIO
Pawel Zarembski 0:01f31e923fe2 308 * - CGU_PERIPHERAL_SPIFI :SPIFI
Pawel Zarembski 0:01f31e923fe2 309 * - CGU_PERIPHERAL_SSP0 :SSP0
Pawel Zarembski 0:01f31e923fe2 310 * - CGU_PERIPHERAL_SSP1 :SSP1
Pawel Zarembski 0:01f31e923fe2 311 * - CGU_PERIPHERAL_TIMER0 :TIMER0
Pawel Zarembski 0:01f31e923fe2 312 * - CGU_PERIPHERAL_TIMER1 :TIMER1
Pawel Zarembski 0:01f31e923fe2 313 * - CGU_PERIPHERAL_TIMER2 :TIMER2
Pawel Zarembski 0:01f31e923fe2 314 * - CGU_PERIPHERAL_TIMER3 :TIMER3
Pawel Zarembski 0:01f31e923fe2 315 * - CGU_PERIPHERAL_UART0 :UART0
Pawel Zarembski 0:01f31e923fe2 316 * - CGU_PERIPHERAL_UART1 :UART1
Pawel Zarembski 0:01f31e923fe2 317 * - CGU_PERIPHERAL_UART2 :UART2
Pawel Zarembski 0:01f31e923fe2 318 * - CGU_PERIPHERAL_UART3 :UART3
Pawel Zarembski 0:01f31e923fe2 319 * - CGU_PERIPHERAL_USB0 :USB0
Pawel Zarembski 0:01f31e923fe2 320 * - CGU_PERIPHERAL_USB1 :USB1
Pawel Zarembski 0:01f31e923fe2 321 * - CGU_PERIPHERAL_WWDT :WWDT
Pawel Zarembski 0:01f31e923fe2 322 * @param[in] en status, should be:
Pawel Zarembski 0:01f31e923fe2 323 * - ENABLE: Enable power
Pawel Zarembski 0:01f31e923fe2 324 * - DISABLE: Disable power
Pawel Zarembski 0:01f31e923fe2 325 * @return Configure status, could be:
Pawel Zarembski 0:01f31e923fe2 326 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 327 * - Other: error
Pawel Zarembski 0:01f31e923fe2 328 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 329 uint32_t CGU_ConfigPWR(CGU_PERIPHERAL_T PPType, FunctionalState en)
Pawel Zarembski 0:01f31e923fe2 330 {
Pawel Zarembski 0:01f31e923fe2 331 if (PPType >= CGU_PERIPHERAL_WWDT && PPType <= CGU_PERIPHERAL_ADC0) {
Pawel Zarembski 0:01f31e923fe2 332 return CGU_ERROR_INVALID_PARAM;
Pawel Zarembski 0:01f31e923fe2 333 }
Pawel Zarembski 0:01f31e923fe2 334
Pawel Zarembski 0:01f31e923fe2 335 if (en == DISABLE) { /* Going to disable clock */
Pawel Zarembski 0:01f31e923fe2 336 /*Get Reg branch status */
Pawel Zarembski 0:01f31e923fe2 337 if (CGU_PERIPHERAL_Info[PPType].RegBranchOffset != 0 &&
Pawel Zarembski 0:01f31e923fe2 338 CGU_REG_BRANCH_STATUS(PPType) & 1) {
Pawel Zarembski 0:01f31e923fe2 339 CGU_REG_BRANCH_CTRL(PPType) &= ~1; /* Disable branch clock */
Pawel Zarembski 0:01f31e923fe2 340
Pawel Zarembski 0:01f31e923fe2 341 while (CGU_REG_BRANCH_STATUS(PPType) & 1);
Pawel Zarembski 0:01f31e923fe2 342 }
Pawel Zarembski 0:01f31e923fe2 343
Pawel Zarembski 0:01f31e923fe2 344 /* GetBase Status*/
Pawel Zarembski 0:01f31e923fe2 345 if ((CGU_PERIPHERAL_Info[PPType].RegBaseEntity != CGU_ENTITY_NONE) &&
Pawel Zarembski 0:01f31e923fe2 346 CGU_GetBaseStatus((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].RegBaseEntity) == 0) {
Pawel Zarembski 0:01f31e923fe2 347 /* Disable Base */
Pawel Zarembski 0:01f31e923fe2 348 CGU_EnableEntity((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].RegBaseEntity, 0);
Pawel Zarembski 0:01f31e923fe2 349 }
Pawel Zarembski 0:01f31e923fe2 350
Pawel Zarembski 0:01f31e923fe2 351 /* Same for Peripheral */
Pawel Zarembski 0:01f31e923fe2 352 if ((CGU_PERIPHERAL_Info[PPType].PerBranchOffset != 0) && (CGU_PER_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK)) {
Pawel Zarembski 0:01f31e923fe2 353 CGU_PER_BRANCH_CTRL(PPType) &= ~1; /* Disable branch clock */
Pawel Zarembski 0:01f31e923fe2 354
Pawel Zarembski 0:01f31e923fe2 355 while (CGU_PER_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK);
Pawel Zarembski 0:01f31e923fe2 356 }
Pawel Zarembski 0:01f31e923fe2 357
Pawel Zarembski 0:01f31e923fe2 358 /* GetBase Status*/
Pawel Zarembski 0:01f31e923fe2 359 if ((CGU_PERIPHERAL_Info[PPType].PerBaseEntity != CGU_ENTITY_NONE) &&
Pawel Zarembski 0:01f31e923fe2 360 CGU_GetBaseStatus((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].PerBaseEntity) == 0) {
Pawel Zarembski 0:01f31e923fe2 361 /* Disable Base */
Pawel Zarembski 0:01f31e923fe2 362 CGU_EnableEntity((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].PerBaseEntity, 0);
Pawel Zarembski 0:01f31e923fe2 363 }
Pawel Zarembski 0:01f31e923fe2 364
Pawel Zarembski 0:01f31e923fe2 365 } else {
Pawel Zarembski 0:01f31e923fe2 366 /* enable */
Pawel Zarembski 0:01f31e923fe2 367 /* GetBase Status*/
Pawel Zarembski 0:01f31e923fe2 368 if ((CGU_PERIPHERAL_Info[PPType].RegBaseEntity != CGU_ENTITY_NONE) && CGU_REG_BASE_CTRL(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK) {
Pawel Zarembski 0:01f31e923fe2 369 /* Enable Base */
Pawel Zarembski 0:01f31e923fe2 370 CGU_EnableEntity((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].RegBaseEntity, 1);
Pawel Zarembski 0:01f31e923fe2 371 }
Pawel Zarembski 0:01f31e923fe2 372
Pawel Zarembski 0:01f31e923fe2 373 /*Get Reg branch status */
Pawel Zarembski 0:01f31e923fe2 374 if ((CGU_PERIPHERAL_Info[PPType].RegBranchOffset != 0) && !(CGU_REG_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK)) {
Pawel Zarembski 0:01f31e923fe2 375 CGU_REG_BRANCH_CTRL(PPType) |= 1; /* Enable branch clock */
Pawel Zarembski 0:01f31e923fe2 376
Pawel Zarembski 0:01f31e923fe2 377 while (!(CGU_REG_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK));
Pawel Zarembski 0:01f31e923fe2 378 }
Pawel Zarembski 0:01f31e923fe2 379
Pawel Zarembski 0:01f31e923fe2 380 /* Same for Peripheral */
Pawel Zarembski 0:01f31e923fe2 381 /* GetBase Status*/
Pawel Zarembski 0:01f31e923fe2 382 if ((CGU_PERIPHERAL_Info[PPType].PerBaseEntity != CGU_ENTITY_NONE) &&
Pawel Zarembski 0:01f31e923fe2 383 (CGU_PER_BASE_CTRL(PPType) & 1)) {
Pawel Zarembski 0:01f31e923fe2 384 /* Enable Base */
Pawel Zarembski 0:01f31e923fe2 385 CGU_EnableEntity((CGU_ENTITY_T)CGU_PERIPHERAL_Info[PPType].PerBaseEntity, 1);
Pawel Zarembski 0:01f31e923fe2 386 }
Pawel Zarembski 0:01f31e923fe2 387
Pawel Zarembski 0:01f31e923fe2 388 /*Get Reg branch status */
Pawel Zarembski 0:01f31e923fe2 389 if ((CGU_PERIPHERAL_Info[PPType].PerBranchOffset != 0) && !(CGU_PER_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK)) {
Pawel Zarembski 0:01f31e923fe2 390 CGU_PER_BRANCH_CTRL(PPType) |= 1; /* Enable branch clock */
Pawel Zarembski 0:01f31e923fe2 391
Pawel Zarembski 0:01f31e923fe2 392 while (!(CGU_PER_BRANCH_STATUS(PPType) & CGU_BRANCH_STATUS_ENABLE_MASK));
Pawel Zarembski 0:01f31e923fe2 393 }
Pawel Zarembski 0:01f31e923fe2 394 }
Pawel Zarembski 0:01f31e923fe2 395
Pawel Zarembski 0:01f31e923fe2 396 if (CGU_PERIPHERAL_Info[PPType].next) {
Pawel Zarembski 0:01f31e923fe2 397 return CGU_ConfigPWR((CGU_PERIPHERAL_T)CGU_PERIPHERAL_Info[PPType].next, en);
Pawel Zarembski 0:01f31e923fe2 398 }
Pawel Zarembski 0:01f31e923fe2 399
Pawel Zarembski 0:01f31e923fe2 400 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 401 }
Pawel Zarembski 0:01f31e923fe2 402
Pawel Zarembski 0:01f31e923fe2 403
Pawel Zarembski 0:01f31e923fe2 404 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 405 * @brief Get peripheral clock frequency
Pawel Zarembski 0:01f31e923fe2 406 * @param[in] Clock Peripheral type, should be:
Pawel Zarembski 0:01f31e923fe2 407 * - CGU_PERIPHERAL_ADC0 :ADC0
Pawel Zarembski 0:01f31e923fe2 408 * - CGU_PERIPHERAL_ADC1 :ADC1
Pawel Zarembski 0:01f31e923fe2 409 * - CGU_PERIPHERAL_AES :AES
Pawel Zarembski 0:01f31e923fe2 410 * - CGU_PERIPHERAL_APB1_BUS :APB1 bus
Pawel Zarembski 0:01f31e923fe2 411 * - CGU_PERIPHERAL_APB3_BUS :APB3 bus
Pawel Zarembski 0:01f31e923fe2 412 * - CGU_PERIPHERAL_CAN :CAN
Pawel Zarembski 0:01f31e923fe2 413 * - CGU_PERIPHERAL_CREG :CREG
Pawel Zarembski 0:01f31e923fe2 414 * - CGU_PERIPHERAL_DAC :DAC
Pawel Zarembski 0:01f31e923fe2 415 * - CGU_PERIPHERAL_DMA :DMA
Pawel Zarembski 0:01f31e923fe2 416 * - CGU_PERIPHERAL_EMC :EMC
Pawel Zarembski 0:01f31e923fe2 417 * - CGU_PERIPHERAL_ETHERNET :ETHERNET
Pawel Zarembski 0:01f31e923fe2 418 * - CGU_PERIPHERAL_GPIO :GPIO
Pawel Zarembski 0:01f31e923fe2 419 * - CGU_PERIPHERAL_I2C0 :I2C0
Pawel Zarembski 0:01f31e923fe2 420 * - CGU_PERIPHERAL_I2C1 :I2C1
Pawel Zarembski 0:01f31e923fe2 421 * - CGU_PERIPHERAL_I2S :I2S
Pawel Zarembski 0:01f31e923fe2 422 * - CGU_PERIPHERAL_LCD :LCD
Pawel Zarembski 0:01f31e923fe2 423 * - CGU_PERIPHERAL_M3CORE :M3 core
Pawel Zarembski 0:01f31e923fe2 424 * - CGU_PERIPHERAL_M3_BUS :M3 bus
Pawel Zarembski 0:01f31e923fe2 425 * - CGU_PERIPHERAL_MOTOCON :Motor control
Pawel Zarembski 0:01f31e923fe2 426 * - CGU_PERIPHERAL_QEI :QEI
Pawel Zarembski 0:01f31e923fe2 427 * - CGU_PERIPHERAL_RITIMER :RIT timer
Pawel Zarembski 0:01f31e923fe2 428 * - CGU_PERIPHERAL_SCT :SCT
Pawel Zarembski 0:01f31e923fe2 429 * - CGU_PERIPHERAL_SCU :SCU
Pawel Zarembski 0:01f31e923fe2 430 * - CGU_PERIPHERAL_SDIO :SDIO
Pawel Zarembski 0:01f31e923fe2 431 * - CGU_PERIPHERAL_SPIFI :SPIFI
Pawel Zarembski 0:01f31e923fe2 432 * - CGU_PERIPHERAL_SSP0 :SSP0
Pawel Zarembski 0:01f31e923fe2 433 * - CGU_PERIPHERAL_SSP1 :SSP1
Pawel Zarembski 0:01f31e923fe2 434 * - CGU_PERIPHERAL_TIMER0 :TIMER0
Pawel Zarembski 0:01f31e923fe2 435 * - CGU_PERIPHERAL_TIMER1 :TIMER1
Pawel Zarembski 0:01f31e923fe2 436 * - CGU_PERIPHERAL_TIMER2 :TIMER2
Pawel Zarembski 0:01f31e923fe2 437 * - CGU_PERIPHERAL_TIMER3 :TIMER3
Pawel Zarembski 0:01f31e923fe2 438 * - CGU_PERIPHERAL_UART0 :UART0
Pawel Zarembski 0:01f31e923fe2 439 * - CGU_PERIPHERAL_UART1 :UART1
Pawel Zarembski 0:01f31e923fe2 440 * - CGU_PERIPHERAL_UART2 :UART2
Pawel Zarembski 0:01f31e923fe2 441 * - CGU_PERIPHERAL_UART3 :UART3
Pawel Zarembski 0:01f31e923fe2 442 * - CGU_PERIPHERAL_USB0 :USB0
Pawel Zarembski 0:01f31e923fe2 443 * - CGU_PERIPHERAL_USB1 :USB1
Pawel Zarembski 0:01f31e923fe2 444 * - CGU_PERIPHERAL_WWDT :WWDT
Pawel Zarembski 0:01f31e923fe2 445 * @return Return frequently value
Pawel Zarembski 0:01f31e923fe2 446 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 447 uint32_t CGU_GetPCLKFrequency(CGU_PERIPHERAL_T Clock)
Pawel Zarembski 0:01f31e923fe2 448 {
Pawel Zarembski 0:01f31e923fe2 449 uint32_t ClkSrc;
Pawel Zarembski 0:01f31e923fe2 450
Pawel Zarembski 0:01f31e923fe2 451 if (Clock >= CGU_PERIPHERAL_WWDT && Clock <= CGU_PERIPHERAL_ADC0) {
Pawel Zarembski 0:01f31e923fe2 452 return CGU_ERROR_INVALID_PARAM;
Pawel Zarembski 0:01f31e923fe2 453 }
Pawel Zarembski 0:01f31e923fe2 454
Pawel Zarembski 0:01f31e923fe2 455 if (CGU_PERIPHERAL_Info[Clock].PerBaseEntity != CGU_ENTITY_NONE) {
Pawel Zarembski 0:01f31e923fe2 456 /* Get Base Clock Source */
Pawel Zarembski 0:01f31e923fe2 457 ClkSrc = (CGU_PER_BASE_CTRL(Clock) & CGU_CTRL_SRC_MASK) >> 24;
Pawel Zarembski 0:01f31e923fe2 458
Pawel Zarembski 0:01f31e923fe2 459 /* GetBase Status*/
Pawel Zarembski 0:01f31e923fe2 460 if (CGU_PER_BASE_CTRL(Clock) & 1) {
Pawel Zarembski 0:01f31e923fe2 461 return 0;
Pawel Zarembski 0:01f31e923fe2 462 }
Pawel Zarembski 0:01f31e923fe2 463
Pawel Zarembski 0:01f31e923fe2 464 /* check Branch if it is enabled */
Pawel Zarembski 0:01f31e923fe2 465 if ((CGU_PERIPHERAL_Info[Clock].PerBranchOffset != 0) && !(CGU_PER_BRANCH_STATUS(Clock) & CGU_BRANCH_STATUS_ENABLE_MASK)) {
Pawel Zarembski 0:01f31e923fe2 466 return 0;
Pawel Zarembski 0:01f31e923fe2 467 }
Pawel Zarembski 0:01f31e923fe2 468
Pawel Zarembski 0:01f31e923fe2 469 } else {
Pawel Zarembski 0:01f31e923fe2 470 if (CGU_REG_BASE_CTRL(Clock) & 1) {
Pawel Zarembski 0:01f31e923fe2 471 return 0;
Pawel Zarembski 0:01f31e923fe2 472 }
Pawel Zarembski 0:01f31e923fe2 473
Pawel Zarembski 0:01f31e923fe2 474 ClkSrc = (CGU_REG_BASE_CTRL(Clock) & CGU_CTRL_SRC_MASK) >> 24;
Pawel Zarembski 0:01f31e923fe2 475
Pawel Zarembski 0:01f31e923fe2 476 /* check Branch if it is enabled */
Pawel Zarembski 0:01f31e923fe2 477 if ((CGU_PERIPHERAL_Info[Clock].RegBranchOffset != 0) && !(CGU_REG_BRANCH_STATUS(Clock) & CGU_BRANCH_STATUS_ENABLE_MASK)) {
Pawel Zarembski 0:01f31e923fe2 478 return 0;
Pawel Zarembski 0:01f31e923fe2 479 }
Pawel Zarembski 0:01f31e923fe2 480 }
Pawel Zarembski 0:01f31e923fe2 481
Pawel Zarembski 0:01f31e923fe2 482 return CGU_ClockSourceFrequency[ClkSrc];
Pawel Zarembski 0:01f31e923fe2 483 }
Pawel Zarembski 0:01f31e923fe2 484
Pawel Zarembski 0:01f31e923fe2 485
Pawel Zarembski 0:01f31e923fe2 486 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 487 * @brief Update clock
Pawel Zarembski 0:01f31e923fe2 488 * @param[in] None
Pawel Zarembski 0:01f31e923fe2 489 * @return None
Pawel Zarembski 0:01f31e923fe2 490 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 491 void CGU_UpdateClock(void)
Pawel Zarembski 0:01f31e923fe2 492 {
Pawel Zarembski 0:01f31e923fe2 493 uint32_t ClkSrc;
Pawel Zarembski 0:01f31e923fe2 494 uint32_t div;
Pawel Zarembski 0:01f31e923fe2 495 uint32_t divisor;
Pawel Zarembski 0:01f31e923fe2 496 int32_t RegOffset;
Pawel Zarembski 0:01f31e923fe2 497
Pawel Zarembski 0:01f31e923fe2 498 /* 32OSC */
Pawel Zarembski 0:01f31e923fe2 499 if (ISBITSET(LPC_CREG->CREG0, 1) && ISBITCLR(LPC_CREG->CREG0, 3)) {
Pawel Zarembski 0:01f31e923fe2 500 CGU_ClockSourceFrequency[CGU_CLKSRC_32KHZ_OSC] = 32768;
Pawel Zarembski 0:01f31e923fe2 501
Pawel Zarembski 0:01f31e923fe2 502 } else {
Pawel Zarembski 0:01f31e923fe2 503 CGU_ClockSourceFrequency[CGU_CLKSRC_32KHZ_OSC] = 0;
Pawel Zarembski 0:01f31e923fe2 504 }
Pawel Zarembski 0:01f31e923fe2 505
Pawel Zarembski 0:01f31e923fe2 506 /*PLL0*/
Pawel Zarembski 0:01f31e923fe2 507 /* PLL1 */
Pawel Zarembski 0:01f31e923fe2 508 if (ISBITCLR(LPC_CGU->PLL1_CTRL, 0) /* Enabled */ /* EA ANDLI: Original code tested bit 1 which is BYPASS, not PD */
Pawel Zarembski 0:01f31e923fe2 509 && (LPC_CGU->PLL1_STAT & 1)) { /* Locked? */
Pawel Zarembski 0:01f31e923fe2 510 ClkSrc = (LPC_CGU->PLL1_CTRL & CGU_CTRL_SRC_MASK) >> 24;
Pawel Zarembski 0:01f31e923fe2 511 CGU_ClockSourceFrequency[CGU_CLKSRC_PLL1] = CGU_ClockSourceFrequency[ClkSrc] *
Pawel Zarembski 0:01f31e923fe2 512 (((LPC_CGU->PLL1_CTRL >> 16) & 0xFF) + 1);
Pawel Zarembski 0:01f31e923fe2 513
Pawel Zarembski 0:01f31e923fe2 514 } else {
Pawel Zarembski 0:01f31e923fe2 515 CGU_ClockSourceFrequency[CGU_CLKSRC_PLL1] = 0;
Pawel Zarembski 0:01f31e923fe2 516 }
Pawel Zarembski 0:01f31e923fe2 517
Pawel Zarembski 0:01f31e923fe2 518 /* DIV */
Pawel Zarembski 0:01f31e923fe2 519 for (div = CGU_CLKSRC_IDIVA; div <= CGU_CLKSRC_IDIVE; div++) {
Pawel Zarembski 0:01f31e923fe2 520 RegOffset = CGU_Entity_ControlReg_Offset[div];
Pawel Zarembski 0:01f31e923fe2 521
Pawel Zarembski 0:01f31e923fe2 522 if (ISBITCLR(CGU_ADDRESS32(LPC_CGU, RegOffset), 1)) {
Pawel Zarembski 0:01f31e923fe2 523 ClkSrc = (CGU_ADDRESS32(LPC_CGU, RegOffset) & CGU_CTRL_SRC_MASK) >> 24;
Pawel Zarembski 0:01f31e923fe2 524 divisor = (CGU_ADDRESS32(LPC_CGU, RegOffset) >> 2) & 0xFF;
Pawel Zarembski 0:01f31e923fe2 525 divisor ++;
Pawel Zarembski 0:01f31e923fe2 526 CGU_ClockSourceFrequency[div] = CGU_ClockSourceFrequency[ClkSrc] / divisor;
Pawel Zarembski 0:01f31e923fe2 527
Pawel Zarembski 0:01f31e923fe2 528 } else {
Pawel Zarembski 0:01f31e923fe2 529 CGU_ClockSourceFrequency[div] = 0;
Pawel Zarembski 0:01f31e923fe2 530 }
Pawel Zarembski 0:01f31e923fe2 531 }
Pawel Zarembski 0:01f31e923fe2 532 }
Pawel Zarembski 0:01f31e923fe2 533
Pawel Zarembski 0:01f31e923fe2 534 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 535 * @brief Set XTAL oscillator value
Pawel Zarembski 0:01f31e923fe2 536 * @param[in] ClockFrequency XTAL Frequency value
Pawel Zarembski 0:01f31e923fe2 537 * @return Setting status, could be:
Pawel Zarembski 0:01f31e923fe2 538 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 539 * - CGU_ERROR_FREQ_OUTOF_RANGE: XTAL value set is out of range
Pawel Zarembski 0:01f31e923fe2 540 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 541 uint32_t CGU_SetXTALOSC(uint32_t ClockFrequency)
Pawel Zarembski 0:01f31e923fe2 542 {
Pawel Zarembski 0:01f31e923fe2 543 if (ClockFrequency < 15000000) {
Pawel Zarembski 0:01f31e923fe2 544 LPC_CGU->XTAL_OSC_CTRL &= ~(1 << 2);
Pawel Zarembski 0:01f31e923fe2 545
Pawel Zarembski 0:01f31e923fe2 546 } else if (ClockFrequency < 25000000) {
Pawel Zarembski 0:01f31e923fe2 547 LPC_CGU->XTAL_OSC_CTRL |= (1 << 2);
Pawel Zarembski 0:01f31e923fe2 548
Pawel Zarembski 0:01f31e923fe2 549 } else {
Pawel Zarembski 0:01f31e923fe2 550 return CGU_ERROR_FREQ_OUTOF_RANGE;
Pawel Zarembski 0:01f31e923fe2 551 }
Pawel Zarembski 0:01f31e923fe2 552
Pawel Zarembski 0:01f31e923fe2 553 CGU_ClockSourceFrequency[CGU_CLKSRC_XTAL_OSC] = ClockFrequency;
Pawel Zarembski 0:01f31e923fe2 554 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 555 }
Pawel Zarembski 0:01f31e923fe2 556
Pawel Zarembski 0:01f31e923fe2 557
Pawel Zarembski 0:01f31e923fe2 558 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 559 * @brief Set clock divider
Pawel Zarembski 0:01f31e923fe2 560 * @param[in] SelectDivider Clock source, should be:
Pawel Zarembski 0:01f31e923fe2 561 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 562 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 563 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 564 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 565 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 566 * @param[in] divisor Divisor value, should be: 0..255
Pawel Zarembski 0:01f31e923fe2 567 * @return Setting status, could be:
Pawel Zarembski 0:01f31e923fe2 568 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 569 * - CGU_ERROR_INVALID_ENTITY: Invalid entity
Pawel Zarembski 0:01f31e923fe2 570 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 571 /* divisor number must >=1*/
Pawel Zarembski 0:01f31e923fe2 572 uint32_t CGU_SetDIV(CGU_ENTITY_T SelectDivider, uint32_t divisor)
Pawel Zarembski 0:01f31e923fe2 573 {
Pawel Zarembski 0:01f31e923fe2 574 int32_t RegOffset;
Pawel Zarembski 0:01f31e923fe2 575 uint32_t tempReg;
Pawel Zarembski 0:01f31e923fe2 576
Pawel Zarembski 0:01f31e923fe2 577 if (SelectDivider >= CGU_CLKSRC_IDIVA && SelectDivider <= CGU_CLKSRC_IDIVE) {
Pawel Zarembski 0:01f31e923fe2 578 RegOffset = CGU_Entity_ControlReg_Offset[SelectDivider];
Pawel Zarembski 0:01f31e923fe2 579
Pawel Zarembski 0:01f31e923fe2 580 if (RegOffset == -1) {
Pawel Zarembski 0:01f31e923fe2 581 return CGU_ERROR_INVALID_ENTITY;
Pawel Zarembski 0:01f31e923fe2 582 }
Pawel Zarembski 0:01f31e923fe2 583
Pawel Zarembski 0:01f31e923fe2 584 tempReg = CGU_ADDRESS32(LPC_CGU, RegOffset);
Pawel Zarembski 0:01f31e923fe2 585 tempReg &= ~(0xFF << 2);
Pawel Zarembski 0:01f31e923fe2 586 tempReg |= ((divisor - 1) & 0xFF) << 2;
Pawel Zarembski 0:01f31e923fe2 587 CGU_ADDRESS32(LPC_CGU, RegOffset) = tempReg;
Pawel Zarembski 0:01f31e923fe2 588 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 589 }
Pawel Zarembski 0:01f31e923fe2 590
Pawel Zarembski 0:01f31e923fe2 591 return CGU_ERROR_INVALID_ENTITY;
Pawel Zarembski 0:01f31e923fe2 592 }
Pawel Zarembski 0:01f31e923fe2 593
Pawel Zarembski 0:01f31e923fe2 594 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 595 * @brief Enable clock entity
Pawel Zarembski 0:01f31e923fe2 596 * @param[in] ClockEntity Clock entity, should be:
Pawel Zarembski 0:01f31e923fe2 597 * - CGU_CLKSRC_32KHZ_OSC :32Khz oscillator
Pawel Zarembski 0:01f31e923fe2 598 * - CGU_CLKSRC_IRC :IRC clock
Pawel Zarembski 0:01f31e923fe2 599 * - CGU_CLKSRC_ENET_RX_CLK :Ethernet receive clock
Pawel Zarembski 0:01f31e923fe2 600 * - CGU_CLKSRC_ENET_TX_CLK :Ethernet transmit clock
Pawel Zarembski 0:01f31e923fe2 601 * - CGU_CLKSRC_GP_CLKIN :General purpose input clock
Pawel Zarembski 0:01f31e923fe2 602 * - CGU_CLKSRC_XTAL_OSC :Crystal oscillator
Pawel Zarembski 0:01f31e923fe2 603 * - CGU_CLKSRC_PLL0 :PLL0 clock
Pawel Zarembski 0:01f31e923fe2 604 * - CGU_CLKSRC_PLL1 :PLL1 clock
Pawel Zarembski 0:01f31e923fe2 605 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 606 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 607 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 608 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 609 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 610 * - CGU_BASE_SAFE :Base safe clock (always on)for WDT
Pawel Zarembski 0:01f31e923fe2 611 * - CGU_BASE_USB0 :Base clock for USB0
Pawel Zarembski 0:01f31e923fe2 612 * - CGU_BASE_PERIPH :Base clock for Peripheral bus
Pawel Zarembski 0:01f31e923fe2 613 * - CGU_BASE_USB1 :Base clock for USB1
Pawel Zarembski 0:01f31e923fe2 614 * - CGU_BASE_M4 :System base clock for ARM Cortex-M3 core
Pawel Zarembski 0:01f31e923fe2 615 * and APB peripheral blocks #0 and #2
Pawel Zarembski 0:01f31e923fe2 616 * - CGU_BASE_SPIFI :Base clock for SPIFI
Pawel Zarembski 0:01f31e923fe2 617 * - CGU_BASE_PHY_RX :Base clock for Ethernet PHY Rx
Pawel Zarembski 0:01f31e923fe2 618 * - CGU_BASE_PHY_TX :Base clock for Ethernet PHY Tx
Pawel Zarembski 0:01f31e923fe2 619 * - CGU_BASE_APB1 :Base clock for APB peripheral block #1
Pawel Zarembski 0:01f31e923fe2 620 * - CGU_BASE_APB3 :Base clock for APB peripheral block #3
Pawel Zarembski 0:01f31e923fe2 621 * - CGU_BASE_LCD :Base clock for LCD
Pawel Zarembski 0:01f31e923fe2 622 * - CGU_BASE_SDIO :Base clock for SDIO card reader
Pawel Zarembski 0:01f31e923fe2 623 * - CGU_BASE_SSP0 :Base clock for SSP0
Pawel Zarembski 0:01f31e923fe2 624 * - CGU_BASE_SSP1 :Base clock for SSP1
Pawel Zarembski 0:01f31e923fe2 625 * - CGU_BASE_UART0 :Base clock for UART0
Pawel Zarembski 0:01f31e923fe2 626 * - CGU_BASE_UART1 :Base clock for UART1
Pawel Zarembski 0:01f31e923fe2 627 * - CGU_BASE_UART2 :Base clock for UART2
Pawel Zarembski 0:01f31e923fe2 628 * - CGU_BASE_UART3 :Base clock for UART3
Pawel Zarembski 0:01f31e923fe2 629 * - CGU_BASE_CLKOUT :Base clock for CLKOUT pin
Pawel Zarembski 0:01f31e923fe2 630 * @param[in] en status, should be:
Pawel Zarembski 0:01f31e923fe2 631 * - ENABLE: Enable power
Pawel Zarembski 0:01f31e923fe2 632 * - DISABLE: Disable power
Pawel Zarembski 0:01f31e923fe2 633 * @return Setting status, could be:
Pawel Zarembski 0:01f31e923fe2 634 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 635 * - CGU_ERROR_INVALID_ENTITY: Invalid entity
Pawel Zarembski 0:01f31e923fe2 636 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 637 uint32_t CGU_EnableEntity(CGU_ENTITY_T ClockEntity, uint32_t en)
Pawel Zarembski 0:01f31e923fe2 638 {
Pawel Zarembski 0:01f31e923fe2 639 int32_t RegOffset;
Pawel Zarembski 0:01f31e923fe2 640 int32_t i;
Pawel Zarembski 0:01f31e923fe2 641
Pawel Zarembski 0:01f31e923fe2 642 if (ClockEntity == CGU_CLKSRC_32KHZ_OSC) {
Pawel Zarembski 0:01f31e923fe2 643 if (en) {
Pawel Zarembski 0:01f31e923fe2 644 LPC_CREG->CREG0 &= ~((1 << 3) | (1 << 2));
Pawel Zarembski 0:01f31e923fe2 645 LPC_CREG->CREG0 |= (1 << 1) | (1 << 0);
Pawel Zarembski 0:01f31e923fe2 646
Pawel Zarembski 0:01f31e923fe2 647 } else {
Pawel Zarembski 0:01f31e923fe2 648 LPC_CREG->CREG0 &= ~((1 << 1) | (1 << 0));
Pawel Zarembski 0:01f31e923fe2 649 LPC_CREG->CREG0 |= (1 << 3);
Pawel Zarembski 0:01f31e923fe2 650 }
Pawel Zarembski 0:01f31e923fe2 651
Pawel Zarembski 0:01f31e923fe2 652 for (i = 0; i < 1000000; i++);
Pawel Zarembski 0:01f31e923fe2 653
Pawel Zarembski 0:01f31e923fe2 654 } else if (ClockEntity == CGU_CLKSRC_ENET_RX_CLK) {
Pawel Zarembski 0:01f31e923fe2 655 scu_pinmux(0xC , 0 , MD_PLN, FUNC3);
Pawel Zarembski 0:01f31e923fe2 656
Pawel Zarembski 0:01f31e923fe2 657 } else if (ClockEntity == CGU_CLKSRC_ENET_TX_CLK) {
Pawel Zarembski 0:01f31e923fe2 658 scu_pinmux(0x1 , 19 , MD_PLN, FUNC0);
Pawel Zarembski 0:01f31e923fe2 659
Pawel Zarembski 0:01f31e923fe2 660 } else if (ClockEntity == CGU_CLKSRC_GP_CLKIN) {
Pawel Zarembski 0:01f31e923fe2 661 } else if (ClockEntity == CGU_CLKSRC_TCK) {
Pawel Zarembski 0:01f31e923fe2 662 } else if (ClockEntity == CGU_CLKSRC_XTAL_OSC) {
Pawel Zarembski 0:01f31e923fe2 663 if (!en) {
Pawel Zarembski 0:01f31e923fe2 664 LPC_CGU->XTAL_OSC_CTRL |= CGU_CTRL_EN_MASK;
Pawel Zarembski 0:01f31e923fe2 665
Pawel Zarembski 0:01f31e923fe2 666 } else {
Pawel Zarembski 0:01f31e923fe2 667 LPC_CGU->XTAL_OSC_CTRL &= ~CGU_CTRL_EN_MASK;
Pawel Zarembski 0:01f31e923fe2 668 }
Pawel Zarembski 0:01f31e923fe2 669
Pawel Zarembski 0:01f31e923fe2 670 /*Delay for stable clock*/
Pawel Zarembski 0:01f31e923fe2 671 for (i = 0; i < 1000000; i++);
Pawel Zarembski 0:01f31e923fe2 672
Pawel Zarembski 0:01f31e923fe2 673 } else {
Pawel Zarembski 0:01f31e923fe2 674 RegOffset = CGU_Entity_ControlReg_Offset[ClockEntity];
Pawel Zarembski 0:01f31e923fe2 675
Pawel Zarembski 0:01f31e923fe2 676 if (RegOffset == -1) {
Pawel Zarembski 0:01f31e923fe2 677 return CGU_ERROR_INVALID_ENTITY;
Pawel Zarembski 0:01f31e923fe2 678 }
Pawel Zarembski 0:01f31e923fe2 679
Pawel Zarembski 0:01f31e923fe2 680 if (!en) {
Pawel Zarembski 0:01f31e923fe2 681 CGU_ADDRESS32(CGU_CGU_ADDR, RegOffset) |= CGU_CTRL_EN_MASK;
Pawel Zarembski 0:01f31e923fe2 682
Pawel Zarembski 0:01f31e923fe2 683 } else {
Pawel Zarembski 0:01f31e923fe2 684 CGU_ADDRESS32(CGU_CGU_ADDR, RegOffset) &= ~CGU_CTRL_EN_MASK;
Pawel Zarembski 0:01f31e923fe2 685
Pawel Zarembski 0:01f31e923fe2 686 /*if PLL is selected check if it is locked */
Pawel Zarembski 0:01f31e923fe2 687 if (ClockEntity == CGU_CLKSRC_PLL0) {
Pawel Zarembski 0:01f31e923fe2 688 while ((LPC_CGU->PLL0USB_STAT & 1) == 0x0);
Pawel Zarembski 0:01f31e923fe2 689 }
Pawel Zarembski 0:01f31e923fe2 690
Pawel Zarembski 0:01f31e923fe2 691 if (ClockEntity == CGU_CLKSRC_PLL0_AUDIO) {
Pawel Zarembski 0:01f31e923fe2 692 while ((LPC_CGU->PLL0AUDIO_STAT & 1) == 0x0);
Pawel Zarembski 0:01f31e923fe2 693 }
Pawel Zarembski 0:01f31e923fe2 694
Pawel Zarembski 0:01f31e923fe2 695 if (ClockEntity == CGU_CLKSRC_PLL1) {
Pawel Zarembski 0:01f31e923fe2 696 while ((LPC_CGU->PLL1_STAT & 1) == 0x0);
Pawel Zarembski 0:01f31e923fe2 697
Pawel Zarembski 0:01f31e923fe2 698 /*post check lock status */
Pawel Zarembski 0:01f31e923fe2 699 if (!(LPC_CGU->PLL1_STAT & 1))
Pawel Zarembski 0:01f31e923fe2 700 while (1);
Pawel Zarembski 0:01f31e923fe2 701 }
Pawel Zarembski 0:01f31e923fe2 702 }
Pawel Zarembski 0:01f31e923fe2 703 }
Pawel Zarembski 0:01f31e923fe2 704
Pawel Zarembski 0:01f31e923fe2 705 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 706 }
Pawel Zarembski 0:01f31e923fe2 707
Pawel Zarembski 0:01f31e923fe2 708 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 709 * @brief Connect entity clock source
Pawel Zarembski 0:01f31e923fe2 710 * @param[in] ClockSource Clock source, should be:
Pawel Zarembski 0:01f31e923fe2 711 * - CGU_CLKSRC_32KHZ_OSC :32Khz oscillator
Pawel Zarembski 0:01f31e923fe2 712 * - CGU_CLKSRC_IRC :IRC clock
Pawel Zarembski 0:01f31e923fe2 713 * - CGU_CLKSRC_ENET_RX_CLK :Ethernet receive clock
Pawel Zarembski 0:01f31e923fe2 714 * - CGU_CLKSRC_ENET_TX_CLK :Ethernet transmit clock
Pawel Zarembski 0:01f31e923fe2 715 * - CGU_CLKSRC_GP_CLKIN :General purpose input clock
Pawel Zarembski 0:01f31e923fe2 716 * - CGU_CLKSRC_XTAL_OSC :Crystal oscillator
Pawel Zarembski 0:01f31e923fe2 717 * - CGU_CLKSRC_PLL0 :PLL0 clock
Pawel Zarembski 0:01f31e923fe2 718 * - CGU_CLKSRC_PLL1 :PLL1 clock
Pawel Zarembski 0:01f31e923fe2 719 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 720 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 721 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 722 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 723 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 724 * @param[in] ClockEntity Clock entity, should be:
Pawel Zarembski 0:01f31e923fe2 725 * - CGU_CLKSRC_PLL0 :PLL0 clock
Pawel Zarembski 0:01f31e923fe2 726 * - CGU_CLKSRC_PLL1 :PLL1 clock
Pawel Zarembski 0:01f31e923fe2 727 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 728 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 729 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 730 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 731 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 732 * - CGU_BASE_SAFE :Base safe clock (always on)for WDT
Pawel Zarembski 0:01f31e923fe2 733 * - CGU_BASE_USB0 :Base clock for USB0
Pawel Zarembski 0:01f31e923fe2 734 * - CGU_BASE_USB1 :Base clock for USB1
Pawel Zarembski 0:01f31e923fe2 735 * - CGU_BASE_M4 :System base clock for ARM Cortex-M3 core
Pawel Zarembski 0:01f31e923fe2 736 * and APB peripheral blocks #0 and #2
Pawel Zarembski 0:01f31e923fe2 737 * - CGU_BASE_SPIFI :Base clock for SPIFI
Pawel Zarembski 0:01f31e923fe2 738 * - CGU_BASE_PHY_RX :Base clock for Ethernet PHY Rx
Pawel Zarembski 0:01f31e923fe2 739 * - CGU_BASE_PHY_TX :Base clock for Ethernet PHY Tx
Pawel Zarembski 0:01f31e923fe2 740 * - CGU_BASE_APB1 :Base clock for APB peripheral block #1
Pawel Zarembski 0:01f31e923fe2 741 * - CGU_BASE_APB3 :Base clock for APB peripheral block #3
Pawel Zarembski 0:01f31e923fe2 742 * - CGU_BASE_LCD :Base clock for LCD
Pawel Zarembski 0:01f31e923fe2 743 * - CGU_BASE_SDIO :Base clock for SDIO card reader
Pawel Zarembski 0:01f31e923fe2 744 * - CGU_BASE_SSP0 :Base clock for SSP0
Pawel Zarembski 0:01f31e923fe2 745 * - CGU_BASE_SSP1 :Base clock for SSP1
Pawel Zarembski 0:01f31e923fe2 746 * - CGU_BASE_UART0 :Base clock for UART0
Pawel Zarembski 0:01f31e923fe2 747 * - CGU_BASE_UART1 :Base clock for UART1
Pawel Zarembski 0:01f31e923fe2 748 * - CGU_BASE_UART2 :Base clock for UART2
Pawel Zarembski 0:01f31e923fe2 749 * - CGU_BASE_UART3 :Base clock for UART3
Pawel Zarembski 0:01f31e923fe2 750 * - CGU_BASE_CLKOUT :Base clock for CLKOUT pin
Pawel Zarembski 0:01f31e923fe2 751 * @return Setting status, could be:
Pawel Zarembski 0:01f31e923fe2 752 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 753 * - CGU_ERROR_CONNECT_TOGETHER: Error when 2 clock source connect together
Pawel Zarembski 0:01f31e923fe2 754 * - CGU_ERROR_INVALID_CLOCK_SOURCE: Invalid clock source error
Pawel Zarembski 0:01f31e923fe2 755 * - CGU_ERROR_INVALID_ENTITY: Invalid entity error
Pawel Zarembski 0:01f31e923fe2 756 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 757 /* Connect one entity into clock source */
Pawel Zarembski 0:01f31e923fe2 758 uint32_t CGU_EntityConnect(CGU_ENTITY_T ClockSource, CGU_ENTITY_T ClockEntity)
Pawel Zarembski 0:01f31e923fe2 759 {
Pawel Zarembski 0:01f31e923fe2 760 int32_t RegOffset;
Pawel Zarembski 0:01f31e923fe2 761 uint32_t tempReg;
Pawel Zarembski 0:01f31e923fe2 762
Pawel Zarembski 0:01f31e923fe2 763 if (ClockSource > CGU_CLKSRC_IDIVE) {
Pawel Zarembski 0:01f31e923fe2 764 return CGU_ERROR_INVALID_CLOCK_SOURCE;
Pawel Zarembski 0:01f31e923fe2 765 }
Pawel Zarembski 0:01f31e923fe2 766
Pawel Zarembski 0:01f31e923fe2 767 if (ClockEntity >= CGU_CLKSRC_PLL0 && ClockEntity <= CGU_BASE_CLKOUT) {
Pawel Zarembski 0:01f31e923fe2 768 if (CGU_ConnectAlloc_Tbl[ClockSource][ClockEntity]) {
Pawel Zarembski 0:01f31e923fe2 769 RegOffset = CGU_Entity_ControlReg_Offset[ClockSource];
Pawel Zarembski 0:01f31e923fe2 770
Pawel Zarembski 0:01f31e923fe2 771 if (RegOffset != -1) {
Pawel Zarembski 0:01f31e923fe2 772 if (ClockEntity <= CGU_CLKSRC_IDIVE &&
Pawel Zarembski 0:01f31e923fe2 773 ClockEntity >= CGU_CLKSRC_PLL0) {
Pawel Zarembski 0:01f31e923fe2 774 //RegOffset = (CGU_ADDRESS32(LPC_CGU,RegOffset)>>24)&0xF;
Pawel Zarembski 0:01f31e923fe2 775 if (((CGU_ADDRESS32(LPC_CGU, RegOffset) >> 24) & 0xF) == ClockEntity) {
Pawel Zarembski 0:01f31e923fe2 776 return CGU_ERROR_CONNECT_TOGETHER;
Pawel Zarembski 0:01f31e923fe2 777 }
Pawel Zarembski 0:01f31e923fe2 778 }
Pawel Zarembski 0:01f31e923fe2 779 }
Pawel Zarembski 0:01f31e923fe2 780
Pawel Zarembski 0:01f31e923fe2 781 RegOffset = CGU_Entity_ControlReg_Offset[ClockEntity];
Pawel Zarembski 0:01f31e923fe2 782
Pawel Zarembski 0:01f31e923fe2 783 if (RegOffset == -1) {
Pawel Zarembski 0:01f31e923fe2 784 return CGU_ERROR_INVALID_ENTITY;
Pawel Zarembski 0:01f31e923fe2 785 }
Pawel Zarembski 0:01f31e923fe2 786
Pawel Zarembski 0:01f31e923fe2 787 tempReg = CGU_ADDRESS32(LPC_CGU, RegOffset);
Pawel Zarembski 0:01f31e923fe2 788 tempReg &= ~CGU_CTRL_SRC_MASK;
Pawel Zarembski 0:01f31e923fe2 789 tempReg |= ClockSource << 24 | CGU_CTRL_AUTOBLOCK_MASK;
Pawel Zarembski 0:01f31e923fe2 790 CGU_ADDRESS32(LPC_CGU, RegOffset) = tempReg;
Pawel Zarembski 0:01f31e923fe2 791 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 792
Pawel Zarembski 0:01f31e923fe2 793 } else {
Pawel Zarembski 0:01f31e923fe2 794 return CGU_ERROR_INVALID_CLOCK_SOURCE;
Pawel Zarembski 0:01f31e923fe2 795 }
Pawel Zarembski 0:01f31e923fe2 796
Pawel Zarembski 0:01f31e923fe2 797 } else {
Pawel Zarembski 0:01f31e923fe2 798 return CGU_ERROR_INVALID_ENTITY;
Pawel Zarembski 0:01f31e923fe2 799 }
Pawel Zarembski 0:01f31e923fe2 800 }
Pawel Zarembski 0:01f31e923fe2 801
Pawel Zarembski 0:01f31e923fe2 802
Pawel Zarembski 0:01f31e923fe2 803 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 804 * @brief Get current USB PLL clock from XTAL
Pawel Zarembski 0:01f31e923fe2 805 * @param[in] None
Pawel Zarembski 0:01f31e923fe2 806 * @return Returned clock value
Pawel Zarembski 0:01f31e923fe2 807 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 808 uint32_t CGU_SetPLL0(void)
Pawel Zarembski 0:01f31e923fe2 809 {
Pawel Zarembski 0:01f31e923fe2 810 // Setup PLL550 to generate 480MHz from 12 MHz crystal
Pawel Zarembski 0:01f31e923fe2 811 LPC_CGU->PLL0USB_CTRL |= 1; // Power down PLL
Pawel Zarembski 0:01f31e923fe2 812 // P N
Pawel Zarembski 0:01f31e923fe2 813 LPC_CGU->PLL0USB_NP_DIV = (98 << 0) | (514 << 12);
Pawel Zarembski 0:01f31e923fe2 814 // SELP SELI SELR MDEC
Pawel Zarembski 0:01f31e923fe2 815 LPC_CGU->PLL0USB_MDIV = (0xB << 17) | (0x10 << 22) | (0 << 28) | (0x7FFA << 0);
Pawel Zarembski 0:01f31e923fe2 816 LPC_CGU->PLL0USB_CTRL = (CGU_CLKSRC_XTAL_OSC << 24) | (0x3 << 2) | (1 << 4);
Pawel Zarembski 0:01f31e923fe2 817 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 818 }
Pawel Zarembski 0:01f31e923fe2 819
Pawel Zarembski 0:01f31e923fe2 820
Pawel Zarembski 0:01f31e923fe2 821
Pawel Zarembski 0:01f31e923fe2 822 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 823 * @brief Get current Audio PLL clock from XTAL
Pawel Zarembski 0:01f31e923fe2 824 * @param[in] None
Pawel Zarembski 0:01f31e923fe2 825 * @return Returned clock value
Pawel Zarembski 0:01f31e923fe2 826 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 827 uint32_t CGU_SetPLL0audio(void)
Pawel Zarembski 0:01f31e923fe2 828 {
Pawel Zarembski 0:01f31e923fe2 829 /* disable clock, disable skew enable, power down pll,
Pawel Zarembski 0:01f31e923fe2 830 * (dis/en)able post divider, (dis/en)able pre-divider,
Pawel Zarembski 0:01f31e923fe2 831 * disable free running mode, disable bandsel,
Pawel Zarembski 0:01f31e923fe2 832 * enable up limmiter, disable bypass
Pawel Zarembski 0:01f31e923fe2 833 */
Pawel Zarembski 0:01f31e923fe2 834 LPC_CGU->PLL0AUDIO_CTRL = (6 << 24) /* source = XTAL OSC 12 MHz */
Pawel Zarembski 0:01f31e923fe2 835 | _BIT(0); /* power down */
Pawel Zarembski 0:01f31e923fe2 836 /* PLL should be set to 512fs rate 512 * 48000 = 24576000 Hz */
Pawel Zarembski 0:01f31e923fe2 837 /* set mdec register */
Pawel Zarembski 0:01f31e923fe2 838 #if 1 // results from gcc program
Pawel Zarembski 0:01f31e923fe2 839 LPC_CGU->PLL0AUDIO_MDIV = 0x23e34d3;
Pawel Zarembski 0:01f31e923fe2 840 LPC_CGU->PLL0AUDIO_NP_DIV = 0x3f00e;
Pawel Zarembski 0:01f31e923fe2 841 LPC_CGU->PLL0AUDIO_CTRL = (6 << 24) /* source = XTAL OSC 12 MHz */
Pawel Zarembski 0:01f31e923fe2 842 | (6 << 12) // fractional divider off and bypassed
Pawel Zarembski 0:01f31e923fe2 843 | _BIT(4); /* CLKEN */
Pawel Zarembski 0:01f31e923fe2 844 #else
Pawel Zarembski 0:01f31e923fe2 845 LPC_CGU->PLL0AUDIO_MDIV = (0 << 28) /* SELR */
Pawel Zarembski 0:01f31e923fe2 846 | (40 << 22) /* SELI */
Pawel Zarembski 0:01f31e923fe2 847 | (31 << 17) /* SELP */
Pawel Zarembski 0:01f31e923fe2 848 | 11372; /* MDEC */
Pawel Zarembski 0:01f31e923fe2 849 /* set ndec, pdec register */
Pawel Zarembski 0:01f31e923fe2 850 LPC_CGU->PLL0AUDIO_NP_DIV = (22 << 12) /* ndec */
Pawel Zarembski 0:01f31e923fe2 851 | (10); /* pdec */
Pawel Zarembski 0:01f31e923fe2 852 /* set fraction divider register. [21:15] = m, [14:0] = fractional value */
Pawel Zarembski 0:01f31e923fe2 853 LPC_CGU->PLL0AUDIO_FRAC = (86 << 15) | 0x1B7;
Pawel Zarembski 0:01f31e923fe2 854 LPC_CGU->PLL0AUDIO_CTRL = (6 << 24) /* source = XTAL OSC 12 MHz */
Pawel Zarembski 0:01f31e923fe2 855 | _BIT(12) /* enable SD modulator to update mdec*/
Pawel Zarembski 0:01f31e923fe2 856 | _BIT(4); /* CLKEN */
Pawel Zarembski 0:01f31e923fe2 857 #endif
Pawel Zarembski 0:01f31e923fe2 858
Pawel Zarembski 0:01f31e923fe2 859 /* wait for lock */
Pawel Zarembski 0:01f31e923fe2 860 while (!(LPC_CGU->PLL0AUDIO_STAT & 1));
Pawel Zarembski 0:01f31e923fe2 861
Pawel Zarembski 0:01f31e923fe2 862 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 863 }
Pawel Zarembski 0:01f31e923fe2 864
Pawel Zarembski 0:01f31e923fe2 865
Pawel Zarembski 0:01f31e923fe2 866 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 867 * @brief Setting PLL1
Pawel Zarembski 0:01f31e923fe2 868 * @param[in] mult Multiple value
Pawel Zarembski 0:01f31e923fe2 869 * @return Setting status, could be:
Pawel Zarembski 0:01f31e923fe2 870 * - CGU_ERROR_SUCCESS: successful
Pawel Zarembski 0:01f31e923fe2 871 * - CGU_ERROR_INVALID_PARAM: Invalid parameter error
Pawel Zarembski 0:01f31e923fe2 872 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 873 uint32_t CGU_SetPLL1(uint32_t mult)
Pawel Zarembski 0:01f31e923fe2 874 {
Pawel Zarembski 0:01f31e923fe2 875 uint32_t msel = 0, nsel = 0, psel = 0, pval = 1;
Pawel Zarembski 0:01f31e923fe2 876 uint32_t freq;
Pawel Zarembski 0:01f31e923fe2 877 uint32_t ClkSrc = (LPC_CGU->PLL1_CTRL & CGU_CTRL_SRC_MASK) >> 24;
Pawel Zarembski 0:01f31e923fe2 878 freq = CGU_ClockSourceFrequency[ClkSrc];
Pawel Zarembski 0:01f31e923fe2 879 freq *= mult;
Pawel Zarembski 0:01f31e923fe2 880 msel = mult - 1;
Pawel Zarembski 0:01f31e923fe2 881 LPC_CGU->PLL1_CTRL &= ~(CGU_PLL1_FBSEL_MASK |
Pawel Zarembski 0:01f31e923fe2 882 CGU_PLL1_BYPASS_MASK |
Pawel Zarembski 0:01f31e923fe2 883 CGU_PLL1_DIRECT_MASK |
Pawel Zarembski 0:01f31e923fe2 884 (0x03 << 8) | (0xFF << 16) | (0x03 << 12));
Pawel Zarembski 0:01f31e923fe2 885
Pawel Zarembski 0:01f31e923fe2 886 if (freq < 156000000) {
Pawel Zarembski 0:01f31e923fe2 887 //psel is encoded such that 0=1, 1=2, 2=4, 3=8
Pawel Zarembski 0:01f31e923fe2 888 while (2 * (pval)*freq < 156000000) {
Pawel Zarembski 0:01f31e923fe2 889 psel++;
Pawel Zarembski 0:01f31e923fe2 890 pval *= 2;
Pawel Zarembski 0:01f31e923fe2 891 }
Pawel Zarembski 0:01f31e923fe2 892
Pawel Zarembski 0:01f31e923fe2 893 // if(2*(pval)*freq > 320000000) {
Pawel Zarembski 0:01f31e923fe2 894 // //THIS IS OUT OF RANGE!!!
Pawel Zarembski 0:01f31e923fe2 895 // //HOW DO WE ASSERT IN SAMPLE CODE?
Pawel Zarembski 0:01f31e923fe2 896 // //__breakpoint(0);
Pawel Zarembski 0:01f31e923fe2 897 // return CGU_ERROR_INVALID_PARAM;
Pawel Zarembski 0:01f31e923fe2 898 // }
Pawel Zarembski 0:01f31e923fe2 899 LPC_CGU->PLL1_CTRL |= (msel << 16) | (nsel << 12) | (psel << 8) | CGU_PLL1_FBSEL_MASK;
Pawel Zarembski 0:01f31e923fe2 900
Pawel Zarembski 0:01f31e923fe2 901 } else if (freq < 320000000) {
Pawel Zarembski 0:01f31e923fe2 902 LPC_CGU->PLL1_CTRL |= (msel << 16) | (nsel << 12) | (psel << 8) | CGU_PLL1_DIRECT_MASK | CGU_PLL1_FBSEL_MASK;
Pawel Zarembski 0:01f31e923fe2 903
Pawel Zarembski 0:01f31e923fe2 904 } else {
Pawel Zarembski 0:01f31e923fe2 905 return CGU_ERROR_INVALID_PARAM;
Pawel Zarembski 0:01f31e923fe2 906 }
Pawel Zarembski 0:01f31e923fe2 907
Pawel Zarembski 0:01f31e923fe2 908 return CGU_ERROR_SUCCESS;
Pawel Zarembski 0:01f31e923fe2 909 }
Pawel Zarembski 0:01f31e923fe2 910
Pawel Zarembski 0:01f31e923fe2 911
Pawel Zarembski 0:01f31e923fe2 912 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 913 * @brief Get current base status
Pawel Zarembski 0:01f31e923fe2 914 * @param[in] Base Base type, should be:
Pawel Zarembski 0:01f31e923fe2 915 * - CGU_BASE_USB0 :Base clock for USB0
Pawel Zarembski 0:01f31e923fe2 916 * - CGU_BASE_USB1 :Base clock for USB1
Pawel Zarembski 0:01f31e923fe2 917 * - CGU_BASE_M4 :System base clock for ARM Cortex-M3 core
Pawel Zarembski 0:01f31e923fe2 918 * and APB peripheral blocks #0 and #2
Pawel Zarembski 0:01f31e923fe2 919 * - CGU_BASE_SPIFI :Base clock for SPIFI
Pawel Zarembski 0:01f31e923fe2 920 * - CGU_BASE_APB1 :Base clock for APB peripheral block #1
Pawel Zarembski 0:01f31e923fe2 921 * - CGU_BASE_APB3 :Base clock for APB peripheral block #3
Pawel Zarembski 0:01f31e923fe2 922 * - CGU_BASE_SDIO :Base clock for SDIO card reader
Pawel Zarembski 0:01f31e923fe2 923 * - CGU_BASE_SSP0 :Base clock for SSP0
Pawel Zarembski 0:01f31e923fe2 924 * - CGU_BASE_SSP1 :Base clock for SSP1
Pawel Zarembski 0:01f31e923fe2 925 * - CGU_BASE_UART0 :Base clock for UART0
Pawel Zarembski 0:01f31e923fe2 926 * - CGU_BASE_UART1 :Base clock for UART1
Pawel Zarembski 0:01f31e923fe2 927 * - CGU_BASE_UART2 :Base clock for UART2
Pawel Zarembski 0:01f31e923fe2 928 * - CGU_BASE_UART3 :Base clock for UART3
Pawel Zarembski 0:01f31e923fe2 929 * @return Always return 0
Pawel Zarembski 0:01f31e923fe2 930 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 931 uint32_t CGU_GetBaseStatus(CGU_ENTITY_T Base)
Pawel Zarembski 0:01f31e923fe2 932 {
Pawel Zarembski 0:01f31e923fe2 933 switch (Base) {
Pawel Zarembski 0:01f31e923fe2 934 /*CCU1*/
Pawel Zarembski 0:01f31e923fe2 935 case CGU_BASE_APB3:
Pawel Zarembski 0:01f31e923fe2 936 return LPC_CCU1->BASE_STAT & 1;
Pawel Zarembski 0:01f31e923fe2 937
Pawel Zarembski 0:01f31e923fe2 938 case CGU_BASE_APB1:
Pawel Zarembski 0:01f31e923fe2 939 return (LPC_CCU1->BASE_STAT >> 1) & 1;
Pawel Zarembski 0:01f31e923fe2 940
Pawel Zarembski 0:01f31e923fe2 941 case CGU_BASE_SPIFI:
Pawel Zarembski 0:01f31e923fe2 942 return (LPC_CCU1->BASE_STAT >> 2) & 1;
Pawel Zarembski 0:01f31e923fe2 943
Pawel Zarembski 0:01f31e923fe2 944 case CGU_BASE_M4:
Pawel Zarembski 0:01f31e923fe2 945 return (LPC_CCU1->BASE_STAT >> 3) & 1;
Pawel Zarembski 0:01f31e923fe2 946
Pawel Zarembski 0:01f31e923fe2 947 case CGU_BASE_USB0:
Pawel Zarembski 0:01f31e923fe2 948 return (LPC_CCU1->BASE_STAT >> 7) & 1;
Pawel Zarembski 0:01f31e923fe2 949
Pawel Zarembski 0:01f31e923fe2 950 case CGU_BASE_USB1:
Pawel Zarembski 0:01f31e923fe2 951 return (LPC_CCU1->BASE_STAT >> 8) & 1;
Pawel Zarembski 0:01f31e923fe2 952
Pawel Zarembski 0:01f31e923fe2 953 /*CCU2*/
Pawel Zarembski 0:01f31e923fe2 954 case CGU_BASE_UART3:
Pawel Zarembski 0:01f31e923fe2 955 return (LPC_CCU2->BASE_STAT >> 1) & 1;
Pawel Zarembski 0:01f31e923fe2 956
Pawel Zarembski 0:01f31e923fe2 957 case CGU_BASE_UART2:
Pawel Zarembski 0:01f31e923fe2 958 return (LPC_CCU2->BASE_STAT >> 2) & 1;
Pawel Zarembski 0:01f31e923fe2 959
Pawel Zarembski 0:01f31e923fe2 960 case CGU_BASE_UART1:
Pawel Zarembski 0:01f31e923fe2 961 return (LPC_CCU2->BASE_STAT >> 3) & 1;
Pawel Zarembski 0:01f31e923fe2 962
Pawel Zarembski 0:01f31e923fe2 963 case CGU_BASE_UART0:
Pawel Zarembski 0:01f31e923fe2 964 return (LPC_CCU2->BASE_STAT >> 4) & 1;
Pawel Zarembski 0:01f31e923fe2 965
Pawel Zarembski 0:01f31e923fe2 966 case CGU_BASE_SSP1:
Pawel Zarembski 0:01f31e923fe2 967 return (LPC_CCU2->BASE_STAT >> 5) & 1;
Pawel Zarembski 0:01f31e923fe2 968
Pawel Zarembski 0:01f31e923fe2 969 case CGU_BASE_SSP0:
Pawel Zarembski 0:01f31e923fe2 970 return (LPC_CCU2->BASE_STAT >> 6) & 1;
Pawel Zarembski 0:01f31e923fe2 971
Pawel Zarembski 0:01f31e923fe2 972 case CGU_BASE_SDIO:
Pawel Zarembski 0:01f31e923fe2 973 return (LPC_CCU2->BASE_STAT >> 7) & 1;
Pawel Zarembski 0:01f31e923fe2 974
Pawel Zarembski 0:01f31e923fe2 975 /*BASE SAFE is used by WWDT and RGU*/
Pawel Zarembski 0:01f31e923fe2 976 case CGU_BASE_SAFE:
Pawel Zarembski 0:01f31e923fe2 977 break;
Pawel Zarembski 0:01f31e923fe2 978
Pawel Zarembski 0:01f31e923fe2 979 default:
Pawel Zarembski 0:01f31e923fe2 980 break;
Pawel Zarembski 0:01f31e923fe2 981 }
Pawel Zarembski 0:01f31e923fe2 982
Pawel Zarembski 0:01f31e923fe2 983 return 0;
Pawel Zarembski 0:01f31e923fe2 984 }
Pawel Zarembski 0:01f31e923fe2 985
Pawel Zarembski 0:01f31e923fe2 986
Pawel Zarembski 0:01f31e923fe2 987 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 988 * @brief Compare one source clock to IRC clock
Pawel Zarembski 0:01f31e923fe2 989 * @param[in] Clock Clock entity that will be compared to IRC, should be:
Pawel Zarembski 0:01f31e923fe2 990 * - CGU_CLKSRC_32KHZ_OSC :32Khz crystal oscillator
Pawel Zarembski 0:01f31e923fe2 991 * - CGU_CLKSRC_ENET_RX_CLK :Ethernet receive clock
Pawel Zarembski 0:01f31e923fe2 992 * - CGU_CLKSRC_ENET_TX_CLK :Ethernet transmit clock
Pawel Zarembski 0:01f31e923fe2 993 * - CGU_CLKSRC_GP_CLKIN :General purpose input clock
Pawel Zarembski 0:01f31e923fe2 994 * - CGU_CLKSRC_XTAL_OSC :Crystal oscillator
Pawel Zarembski 0:01f31e923fe2 995 * - CGU_CLKSRC_PLL0 :PLL0 clock
Pawel Zarembski 0:01f31e923fe2 996 * - CGU_CLKSRC_PLL1 :PLL1 clock
Pawel Zarembski 0:01f31e923fe2 997 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 998 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 999 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 1000 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 1001 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 1002 * - CGU_BASE_SAFE :Base safe clock (always on)for WDT
Pawel Zarembski 0:01f31e923fe2 1003 * - CGU_BASE_USB0 :Base clock for USB0
Pawel Zarembski 0:01f31e923fe2 1004 * - CGU_BASE_USB1 :Base clock for USB1
Pawel Zarembski 0:01f31e923fe2 1005 * - CGU_BASE_M4 :System base clock for ARM Cortex-M3 core
Pawel Zarembski 0:01f31e923fe2 1006 * and APB peripheral blocks #0 and #2
Pawel Zarembski 0:01f31e923fe2 1007 * - CGU_BASE_SPIFI :Base clock for SPIFI
Pawel Zarembski 0:01f31e923fe2 1008 * - CGU_BASE_PHY_RX :Base clock for Ethernet PHY Rx
Pawel Zarembski 0:01f31e923fe2 1009 * - CGU_BASE_PHY_TX :Base clock for Ethernet PHY Tx
Pawel Zarembski 0:01f31e923fe2 1010 * - CGU_BASE_APB1 :Base clock for APB peripheral block #1
Pawel Zarembski 0:01f31e923fe2 1011 * - CGU_BASE_APB3 :Base clock for APB peripheral block #3
Pawel Zarembski 0:01f31e923fe2 1012 * - CGU_BASE_LCD :Base clock for LCD
Pawel Zarembski 0:01f31e923fe2 1013 * - CGU_BASE_SDIO :Base clock for SDIO card reader
Pawel Zarembski 0:01f31e923fe2 1014 * - CGU_BASE_SSP0 :Base clock for SSP0
Pawel Zarembski 0:01f31e923fe2 1015 * - CGU_BASE_SSP1 :Base clock for SSP1
Pawel Zarembski 0:01f31e923fe2 1016 * - CGU_BASE_UART0 :Base clock for UART0
Pawel Zarembski 0:01f31e923fe2 1017 * - CGU_BASE_UART1 :Base clock for UART1
Pawel Zarembski 0:01f31e923fe2 1018 * - CGU_BASE_UART2 :Base clock for UART2
Pawel Zarembski 0:01f31e923fe2 1019 * - CGU_BASE_UART3 :Base clock for UART3
Pawel Zarembski 0:01f31e923fe2 1020 * - CGU_BASE_CLKOUT :Base clock for CLKOUT pin
Pawel Zarembski 0:01f31e923fe2 1021 * @param[in] m Multiple value pointer
Pawel Zarembski 0:01f31e923fe2 1022 * @param[in] d Divider value pointer
Pawel Zarembski 0:01f31e923fe2 1023 * @return Compare status, could be:
Pawel Zarembski 0:01f31e923fe2 1024 * - (-1): fail
Pawel Zarembski 0:01f31e923fe2 1025 * - 0: successful
Pawel Zarembski 0:01f31e923fe2 1026 * @note Formula used to compare:
Pawel Zarembski 0:01f31e923fe2 1027 * FClock = F_IRC* m / d
Pawel Zarembski 0:01f31e923fe2 1028 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 1029 int CGU_FrequencyMonitor(CGU_ENTITY_T Clock, uint32_t *m, uint32_t *d)
Pawel Zarembski 0:01f31e923fe2 1030 {
Pawel Zarembski 0:01f31e923fe2 1031 uint32_t n, c, temp;
Pawel Zarembski 0:01f31e923fe2 1032 int i;
Pawel Zarembski 0:01f31e923fe2 1033 /* Maximum allow RCOUNT number */
Pawel Zarembski 0:01f31e923fe2 1034 c = 511;
Pawel Zarembski 0:01f31e923fe2 1035 /* Check Source Clock Freq is larger or smaller */
Pawel Zarembski 0:01f31e923fe2 1036 LPC_CGU->FREQ_MON = (Clock << 24) | 1 << 23 | c;
Pawel Zarembski 0:01f31e923fe2 1037
Pawel Zarembski 0:01f31e923fe2 1038 while (LPC_CGU->FREQ_MON & (1 << 23));
Pawel Zarembski 0:01f31e923fe2 1039
Pawel Zarembski 0:01f31e923fe2 1040 for (i = 0; i < 10000; i++);
Pawel Zarembski 0:01f31e923fe2 1041
Pawel Zarembski 0:01f31e923fe2 1042 temp = (LPC_CGU->FREQ_MON >> 9) & 0x3FFF;
Pawel Zarembski 0:01f31e923fe2 1043
Pawel Zarembski 0:01f31e923fe2 1044 if (temp == 0) { /* too low F < 12000000/511*/
Pawel Zarembski 0:01f31e923fe2 1045 return -1;
Pawel Zarembski 0:01f31e923fe2 1046 }
Pawel Zarembski 0:01f31e923fe2 1047
Pawel Zarembski 0:01f31e923fe2 1048 if (temp > 511) { /* larger */
Pawel Zarembski 0:01f31e923fe2 1049 c = 511 - (LPC_CGU->FREQ_MON & 0x1FF);
Pawel Zarembski 0:01f31e923fe2 1050
Pawel Zarembski 0:01f31e923fe2 1051 } else {
Pawel Zarembski 0:01f31e923fe2 1052 do {
Pawel Zarembski 0:01f31e923fe2 1053 c--;
Pawel Zarembski 0:01f31e923fe2 1054 LPC_CGU->FREQ_MON = (Clock << 24) | 1 << 23 | c;
Pawel Zarembski 0:01f31e923fe2 1055
Pawel Zarembski 0:01f31e923fe2 1056 while (LPC_CGU->FREQ_MON & (1 << 23));
Pawel Zarembski 0:01f31e923fe2 1057
Pawel Zarembski 0:01f31e923fe2 1058 for (i = 0; i < 10000; i++);
Pawel Zarembski 0:01f31e923fe2 1059
Pawel Zarembski 0:01f31e923fe2 1060 n = (LPC_CGU->FREQ_MON >> 9) & 0x3FFF;
Pawel Zarembski 0:01f31e923fe2 1061 } while (n == temp);
Pawel Zarembski 0:01f31e923fe2 1062
Pawel Zarembski 0:01f31e923fe2 1063 c++;
Pawel Zarembski 0:01f31e923fe2 1064 }
Pawel Zarembski 0:01f31e923fe2 1065
Pawel Zarembski 0:01f31e923fe2 1066 *m = temp;
Pawel Zarembski 0:01f31e923fe2 1067 *d = c;
Pawel Zarembski 0:01f31e923fe2 1068 return 0;
Pawel Zarembski 0:01f31e923fe2 1069 }
Pawel Zarembski 0:01f31e923fe2 1070
Pawel Zarembski 0:01f31e923fe2 1071 /*********************************************************************//**
Pawel Zarembski 0:01f31e923fe2 1072 * @brief Compare one source clock to another source clock
Pawel Zarembski 0:01f31e923fe2 1073 * @param[in] Clock Clock entity that will be compared to second source, should be:
Pawel Zarembski 0:01f31e923fe2 1074 * - CGU_CLKSRC_32KHZ_OSC :32Khz crystal oscillator
Pawel Zarembski 0:01f31e923fe2 1075 * - CGU_CLKSRC_ENET_RX_CLK :Ethernet receive clock
Pawel Zarembski 0:01f31e923fe2 1076 * - CGU_CLKSRC_ENET_TX_CLK :Ethernet transmit clock
Pawel Zarembski 0:01f31e923fe2 1077 * - CGU_CLKSRC_GP_CLKIN :General purpose input clock
Pawel Zarembski 0:01f31e923fe2 1078 * - CGU_CLKSRC_XTAL_OSC :Crystal oscillator
Pawel Zarembski 0:01f31e923fe2 1079 * - CGU_CLKSRC_PLL0 :PLL0 clock
Pawel Zarembski 0:01f31e923fe2 1080 * - CGU_CLKSRC_PLL1 :PLL1 clock
Pawel Zarembski 0:01f31e923fe2 1081 * - CGU_CLKSRC_IDIVA :Integer divider register A
Pawel Zarembski 0:01f31e923fe2 1082 * - CGU_CLKSRC_IDIVB :Integer divider register B
Pawel Zarembski 0:01f31e923fe2 1083 * - CGU_CLKSRC_IDIVC :Integer divider register C
Pawel Zarembski 0:01f31e923fe2 1084 * - CGU_CLKSRC_IDIVD :Integer divider register D
Pawel Zarembski 0:01f31e923fe2 1085 * - CGU_CLKSRC_IDIVE :Integer divider register E
Pawel Zarembski 0:01f31e923fe2 1086 * - CGU_BASE_SAFE :Base safe clock (always on)for WDT
Pawel Zarembski 0:01f31e923fe2 1087 * - CGU_BASE_USB0 :Base clock for USB0
Pawel Zarembski 0:01f31e923fe2 1088 * - CGU_BASE_USB1 :Base clock for USB1
Pawel Zarembski 0:01f31e923fe2 1089 * - CGU_BASE_M4 :System base clock for ARM Cortex-M3 core
Pawel Zarembski 0:01f31e923fe2 1090 * and APB peripheral blocks #0 and #2
Pawel Zarembski 0:01f31e923fe2 1091 * - CGU_BASE_SPIFI :Base clock for SPIFI
Pawel Zarembski 0:01f31e923fe2 1092 * - CGU_BASE_PHY_RX :Base clock for Ethernet PHY Rx
Pawel Zarembski 0:01f31e923fe2 1093 * - CGU_BASE_PHY_TX :Base clock for Ethernet PHY Tx
Pawel Zarembski 0:01f31e923fe2 1094 * - CGU_BASE_APB1 :Base clock for APB peripheral block #1
Pawel Zarembski 0:01f31e923fe2 1095 * - CGU_BASE_APB3 :Base clock for APB peripheral block #3
Pawel Zarembski 0:01f31e923fe2 1096 * - CGU_BASE_LCD :Base clock for LCD
Pawel Zarembski 0:01f31e923fe2 1097 * - CGU_BASE_SDIO :Base clock for SDIO card reader
Pawel Zarembski 0:01f31e923fe2 1098 * - CGU_BASE_SSP0 :Base clock for SSP0
Pawel Zarembski 0:01f31e923fe2 1099 * - CGU_BASE_SSP1 :Base clock for SSP1
Pawel Zarembski 0:01f31e923fe2 1100 * - CGU_BASE_UART0 :Base clock for UART0
Pawel Zarembski 0:01f31e923fe2 1101 * - CGU_BASE_UART1 :Base clock for UART1
Pawel Zarembski 0:01f31e923fe2 1102 * - CGU_BASE_UART2 :Base clock for UART2
Pawel Zarembski 0:01f31e923fe2 1103 * - CGU_BASE_UART3 :Base clock for UART3
Pawel Zarembski 0:01f31e923fe2 1104 * - CGU_BASE_CLKOUT :Base clock for CLKOUT pin
Pawel Zarembski 0:01f31e923fe2 1105 * @param[in] CompareToClock Clock source that to be compared to first source, should be different
Pawel Zarembski 0:01f31e923fe2 1106 * to first source.
Pawel Zarembski 0:01f31e923fe2 1107 * @param[in] m Multiple value pointer
Pawel Zarembski 0:01f31e923fe2 1108 * @param[in] d Divider value pointer
Pawel Zarembski 0:01f31e923fe2 1109 * @return Compare status, could be:
Pawel Zarembski 0:01f31e923fe2 1110 * - (-1): fail
Pawel Zarembski 0:01f31e923fe2 1111 * - 0: successful
Pawel Zarembski 0:01f31e923fe2 1112 * @note Formula used to compare:
Pawel Zarembski 0:01f31e923fe2 1113 * FClock = m*FCompareToClock/d
Pawel Zarembski 0:01f31e923fe2 1114 **********************************************************************/
Pawel Zarembski 0:01f31e923fe2 1115 uint32_t CGU_RealFrequencyCompare(CGU_ENTITY_T Clock, CGU_ENTITY_T CompareToClock, uint32_t *m, uint32_t *d)
Pawel Zarembski 0:01f31e923fe2 1116 {
Pawel Zarembski 0:01f31e923fe2 1117 uint32_t m1, m2, d1, d2;
Pawel Zarembski 0:01f31e923fe2 1118
Pawel Zarembski 0:01f31e923fe2 1119 /* Check Parameter */
Pawel Zarembski 0:01f31e923fe2 1120 if ((Clock > CGU_CLKSRC_IDIVE) || (CompareToClock > CGU_CLKSRC_IDIVE)) {
Pawel Zarembski 0:01f31e923fe2 1121 return CGU_ERROR_INVALID_PARAM;
Pawel Zarembski 0:01f31e923fe2 1122 }
Pawel Zarembski 0:01f31e923fe2 1123
Pawel Zarembski 0:01f31e923fe2 1124 /* Check for Clock Enable - Not yet implement
Pawel Zarembski 0:01f31e923fe2 1125 * The Comparator will hang if Clock has not been set*/
Pawel Zarembski 0:01f31e923fe2 1126 CGU_FrequencyMonitor(Clock, &m1, &d1);
Pawel Zarembski 0:01f31e923fe2 1127 CGU_FrequencyMonitor(CompareToClock, &m2, &d2);
Pawel Zarembski 0:01f31e923fe2 1128 *m = m1 * d2;
Pawel Zarembski 0:01f31e923fe2 1129 *d = d1 * m2;
Pawel Zarembski 0:01f31e923fe2 1130 return 0;
Pawel Zarembski 0:01f31e923fe2 1131 }
Pawel Zarembski 0:01f31e923fe2 1132