embox

Форк
0
268 строк · 11.6 Кб
1
/**
2
 * @file
3
 *
4
 * @date Jan 24, 2023
5
 * @author Anton Bondarev
6
 */
7
#include <stddef.h>
8
#include <stdint.h>
9

10
#include "eliot1_board.h"
11
#include "hal_clkctr.h"
12

13
#include "clkctr.h"
14

15
/* ========================================================  PLLCFG  ========================================================= */
16
#define CLKCTR_PLLCFG_SEL_Pos             (0UL)                     /*!< SEL (Bit 0)                                           */
17
#define CLKCTR_PLLCFG_SEL_Msk             (0x1ffUL)                 /*!< SEL (Bitfield-Mask: 0x1ff)                            */
18
#define CLKCTR_PLLCFG_MAN_Pos             (9UL)                     /*!< MAN (Bit 9)                                           */
19
#define CLKCTR_PLLCFG_MAN_Msk             (0x200UL)                 /*!< MAN (Bitfield-Mask: 0x01)                             */
20
#define CLKCTR_PLLCFG_OD_MAN_Pos          (10UL)                    /*!< OD_MAN (Bit 10)                                       */
21
#define CLKCTR_PLLCFG_OD_MAN_Msk          (0x3c00UL)                /*!< OD_MAN (Bitfield-Mask: 0x0f)                          */
22
#define CLKCTR_PLLCFG_NF_MAN_Pos          (14UL)                    /*!< NF_MAN (Bit 14)                                       */
23
#define CLKCTR_PLLCFG_NF_MAN_Msk          (0x7ffc000UL)             /*!< NF_MAN (Bitfield-Mask: 0x1fff)                        */
24
#define CLKCTR_PLLCFG_NR_MAN_Pos          (27UL)                    /*!< NR_MAN (Bit 27)                                       */
25
#define CLKCTR_PLLCFG_NR_MAN_Msk          (0x78000000UL)            /*!< NR_MAN (Bitfield-Mask: 0x0f)                          */
26
#define CLKCTR_PLLCFG_LOCK_Pos            (31UL)                    /*!< LOCK (Bit 31)                                         */
27
#define CLKCTR_PLLCFG_LOCK_Msk            (0x80000000UL)            /*!< LOCK (Bitfield-Mask: 0x01)                            */
28

29
/* ==========================================================  CFG  ========================================================== */
30
#define CLKCTR_CFG_FCLK_SCALE_EN_Pos      (0UL)                     /*!< FCLK_SCALE_EN (Bit 0)                                 */
31
#define CLKCTR_CFG_FCLK_SCALE_EN_Msk      (0x1UL)                   /*!< FCLK_SCALE_EN (Bitfield-Mask: 0x01)                   */
32
#define CLKCTR_CFG_MAINCLK_SEL_Pos        (4UL)                     /*!< MAINCLK_SEL (Bit 4)                                   */
33
#define CLKCTR_CFG_MAINCLK_SEL_Msk        (0x30UL)                  /*!< MAINCLK_SEL (Bitfield-Mask: 0x03)                     */
34
#define CLKCTR_CFG_PLLREF_SEL_Pos         (6UL)                     /*!< PLLREF_SEL (Bit 6)                                    */
35
#define CLKCTR_CFG_PLLREF_SEL_Msk         (0x40UL)                  /*!< PLLREF_SEL (Bitfield-Mask: 0x01)                      */
36
#define CLKCTR_CFG_USBCLK_SEL_Pos         (7UL)                     /*!< USBCLK_SEL (Bit 7)                                    */
37
#define CLKCTR_CFG_USBCLK_SEL_Msk         (0x80UL)                  /*!< USBCLK_SEL (Bitfield-Mask: 0x01)                      */
38
#define CLKCTR_CFG_I2SCLK_SEL_Pos         (8UL)                     /*!< I2SCLK_SEL (Bit 8)                                    */
39
#define CLKCTR_CFG_I2SCLK_SEL_Msk         (0x100UL)                 /*!< I2SCLK_SEL (Bitfield-Mask: 0x01)                      */
40
#define CLKCTR_CFG_MCO_SEL_Pos            (9UL)                     /*!< MCO_SEL (Bit 9)                                       */
41
#define CLKCTR_CFG_MCO_SEL_Msk            (0xe00UL)                 /*!< MCO_SEL (Bitfield-Mask: 0x07)                         */
42
#define CLKCTR_CFG_MCO_EN_Pos             (13UL)                    /*!< MCO_EN (Bit 13)                                       */
43
#define CLKCTR_CFG_MCO_EN_Msk             (0x2000UL)                /*!< MCO_EN (Bitfield-Mask: 0x01)                          */
44

