xref: /nrf52832-nimble/rt-thread/libcpu/arm/sep4020/clk.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2010-03-20     zchong      first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero #include "sep4020.h"
13*10465441SEvalZero 
14*10465441SEvalZero #define	CLK_IN	        4000000		/* Fin = 4.00MHz  */
15*10465441SEvalZero #define SYSCLK		    72000000	/* system clock we want */
16*10465441SEvalZero 
17*10465441SEvalZero #define CLK_ESRAM		0
18*10465441SEvalZero #define CLK_LCDC		1
19*10465441SEvalZero #define CLK_PWM			2
20*10465441SEvalZero #define CLK_DMAC		3
21*10465441SEvalZero #define CLK_EMI			4
22*10465441SEvalZero #define CLK_MMCSD		5
23*10465441SEvalZero #define CLK_SSI			7
24*10465441SEvalZero #define CLK_UART0		8
25*10465441SEvalZero #define CLK_UART1		9
26*10465441SEvalZero #define CLK_UART2		10
27*10465441SEvalZero #define CLK_UART3		11
28*10465441SEvalZero #define CLK_USB			12
29*10465441SEvalZero #define CLK_MAC			13
30*10465441SEvalZero #define CLK_SMC			14
31*10465441SEvalZero #define CLK_I2C			15
32*10465441SEvalZero #define CLK_GPT			16
33*10465441SEvalZero 
rt_hw_set_system_clock(void)34*10465441SEvalZero static void rt_hw_set_system_clock(void)
35*10465441SEvalZero {
36*10465441SEvalZero 	rt_uint8_t pv;
37*10465441SEvalZero 
38*10465441SEvalZero 	/* pv value*/
39*10465441SEvalZero 	pv  = SYSCLK/2/CLK_IN;
40*10465441SEvalZero 	/* go to normal mode*/
41*10465441SEvalZero 	*(RP)PMU_PMDR = 0x01;
42*10465441SEvalZero 	/* set the clock */
43*10465441SEvalZero 	*(RP)PMU_PMCR = 0x4000 | pv;
44*10465441SEvalZero 	/* trige configurate*/
45*10465441SEvalZero 	*(RP)PMU_PMCR = 0xc000 | pv;
46*10465441SEvalZero }
47*10465441SEvalZero 
rt_hw_set_usb_clock(void)48*10465441SEvalZero static void rt_hw_set_usb_clock(void)
49*10465441SEvalZero {
50*10465441SEvalZero 	/* set the clock */
51*10465441SEvalZero 	*(RP)PMU_PUCR = 0x000c;
52*10465441SEvalZero 	/* trige configurate*/
53*10465441SEvalZero 	*(RP)PMU_PMCR = 0x800c;
54*10465441SEvalZero 
55*10465441SEvalZero }
56*10465441SEvalZero 
57*10465441SEvalZero /**
58*10465441SEvalZero  * @brief System Clock Configuration
59*10465441SEvalZero  */
rt_hw_clock_init(void)60*10465441SEvalZero void rt_hw_clock_init(void)
61*10465441SEvalZero {
62*10465441SEvalZero 	/* set system clock */
63*10465441SEvalZero 	rt_hw_set_system_clock();
64*10465441SEvalZero 	/* set usb clock */
65*10465441SEvalZero 	rt_hw_set_usb_clock();
66*10465441SEvalZero }
67*10465441SEvalZero 
68*10465441SEvalZero /**
69*10465441SEvalZero  * @brief Get system clock
70*10465441SEvalZero  */
rt_hw_get_clock(void)71*10465441SEvalZero rt_uint32_t rt_hw_get_clock(void)
72*10465441SEvalZero {
73*10465441SEvalZero 	rt_uint32_t val;
74*10465441SEvalZero 	rt_uint8_t pv, pd, npd;
75*10465441SEvalZero 
76*10465441SEvalZero 	/* get PMCR value */
77*10465441SEvalZero 	val =*(RP) PMU_PMCR;
78*10465441SEvalZero 	/* get NPD */
79*10465441SEvalZero 	npd = (val >> 14) & 0x01;
80*10465441SEvalZero 	/* get PD  */
81*10465441SEvalZero 	pd  = (val >> 10) & 0x0f;
82*10465441SEvalZero 	/* get PV  */
83*10465441SEvalZero 	pv  = val & 0x7f;
84*10465441SEvalZero 	/* caculate the system clock */
85*10465441SEvalZero 	if(npd)
86*10465441SEvalZero 		val = 2 * CLK_IN * pv;
87*10465441SEvalZero 	else
88*10465441SEvalZero 		val = CLK_IN * pv / (pd + 1);
89*10465441SEvalZero 
90*10465441SEvalZero     return(val);
91*10465441SEvalZero }
92*10465441SEvalZero 
93*10465441SEvalZero /**
94*10465441SEvalZero  * @brief Enable module clock
95*10465441SEvalZero  */
rt_hw_enable_module_clock(rt_uint8_t module)96*10465441SEvalZero  void rt_hw_enable_module_clock(rt_uint8_t module)
97*10465441SEvalZero  {
98*10465441SEvalZero 
99*10465441SEvalZero  }
100*10465441SEvalZero 
101*10465441SEvalZero /**
102*10465441SEvalZero  * @brief Disable module clock
103*10465441SEvalZero  */
rt_hw_disable_module_clock(rt_uint8_t module)104*10465441SEvalZero   void rt_hw_disable_module_clock(rt_uint8_t module)
105*10465441SEvalZero  {
106*10465441SEvalZero 
107*10465441SEvalZero  }
108*10465441SEvalZero 
109