|
102 | 102 | /* HSI base frequency */ |
103 | 103 | #define HSI_FREQ 64000000UL |
104 | 104 |
|
105 | | -/* |
106 | | - * Compute the input reference frequency for PLL source selection. |
107 | | - * Returns the HSI frequency accounting for the divider if HSI is selected. |
108 | | - */ |
109 | | -static size_t Stm32h5Rcc_GetPllInputFreq(size_t rccBase, |
110 | | - whal_Stm32h5Rcc_PllClockSrc src) |
111 | | -{ |
112 | | - size_t hsidiv; |
113 | | - |
114 | | - switch (src) { |
115 | | - case WHAL_STM32H5_RCC_PLLCLK_SRC_HSI: |
116 | | - whal_Reg_Get(rccBase, RCC_CR_REG, RCC_CR_HSIDIV_Msk, |
117 | | - RCC_CR_HSIDIV_Pos, &hsidiv); |
118 | | - return HSI_FREQ >> hsidiv; |
119 | | - case WHAL_STM32H5_RCC_PLLCLK_SRC_CSI: |
120 | | - return 4000000; |
121 | | - case WHAL_STM32H5_RCC_PLLCLK_SRC_HSE: |
122 | | - return 8000000; /* TODO: Make configurable per board */ |
123 | | - default: |
124 | | - return 0; |
125 | | - } |
126 | | -} |
127 | | - |
128 | 105 | whal_Error whal_Stm32h5RccPll_Init(whal_Clock *clkDev) |
129 | 106 | { |
130 | 107 | whal_Stm32h5Rcc_Cfg *cfg; |
@@ -333,71 +310,18 @@ whal_Error whal_Stm32h5Rcc_Disable(whal_Clock *clkDev, const void *clk) |
333 | 310 | return WHAL_SUCCESS; |
334 | 311 | } |
335 | 312 |
|
336 | | -whal_Error whal_Stm32h5RccPll_GetRate(whal_Clock *clkDev, size_t *rateOut) |
337 | | -{ |
338 | | - whal_Stm32h5Rcc_Cfg *cfg; |
339 | | - whal_Stm32h5Rcc_PllClkCfg *pllCfg; |
340 | | - size_t srcFreq; |
341 | | - size_t pllm; |
342 | | - size_t plln; |
343 | | - size_t pllp; |
344 | | - |
345 | | - if (!clkDev || !clkDev->cfg || !rateOut) |
346 | | - return WHAL_EINVAL; |
347 | | - |
348 | | - cfg = (whal_Stm32h5Rcc_Cfg *)clkDev->cfg; |
349 | | - pllCfg = (whal_Stm32h5Rcc_PllClkCfg *)cfg->sysClkCfg; |
350 | | - |
351 | | - srcFreq = Stm32h5Rcc_GetPllInputFreq(clkDev->regmap.base, pllCfg->clkSrc); |
352 | | - if (srcFreq == 0) |
353 | | - return WHAL_EINVAL; |
354 | | - |
355 | | - /* |
356 | | - * PLL1 output (pll1_p_ck): |
357 | | - * f_vco = (f_src / m) * (n + 1) |
358 | | - * f_pllp = f_vco / (p + 1) |
359 | | - * |
360 | | - * PLL1M: register value is the divisor directly (1-63, 0=disabled) |
361 | | - * PLL1N: register value + 1 is the multiplier (3=4x, 4=5x, ...) |
362 | | - * PLL1P: register value + 1 is the divisor (1=/2, 2=/3, ...) |
363 | | - */ |
364 | | - pllm = pllCfg->m; |
365 | | - plln = pllCfg->n + 1; |
366 | | - pllp = pllCfg->p + 1; |
367 | | - |
368 | | - *rateOut = ((srcFreq / pllm) * plln) / pllp; |
369 | | - return WHAL_SUCCESS; |
370 | | -} |
371 | | - |
372 | | -whal_Error whal_Stm32h5RccHsi_GetRate(whal_Clock *clkDev, size_t *rateOut) |
373 | | -{ |
374 | | - size_t hsidiv; |
375 | | - |
376 | | - if (!clkDev || !rateOut) |
377 | | - return WHAL_EINVAL; |
378 | | - |
379 | | - whal_Reg_Get(clkDev->regmap.base, RCC_CR_REG, RCC_CR_HSIDIV_Msk, |
380 | | - RCC_CR_HSIDIV_Pos, &hsidiv); |
381 | | - |
382 | | - /* HSI divider: 0=div1(64MHz), 1=div2(32MHz), 2=div4(16MHz), 3=div8(8MHz) */ |
383 | | - *rateOut = HSI_FREQ >> hsidiv; |
384 | | - return WHAL_SUCCESS; |
385 | | -} |
386 | | - |
387 | 313 | const whal_ClockDriver whal_Stm32h5RccPll_Driver = { |
388 | 314 | .Init = whal_Stm32h5RccPll_Init, |
389 | 315 | .Deinit = whal_Stm32h5RccPll_Deinit, |
390 | 316 | .Enable = whal_Stm32h5Rcc_Enable, |
391 | 317 | .Disable = whal_Stm32h5Rcc_Disable, |
392 | | - .GetRate = whal_Stm32h5RccPll_GetRate, |
393 | 318 | }; |
394 | 319 |
|
395 | 320 | const whal_ClockDriver whal_Stm32h5RccHsi_Driver = { |
396 | 321 | .Init = whal_Stm32h5RccHsi_Init, |
397 | 322 | .Deinit = whal_Stm32h5RccHsi_Deinit, |
398 | 323 | .Enable = whal_Stm32h5Rcc_Enable, |
399 | 324 | .Disable = whal_Stm32h5Rcc_Disable, |
400 | | - .GetRate = whal_Stm32h5RccHsi_GetRate, |
401 | 325 | }; |
402 | 326 |
|
403 | 327 | whal_Error whal_Stm32h5Rcc_Ext_EnableHsi48(whal_Clock *clkDev, uint8_t enable) |
|
0 commit comments