45

46
/* ========================================================  FCLKDIV  ======================================================== */
47
#define CLKCTR_FCLKDIV_FCLKDIV_Pos        (0UL)                     /*!< FCLKDIV (Bit 0)                                       */
48
#define CLKCTR_FCLKDIV_FCLKDIV_Msk        (0x1fUL)                  /*!< FCLKDIV (Bitfield-Mask: 0x1f)                         */
49
#define CLKCTR_FCLKDIV_FCLKDIV_CUR_Pos    (16UL)                    /*!< FCLKDIV_CUR (Bit 16)                                  */
50
#define CLKCTR_FCLKDIV_FCLKDIV_CUR_Msk    (0x1f0000UL)              /*!< FCLKDIV_CUR (Bitfield-Mask: 0x1f)                     */
51
/* =======================================================  SYSCLKDIV  ======================================================= */
52
#define CLKCTR_SYSCLKDIV_STSCLKDIV_Pos    (0UL)                     /*!< STSCLKDIV (Bit 0)                                     */
53
#define CLKCTR_SYSCLKDIV_STSCLKDIV_Msk    (0x1fUL)                  /*!< STSCLKDIV (Bitfield-Mask: 0x1f)                       */
54
#define CLKCTR_SYSCLKDIV_STSCLKDIV_CUR_Pos (16UL)                   /*!< STSCLKDIV_CUR (Bit 16)                                */
55
#define CLKCTR_SYSCLKDIV_STSCLKDIV_CUR_Msk (0x1f0000UL)             /*!< STSCLKDIV_CUR (Bitfield-Mask: 0x1f)                   */
56
/* ======================================================  QSPICLKDIV  ======================================================= */
57
#define CLKCTR_QSPICLKDIV_QSPICLKDIV_Pos  (0UL)                     /*!< QSPICLKDIV (Bit 0)                                    */
58
#define CLKCTR_QSPICLKDIV_QSPICLKDIV_Msk  (0x1fUL)                  /*!< QSPICLKDIV (Bitfield-Mask: 0x1f)                      */
59
#define CLKCTR_QSPICLKDIV_QSPICLKDIV_CUR_Pos (16UL)                 /*!< QSPICLKDIV_CUR (Bit 16)                               */
60
#define CLKCTR_QSPICLKDIV_QSPICLKDIV_CUR_Msk (0x1f0000UL)           /*!< QSPICLKDIV_CUR (Bitfield-Mask: 0x1f)                  */
61

62
/* ======================================================  GNSSCLKDIV  ======================================================= */
63
#define CLKCTR_GNSSCLKDIV_GNSSCLKDIV_Pos  (0UL)                     /*!< GNSSCLKDIV (Bit 0)                                    */
64
#define CLKCTR_GNSSCLKDIV_GNSSCLKDIV_Msk  (0x7UL)                   /*!< GNSSCLKDIV (Bitfield-Mask: 0x07)                      */
65
#define CLKCTR_GNSSCLKDIV_GNSSCLKDIV_CUR_Pos (16UL)                 /*!< GNSSCLKDIV_CUR (Bit 16)                               */
66
#define CLKCTR_GNSSCLKDIV_GNSSCLKDIV_CUR_Msk (0x70000UL)            /*!< GNSSCLKDIV_CUR (Bitfield-Mask: 0x07)                  */
67

68
#define CLKCTR_FORCE_CLK_DEV_EN 1
69

70

71
#define CLKCTR_PLL_CFG_NR_MAN(x) \
72
	(((x) << CLKCTR_PLLCFG_NR_MAN_Pos) & CLKCTR_PLLCFG_NR_MAN_Msk)
73
#define CLKCTR_PLL_CFG_NF_MAN(x) \
74
	(((x) << CLKCTR_PLLCFG_NF_MAN_Pos) & CLKCTR_PLLCFG_NF_MAN_Msk)
75
#define CLKCTR_PLL_CFG_OD_MAN(x) \
76
	(((x) << CLKCTR_PLLCFG_OD_MAN_Pos) & CLKCTR_PLLCFG_OD_MAN_Msk)
77
#define CLKCTR_PLL_CFG_MAN(x) \
78
	(((x)<< CLKCTR_PLLCFG_MAN_Pos) & CLKCTR_PLLCFG_MAN_Msk)
79
#define CLKCTR_PLL_CFG_SEL(x) \
80
	(((x) << CLKCTR_PLLCFG_SEL_Pos) & CLKCTR_PLLCFG_SEL_Msk)
81

82

83
static uint32_t MAINCLK_FREQUENCY = BOARD_HFI_FREQUENCY;
84

