|
|
@@ -1,773 +0,0 @@
|
|
|
-/*******************************************************************************
|
|
|
-* File Name : amt630hv160_clk.c
|
|
|
-* Author : Sim
|
|
|
-* Date First Issued : 05/04/2023
|
|
|
-* Description : This file provides all the Clock Config functions.
|
|
|
-********************************************************************************
|
|
|
-* History:
|
|
|
-* 05/04/2023: V0.1
|
|
|
-*******************************************************************************/
|
|
|
-
|
|
|
-/* Includes ------------------------------------------------------------------*/
|
|
|
-#include <stdio.h>
|
|
|
-#include "amt630hv160_lib.h"
|
|
|
-
|
|
|
-/* PLL config ----------------------------------------------------------------*/
|
|
|
-#define CPUPLL_FREQ 800000000 //800M
|
|
|
-#define SYSPLL_FREQ 360000000 //360M
|
|
|
-#define DDRPLL_FREQ 360000000 //360M
|
|
|
-#define VPUPLL_FREQ 480000000 //480M
|
|
|
-#define MFCPLL_FREQ 360000000 //360M
|
|
|
-#define AHBPLL_FREQ 240000000 //240M
|
|
|
-#define GPUPLL_FREQ 500000000 //500M
|
|
|
-
|
|
|
-#define SYSPLL_SPRD_EN 0//1
|
|
|
-#define AHBPLL_SPRD_EN 0
|
|
|
-#define VPUPLL_SPRD_EN 1
|
|
|
-
|
|
|
-//spread spectrum permillage, for example: 5/10/20,范围越大,效果越好
|
|
|
-#define SYSPLL_SPRD_PERM 50 //50~500
|
|
|
-#define AHBPLL_SPRD_PERM 50 //50~500
|
|
|
-#define VPUPLL_SPRD_PERM 70 //30~500, < 70 屏幕不抖动
|
|
|
-//spread spectrum clock frequency,for example:40k/50k/60k
|
|
|
-#define SYSPLL_SPRD_FREQ 40000
|
|
|
-#define AHBPLL_SPRD_FREQ 40000
|
|
|
-#define VPUPLL_SPRD_FREQ 40000
|
|
|
-
|
|
|
-
|
|
|
-u32 CLK_GetPLLFreq(u32 pllcfg)
|
|
|
-{
|
|
|
- u32 val;
|
|
|
- u32 refdiv, fbdiv;
|
|
|
- u32 postdiv1, postdiv2;
|
|
|
-
|
|
|
- val = pllcfg;
|
|
|
- refdiv = val & 0x3f;
|
|
|
- fbdiv = (val >> 8) & 0xfff;
|
|
|
- postdiv1 = (val >> 20) & 0x7;
|
|
|
- postdiv2 = (val >> 23) & 0x7;
|
|
|
-
|
|
|
- return HSE_Value / refdiv * fbdiv / postdiv1 / postdiv2;
|
|
|
-}
|
|
|
-
|
|
|
-u32 CLK_GetAHBFreq(void)
|
|
|
-{
|
|
|
- u32 clksrc;
|
|
|
-
|
|
|
- clksrc = (SYSCTRL->BUS_CLK_CFG >> 3) & 1;
|
|
|
- if (clksrc)
|
|
|
- return CLK_GetPLLFreq(SYSCTRL->AHBPLL_CFG);
|
|
|
- else
|
|
|
- return HSE_Value;
|
|
|
-}
|
|
|
-
|
|
|
-u32 CLK_GetAPBFreq(void)
|
|
|
-{
|
|
|
- u32 div;
|
|
|
-
|
|
|
- div = (SYSCTRL->BUS_CLK_CFG >> 4) & 3;
|
|
|
- if (div > 2)
|
|
|
- div = 2;
|
|
|
- div = 1 << div;
|
|
|
-
|
|
|
- return CLK_GetAHBFreq() / div;
|
|
|
-}
|
|
|
-
|
|
|
-static int CLK_SetSprd(u32 pllcfgreg)
|
|
|
-{
|
|
|
- u64 clk, unit_freq;
|
|
|
- u32 REFDIV, FBDIV, POSTDIV1, POSTDIV2, FBDIV1;
|
|
|
- u32 max_offset, sprd_val, vco;
|
|
|
- u32 val, mul, pllsprdcfgreg;
|
|
|
- u32 sprd_perm, sprd_freq;
|
|
|
-
|
|
|
- if (pllcfgreg == (u32)&SYSCTRL->SYSPLL_CFG) {
|
|
|
- pllsprdcfgreg = (u32)&SYSCTRL->SYSPLL_SPRD_CTL;
|
|
|
- sprd_perm = SYSPLL_SPRD_PERM;
|
|
|
- sprd_freq = SYSPLL_SPRD_FREQ;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->AHBPLL_CFG) {
|
|
|
- pllsprdcfgreg = (u32)&SYSCTRL->AHBPLL_SPRD_CTL;
|
|
|
- sprd_perm = AHBPLL_SPRD_PERM;
|
|
|
- sprd_freq = AHBPLL_SPRD_FREQ;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->VPUPLL_CFG) {
|
|
|
- pllsprdcfgreg = (u32)&SYSCTRL->VPUPLL_SPRD_CTL;
|
|
|
- sprd_perm = VPUPLL_SPRD_PERM;
|
|
|
- sprd_freq = VPUPLL_SPRD_FREQ;
|
|
|
- } else {
|
|
|
- printf("The pll does not support sprd.\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(sprd_freq < 10000 || sprd_freq > 100000) {
|
|
|
- printf("[%s], invalid freq config.\n", __func__);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- REFDIV = *(u32 *)pllcfgreg & 0x1f;
|
|
|
- FBDIV = (*(u32 *)pllcfgreg >> 8) & 0xfff;
|
|
|
- POSTDIV1 = (*(u32 *)pllcfgreg >> 20) & 0x7;
|
|
|
- POSTDIV2 = (*(u32 *)pllcfgreg >> 23) & 0x7;
|
|
|
-
|
|
|
- mul = HSE_Value / REFDIV / POSTDIV1 / POSTDIV2;
|
|
|
- clk = CLK_GetPLLFreq(*(u32 *)pllcfgreg);
|
|
|
- clk = clk + (clk * sprd_perm) / 1000;
|
|
|
- FBDIV1 = clk / mul;
|
|
|
-
|
|
|
- vco = HSE_Value / REFDIV * FBDIV1;
|
|
|
- if (vco < 400000000 || vco > 1600000000) {
|
|
|
- printf("sprd config abnormal.\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- max_offset = FBDIV1 - FBDIV;
|
|
|
- if (!max_offset) {
|
|
|
- printf("[%s], max_offset para except.\n", __func__);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- unit_freq = HSE_Value / 4 / REFDIV * FBDIV; //default 4
|
|
|
- sprd_val = unit_freq / max_offset / 2 / sprd_freq;
|
|
|
- if (sprd_val & ~(0xfff)) {
|
|
|
- printf("[%s], sprd_val para except.\n", __func__);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- val = *(u32 *)pllsprdcfgreg;
|
|
|
- //val &= ~(0x1 << 31);
|
|
|
- val &= ~(0x1 << 30);
|
|
|
- val &= ~(0xfff << 16);
|
|
|
- val |= (max_offset & 0xfff) << 16;
|
|
|
- val |= sprd_val & 0xfff;
|
|
|
- *(u32 *)pllsprdcfgreg = val;
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
|
|
|
-{
|
|
|
- u32 fbdiv, vco;
|
|
|
- u32 postdiv2 = 1, postdiv1 = 2, refdiv = 3; //满足PFD=8,12,24
|
|
|
- u8 have_sprd = 0;
|
|
|
-
|
|
|
- if (pllcfgreg == (u32)&SYSCTRL->SYSPLL_CFG) { //360
|
|
|
- SYSCTRL->SYSPLL_SPRD_CTL |= (1 << 30);
|
|
|
- have_sprd = 1;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->AHBPLL_CFG) { //240
|
|
|
- SYSCTRL->AHBPLL_SPRD_CTL |= (1 << 30);
|
|
|
- have_sprd = 1;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->VPUPLL_CFG) { //480
|
|
|
- SYSCTRL->VPUPLL_SPRD_CTL |= (1 << 30);
|
|
|
- have_sprd = 1;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->CPUPLL_CFG) { //800
|
|
|
-// postdiv2 = 1;
|
|
|
-// postdiv1 = 2;
|
|
|
-// refdiv = 3;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->DDRPLL_CFG) { //360
|
|
|
-// postdiv2 = 1;
|
|
|
-// postdiv1 = 2;
|
|
|
-// refdiv = 3;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->MFCPLL_CFG) { //360
|
|
|
-// postdiv2 = 1;
|
|
|
-// postdiv1 = 2;
|
|
|
-// refdiv = 3;
|
|
|
- } else if (pllcfgreg == (u32)&SYSCTRL->GPUPLL_CFG) { //500
|
|
|
-// postdiv2 = 1;
|
|
|
-// postdiv1 = 2;
|
|
|
-// refdiv = 3;
|
|
|
- }
|
|
|
-
|
|
|
- if (ensprd) {
|
|
|
- //refdiv = 24;
|
|
|
- if (!have_sprd) {
|
|
|
- printf("This PLL does not have a spread support.\n");
|
|
|
- refdiv = 3;
|
|
|
- ensprd = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* POSTDIV1 should >= POSTDIV2 */
|
|
|
- fbdiv = (freq * postdiv1 * postdiv2 * refdiv / HSE_Value) & 0xfff; //freq / 2
|
|
|
- if (fbdiv < 16 || fbdiv > 320) {
|
|
|
- printf("clock config error.\n");
|
|
|
- while(1);
|
|
|
- }
|
|
|
-
|
|
|
- vco = HSE_Value / refdiv * fbdiv;
|
|
|
- if (vco < 400000000 || vco > 1600000000) {
|
|
|
- printf("clock config abnormal.\n");
|
|
|
- while(1);
|
|
|
- }
|
|
|
-
|
|
|
- *(u32 *)pllcfgreg = (postdiv2 << 23) | (postdiv1 << 20) | (fbdiv << 8) | refdiv;
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- if (ensprd) {
|
|
|
- if (!CLK_SetSprd(pllcfgreg)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- *(u32 *)pllcfgreg |= (1 << 27);
|
|
|
-}
|
|
|
-
|
|
|
-void SYSCLK_Init(void)
|
|
|
-{
|
|
|
- u32 timeout = 1000;
|
|
|
-
|
|
|
- SYSCTRL->BUS_CLK_CFG &= ~0x3f;
|
|
|
- SYSCTRL->DDR_CTL1_CFG &= ~0x3ffff;
|
|
|
- SYSCTRL->AHBPLL_CFG |= 0xf << 26;
|
|
|
- SYSCTRL->CPUPLL_CFG |= 0xf << 26;
|
|
|
-
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->AHBPLL_CFG, AHBPLL_FREQ, AHBPLL_SPRD_EN);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->CPUPLL_CFG, CPUPLL_FREQ, 0);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->SYSPLL_CFG, SYSPLL_FREQ, SYSPLL_SPRD_EN);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->VPUPLL_CFG, VPUPLL_FREQ, VPUPLL_SPRD_EN);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->DDRPLL_CFG, DDRPLL_FREQ, 0);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->MFCPLL_CFG, MFCPLL_FREQ, 0);
|
|
|
- CLK_SetFreq((u32)&SYSCTRL->GPUPLL_CFG, GPUPLL_FREQ, 0);
|
|
|
-
|
|
|
- /* wait ahppll lock */
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_AHBPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait cpupll lock */
|
|
|
- timeout = 1000;
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_CPUPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait syspll lock */
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_SYSPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait vpupll lock */
|
|
|
- timeout = 1000;
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_VPUPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait ddrpll lock */
|
|
|
- timeout = 1000;
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_DDRPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait mfcpll lock */
|
|
|
- timeout = 1000;
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_MFCPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- /* wait gpupll lock */
|
|
|
- timeout = 1000;
|
|
|
- while (!(SYSCTRL->BOOT_SAMPLE & BOOT_SAMPLE_GPUPLL_LOCK) && timeout--)
|
|
|
- TIMER_Udelay(1);
|
|
|
-
|
|
|
- TIMER_Udelay(500);
|
|
|
-
|
|
|
- /* apbpll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_AHBPLL_EN;
|
|
|
-
|
|
|
- /* cpupll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_CPUPLL_EN;
|
|
|
-
|
|
|
- /* syspll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_SYSPLL_EN;
|
|
|
-
|
|
|
- /* vpupll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_VPUPLL_EN;
|
|
|
-
|
|
|
- /* ddrpll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_DDRPLL_EN;
|
|
|
-
|
|
|
- /* mfcpll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_MFCPLL_EN;
|
|
|
-
|
|
|
- /* gpupll clk en */
|
|
|
- SYSCTRL->DDR_CTL1_CFG |= DDR_CTL1_GPUPLL_EN;
|
|
|
-
|
|
|
- /* switch hclk(mcu cpuclk is hclk) to ahbpll, pclk to hclk/2 */
|
|
|
- SYSCTRL->BUS_CLK_CFG |= (1 << 4) | (1 << 3);
|
|
|
-
|
|
|
- /* switch xclk to syspll, dclk to ddrpll, cclk to cpupll */
|
|
|
- SYSCTRL->BUS_CLK_CFG |= (1 << 2) | (1 << 1 ) | (1 << 0);
|
|
|
-
|
|
|
- TIMER_Udelay(10);
|
|
|
-}
|
|
|
-
|
|
|
-void SPI0_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable spi0 clk
|
|
|
- SYSCTRL->BUS_CLK_EN &= ~(1 << 26);
|
|
|
- SYSCTRL->PER_CLK_EN &= ~(1 << 0);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->CPUPLL_CFG;
|
|
|
- //cpupll work
|
|
|
- if (!((val >> 26) & 0x1) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_CPUPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq , freq);
|
|
|
- if (div > 16) {
|
|
|
- clk_sel = 0;
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 16) {
|
|
|
- printf("spi0 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = SYSCTRL->SSP_CLK_CFG;
|
|
|
- val &= ~0x1f;
|
|
|
- val |= (clk_sel << 4) | (div - 1);
|
|
|
- SYSCTRL->SSP_CLK_CFG = val;
|
|
|
-
|
|
|
- //enable spi0 clk
|
|
|
- SYSCTRL->PER_CLK_EN |= 1 << 0;
|
|
|
- SYSCTRL->BUS_CLK_EN |= 1 << 26;
|
|
|
- TIMER_Udelay(10);
|
|
|
-}
|
|
|
-
|
|
|
-u32 SPI0_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (SYSCTRL->SSP_CLK_CFG & (1 << 4))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->CPUPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- div = (SYSCTRL->SSP_CLK_CFG & 0xf) + 1;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void SPI1_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable spi1 clk
|
|
|
- SYSCTRL->BUS_CLK_EN1 &= ~(1 << 2);
|
|
|
- SYSCTRL->PER_CLK_EN &= ~(1 << 1);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->CPUPLL_CFG;
|
|
|
- //cpupll work
|
|
|
- if (!((val >> 26) & 0x1) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_CPUPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- if (div > 16) {
|
|
|
- clk_sel = 0;
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 16) {
|
|
|
- printf("spi1 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = SYSCTRL->SSP_CLK_CFG;
|
|
|
- val &= ~(0x1f << 16);
|
|
|
- val |= (clk_sel << 20) | ((div - 1) << 16);
|
|
|
- SYSCTRL->SSP_CLK_CFG = val;
|
|
|
-
|
|
|
- //enable spi1 clk
|
|
|
- SYSCTRL->PER_CLK_EN |= 1 << 1;
|
|
|
- SYSCTRL->BUS_CLK_EN1 |= 1 << 2;
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-u32 SPI1_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (SYSCTRL->SSP_CLK_CFG & (1 << 20))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->CPUPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- div = ((SYSCTRL->SSP_CLK_CFG >> 16) & 0xf) + 1;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void SDMMC0_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable sdmmc0 clk
|
|
|
- SYSCTRL->BUS_CLK_EN &= ~(1 << 15);
|
|
|
- SYSCTRL->PER_CLK_EN &= ~(1 << 15);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->AHBPLL_CFG;
|
|
|
- //ahbpll work
|
|
|
- if (!((val >> 26) & 0xf) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_AHBPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- if (div > 32) {
|
|
|
- clk_sel = 0;
|
|
|
- src_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- src_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 32) {
|
|
|
- printf("sdmmc0 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = SYSCTRL->SDMMC_CLK_CFG;
|
|
|
- val &= ~((0x3 << 6) | 0x1f);
|
|
|
- val |= (clk_sel << 7) | (1 << 6) | (div - 1);
|
|
|
- SYSCTRL->SDMMC_CLK_CFG = val;
|
|
|
-
|
|
|
- //enable sdmmc0 clk
|
|
|
- SYSCTRL->PER_CLK_EN |= 1 << 15;
|
|
|
- SYSCTRL->BUS_CLK_EN |= 1 << 15;
|
|
|
- TIMER_Udelay(10);
|
|
|
-}
|
|
|
-
|
|
|
-u32 SDMMC0_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (SYSCTRL->SDMMC_CLK_CFG & (1 << 7))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->AHBPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- if (SYSCTRL->SDMMC_CLK_CFG & (1 << 6)) {
|
|
|
- div = (SYSCTRL->SDMMC_CLK_CFG & 0x1f) + 1;
|
|
|
- } else {
|
|
|
- div = 1;
|
|
|
- }
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void SDMMC1_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable sdmmc1 clk
|
|
|
- SYSCTRL->BUS_CLK_EN &= ~(1 << 16);
|
|
|
- SYSCTRL->PER_CLK_EN &= ~(1 << 31);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->AHBPLL_CFG;
|
|
|
- //ahbpll work
|
|
|
- if (!((val >> 26) & 0xf) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_AHBPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- if (div > 32) {
|
|
|
- clk_sel = 0;
|
|
|
- src_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- src_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(src_freq, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 32) {
|
|
|
- printf("sdmmc0 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = SYSCTRL->SDMMC1_CLK_CFG;
|
|
|
- val &= ~((0x3 << 6) | 0x1f);
|
|
|
- val |= (clk_sel << 7) | (1 << 6) | (div - 1);
|
|
|
- SYSCTRL->SDMMC1_CLK_CFG = val;
|
|
|
-
|
|
|
- //enable sdmmc1 clk
|
|
|
- SYSCTRL->PER_CLK_EN |= 1UL << 31;
|
|
|
- SYSCTRL->BUS_CLK_EN |= 1 << 16;
|
|
|
- TIMER_Udelay(10);
|
|
|
-}
|
|
|
-
|
|
|
-u32 SDMMC1_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (SYSCTRL->SDMMC1_CLK_CFG & (1 << 7))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->AHBPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- if (SYSCTRL->SDMMC1_CLK_CFG & (1 << 6)) {
|
|
|
- div = (SYSCTRL->SDMMC1_CLK_CFG & 0x1f) + 1;
|
|
|
- } else {
|
|
|
- div = 1;
|
|
|
- }
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void CANFD0_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable canfd0 clk
|
|
|
- MCU_SYSCTRL->V6_PER_EN &= ~(1 << 0);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->AHBPLL_CFG;
|
|
|
- //ahbpll work
|
|
|
- if (!((val >> 26) & 0xf) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_CPUPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq , freq);
|
|
|
- if (div > 32) {
|
|
|
- clk_sel = 0;
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 32) {
|
|
|
- printf("canfd0 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = MCU_SYSCTRL->V6_CAN_CLK;
|
|
|
- val &= ~0x3f;
|
|
|
- val |= (clk_sel << 5) | (div - 1);
|
|
|
- MCU_SYSCTRL->V6_CAN_CLK = val;
|
|
|
-
|
|
|
- //enable canfd0 clk
|
|
|
- MCU_SYSCTRL->V6_PER_EN |= 1 << 0;
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-u32 CANFD0_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (MCU_SYSCTRL->V6_CAN_CLK & (1 << 5))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->AHBPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- div = (MCU_SYSCTRL->V6_CAN_CLK & 0x1f) + 1;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void CANFD1_SetBusClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- //disable canfd1 clk
|
|
|
- MCU_SYSCTRL->V6_PER_EN &= ~(1 << 1);
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
- val = SYSCTRL->AHBPLL_CFG;
|
|
|
- //ahbpll work
|
|
|
- if (!((val >> 26) & 0xf) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_CPUPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq , freq);
|
|
|
- if (div > 32) {
|
|
|
- clk_sel = 0;
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 32) {
|
|
|
- printf("canfd0 clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = MCU_SYSCTRL->V6_CAN_CLK;
|
|
|
- val &= ~(0x3f << 6);
|
|
|
- val |= (clk_sel << 11) | ((div - 1) << 6);
|
|
|
- MCU_SYSCTRL->V6_CAN_CLK = val;
|
|
|
-
|
|
|
- //enable canfd1 clk
|
|
|
- MCU_SYSCTRL->V6_PER_EN |= 1 << 1;
|
|
|
- TIMER_Udelay(10);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-u32 CANFD1_GetBusClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (MCU_SYSCTRL->V6_CAN_CLK & (1 << 11))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->AHBPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- div = ((MCU_SYSCTRL->V6_CAN_CLK >> 6) & 0x1f) + 1;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void ADC0_SetClk(u32 freq)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(source_freq , freq);
|
|
|
-
|
|
|
- div = div / 2 - 1;
|
|
|
- if (div > 0x7fff)
|
|
|
- div = 0x7fff;
|
|
|
-
|
|
|
- SYSCTRL->TIMER_CLK_CFG &= ~(0x7fff << 16);
|
|
|
- SYSCTRL->TIMER_CLK_CFG |= (div << 16);
|
|
|
-}
|
|
|
-
|
|
|
-u32 ADC0_GetClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = (((SYSCTRL->TIMER_CLK_CFG >> 16) & 0x7fff) + 1) * 2;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void ADC1_SetClk(u32 freq)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(source_freq , freq);
|
|
|
-
|
|
|
- div = div / 2 - 1;
|
|
|
- if (div > 0x7fff)
|
|
|
- div = 0x7fff;
|
|
|
-
|
|
|
- SYSCTRL->ADC_CLK1_CFG &= ~(0x7fff << 0);
|
|
|
- SYSCTRL->ADC_CLK1_CFG |= (div << 0);
|
|
|
-}
|
|
|
-
|
|
|
-u32 ADC1_GetClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = (((SYSCTRL->ADC_CLK1_CFG >> 0) & 0x7fff) + 1) * 2;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void ADC2_SetClk(u32 freq)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = DIV_ROUND_UP(source_freq , freq);
|
|
|
-
|
|
|
- div = div / 2 - 1;
|
|
|
- if (div > 0x7fff)
|
|
|
- div = 0x7fff;
|
|
|
-
|
|
|
- SYSCTRL->ADC_CLK1_CFG &= ~(0x7fff << 16);
|
|
|
- SYSCTRL->ADC_CLK1_CFG |= (div << 16);
|
|
|
-}
|
|
|
-
|
|
|
-u32 ADC2_GetClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- source_freq = HSE_Value;
|
|
|
- div = (((SYSCTRL->ADC_CLK1_CFG >> 16) & 0x7fff) + 1) * 2;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|
|
|
-
|
|
|
-void PWM_SetClk(u32 freq)
|
|
|
-{
|
|
|
- u32 src_freq;
|
|
|
- u32 div;
|
|
|
- u32 val;
|
|
|
- u32 clk_sel = 0;
|
|
|
-
|
|
|
- val = SYSCTRL->SYSPLL_CFG;
|
|
|
- //syspll work
|
|
|
- if (!((val >> 26) & 0x1) && (SYSCTRL->DDR_CTL1_CFG & DDR_CTL1_SYSPLL_EN)) {
|
|
|
- src_freq = CLK_GetPLLFreq(val);
|
|
|
- clk_sel = 1;
|
|
|
- div = DIV_ROUND_UP(src_freq , freq);
|
|
|
- if (div > 16) {
|
|
|
- clk_sel = 0;
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
- } else {
|
|
|
- div = DIV_ROUND_UP(HSE_Value, freq);
|
|
|
- }
|
|
|
-
|
|
|
- if (div > 16) {
|
|
|
- printf("pwm clk is too small, unsupported.\r\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- val = SYSCTRL->PER_CLK_CFG;
|
|
|
- val &= ~(0x1f << 4);
|
|
|
- val |= ((clk_sel << 4) | (div - 1)) << 4;
|
|
|
- SYSCTRL->PER_CLK_CFG = val;
|
|
|
-}
|
|
|
-
|
|
|
-u32 PWM_GetClk(void)
|
|
|
-{
|
|
|
- u32 source_freq;
|
|
|
- u32 div;
|
|
|
-
|
|
|
- if (SYSCTRL->PER_CLK_CFG & (1 << 8))
|
|
|
- source_freq = CLK_GetPLLFreq(SYSCTRL->SYSPLL_CFG);
|
|
|
- else
|
|
|
- source_freq = HSE_Value;
|
|
|
-
|
|
|
- div = ((SYSCTRL->PER_CLK_CFG >> 4) & 0xf) + 1;
|
|
|
-
|
|
|
- return source_freq / div;
|
|
|
-}
|