85
int clkctr_get_pll_config(struct clkctr_regs *base,
86
		struct clkctr_pll_cfg *config) {
87
	uint32_t reg = base->PLLCFG;
88

89
	config->lock = (reg & CLKCTR_PLLCFG_LOCK_Msk) >> CLKCTR_PLLCFG_LOCK_Pos;
90
	config->nr_man = (reg & CLKCTR_PLLCFG_NR_MAN_Msk)
91
			>> CLKCTR_PLLCFG_NR_MAN_Pos;
92
	config->nf_man = (reg & CLKCTR_PLLCFG_NF_MAN_Msk)
93
			>> CLKCTR_PLLCFG_NF_MAN_Pos;
94
	config->od_man = (reg & CLKCTR_PLLCFG_OD_MAN_Msk)
95
			>> CLKCTR_PLLCFG_OD_MAN_Pos;
96
	config->man = (reg & CLKCTR_PLLCFG_MAN_Msk) >> CLKCTR_PLLCFG_MAN_Pos;
97
	config->sel = (reg & CLKCTR_PLLCFG_SEL_Msk) >> CLKCTR_PLLCFG_SEL_Pos;
98

99
	return 0;
100
}
101

102
int clkctr_set_pll_config(struct clkctr_regs *base,
103
		struct clkctr_pll_cfg config) {
104
	uint32_t pll_cfg = CLKCTR_PLL_CFG_NR_MAN(
105
			config.nr_man) | CLKCTR_PLL_CFG_NF_MAN(config.nr_man)
106
			| CLKCTR_PLL_CFG_OD_MAN(config.od_man)
107
			| CLKCTR_PLL_CFG_MAN(config.man)
108
			| CLKCTR_PLL_CFG_SEL(config.sel);
109

110
	if (config.sel != 0) {
111
		/* stop PLL. */
112
		base->PLLCFG = 0;
113
		/* start PLL. */
114
		base->PLLCFG = pll_cfg;
115
		while ((base->PLLCFG & CLKCTR_PLLCFG_LOCK_Msk) == 0) {
116
			;
117
		}
118
	} else {
119
		base->PLLCFG = pll_cfg;
120
	}
121

122
	return 0;
123
}
124

125
int clkctr_set_switch_main_clk(struct clkctr_regs *base, uint32_t value) {
126
	uint32_t cfgReg = base->CFG;
127

128
	cfgReg &= ~CLKCTR_CFG_MAINCLK_SEL_Msk;
129
	cfgReg |= (value << CLKCTR_CFG_MAINCLK_SEL_Pos);
130
	base->CFG = cfgReg;
131

132
	return 0;
133
}
134

135
int clkctr_set_switch_pll_ref(struct clkctr_regs *base, uint32_t value) {
136
	uint32_t cfgReg = base->CFG;
137

138
	cfgReg &= ~(CLKCTR_CFG_PLLREF_SEL_Msk);
139
	cfgReg |= (value << CLKCTR_CFG_PLLREF_SEL_Pos);
140
	base->CFG = cfgReg;
141

142
	return 0;
143
}
144

145
void clkctr_set_pll(struct clkctr_regs *base, uint32_t xti_hz, uint16_t pll_mul) {
146
	struct clkctr_pll_cfg config;
147

148
	clkctr_set_switch_main_clk(base, CLKCTR_CLK_TYPE_HFI);
149
	clkctr_get_pll_config(base, &config);
150
	config.sel = 0;
151
	clkctr_set_pll_config(base, config);
152

153
	/* PLLCLK (HFI or XTI). */
154
	if (xti_hz == 0) {
155
		clkctr_set_switch_pll_ref(base, CLKCTR_CLK_TYPE_HFI);
156
		MAINCLK_FREQUENCY = BOARD_HFI_FREQUENCY;
157
	} else {
158
		clkctr_set_switch_pll_ref(base, CLKCTR_CLK_TYPE_XTI);
159
		MAINCLK_FREQUENCY = xti_hz;
160
	}
161

162
	if (pll_mul > PLL_MAX_MULTIPLIER) {
163
		pll_mul = PLL_MAX_MULTIPLIER;
164
	}
165

166
	if ((MAINCLK_FREQUENCY * (pll_mul + 1)) > CLKCTR_PLLCLK_MAX) {
167
		pll_mul = (CLKCTR_PLLCLK_MAX / MAINCLK_FREQUENCY) - 1;
168
	}
169

170
	if ((MAINCLK_FREQUENCY * (pll_mul + 1)) < CLKCTR_PLLCLK_OD_MIN) {
171
		pll_mul = PLL_MIN_MULTIPLIER;
172
	}
173

174
	if (pll_mul > PLL_MIN_MULTIPLIER) {
175
		clkctr_get_pll_config(base, &config);
176
		config.man = 0;
177
		config.sel = pll_mul;
178
		clkctr_set_pll_config(base, config);
179
		clkctr_set_switch_main_clk(base, CLKCTR_CLK_TYPE_PLL);
180
		MAINCLK_FREQUENCY = MAINCLK_FREQUENCY * (pll_mul + 1);
181
	}
182
}
183

184
uint32_t clk_get_sys_clk_div(struct clkctr_regs *base) {
185
	return ((base->SYSCLKDIV & CLKCTR_SYSCLKDIV_STSCLKDIV_Msk)
186
			>> CLKCTR_SYSCLKDIV_STSCLKDIV_Pos) + 1;
187
}
188

189
uint32_t clkctr_set_sys_clk_div(struct clkctr_regs *base, uint32_t value) {
190

191
	base->SYSCLKDIV = ((value - 1) << CLKCTR_SYSCLKDIV_STSCLKDIV_Pos)
192
			& CLKCTR_SYSCLKDIV_STSCLKDIV_Msk;
193

194
	while (clk_get_sys_clk_div(base) != value)
195
		;
196

197
	return value;
198
}
199

200
uint32_t clkctr_get_fclk_div(struct clkctr_regs *base) {
201
	return ((base->FCLKDIV & CLKCTR_FCLKDIV_FCLKDIV_Msk)
202
			>> CLKCTR_FCLKDIV_FCLKDIV_Pos) + 1;
203
}
204

205
uint32_t clkctr_set_fclk_div(struct clkctr_regs *base, uint32_t value) {
206

207
	base->FCLKDIV = ((value - 1) << CLKCTR_FCLKDIV_FCLKDIV_Pos)
208
			& CLKCTR_FCLKDIV_FCLKDIV_Msk;
209

210
	while (clkctr_get_fclk_div(base) != value) {
211
		;
212
	}
213

214
	return value;
215
}
216

217
uint32_t clkctr_get_qspi_clk_div(struct clkctr_regs *base) {
218
	return ((base->QSPICLKDIV & CLKCTR_QSPICLKDIV_QSPICLKDIV_Msk)
219
			>> CLKCTR_QSPICLKDIV_QSPICLKDIV_Pos) + 1;
220
}
221

222
uint32_t clkctr_set_qspi_clk_div(struct clkctr_regs *base, uint32_t value) {
223

224
	base->QSPICLKDIV = ((value - 1) << CLKCTR_QSPICLKDIV_QSPICLKDIV_Pos)
225
			& CLKCTR_QSPICLKDIV_QSPICLKDIV_Msk;
226

227
	while (clkctr_get_qspi_clk_div(base) != value) {
228
		;
229
	}
230

231
	return value;
232
}
233

234
uint32_t clkctr_set_gnss_clk_div(struct clkctr_regs *base, uint32_t value) {
235

236
	base->GNSSCLKDIV = ((value - 1) << CLKCTR_GNSSCLKDIV_GNSSCLKDIV_Pos)
237
			& CLKCTR_GNSSCLKDIV_GNSSCLKDIV_Msk;
238

239
#ifdef CLKCTR_NO_GNNS_BUG_ELIOT1RTL_2
240
    while (CLKCTR_GetGNSSClkDiv(base) != value)
241
        ;
242
#endif
243

244
	return value;
245
}
246

247
void clkctr_set_sys_div(struct clkctr_regs *base, uint16_t fclk_div,
248
		uint16_t sysclk_div, uint16_t gnssclk_div, uint16_t qspiclk_div) {
249
	if (sysclk_div > CLKCTR_MAX_SYSCLK_DIV) {
250
		sysclk_div = CLKCTR_MAX_SYSCLK_DIV;
251
	}
252
	clkctr_set_sys_clk_div(base, sysclk_div + 1);
253

254
	if (fclk_div > CLKCTR_MAX_FCLK_DIV) {
255
		fclk_div = CLKCTR_MAX_FCLK_DIV;
256
	}
257
	clkctr_set_fclk_div(base, fclk_div + 1);
258

259
	if (gnssclk_div > CLKCTR_MAX_GNSSCLK_DIV) {
260
		gnssclk_div = CLKCTR_MAX_GNSSCLK_DIV;
261
	}
262
	clkctr_set_gnss_clk_div(base, gnssclk_div + 1);
263

264
	if (qspiclk_div > CLKCTR_MAX_QSPICLK_DIV) {
265
		qspiclk_div = CLKCTR_MAX_QSPICLK_DIV;
266
	}
267
	clkctr_set_qspi_clk_div(base, qspiclk_div + 1);
268
}
269

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.