Skip to content

Commit acd8cb1

Browse files
FRASTMkartben
authored andcommitted
tests: drivers: clock: stm32 common device for sdmmc
Add a testcase for the stm32F412 or stm32F413 configuring the SDIO clock at 48MHz from the PLLI2S Tested on the stm32f413h disco kit. Signed-off-by: Francois Ramu <[email protected]>
1 parent f1a4928 commit acd8cb1

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2024 STMicroelectronics
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/* Node is disabled by default unless the PLL_I2S is enabled */
8+
&clk48 {
9+
/* select one source for the clk48MHz domain clock */
10+
/* clocks = <&rcc STM32_SRC_PLL_Q CK48M_SEL(0)>;*/
11+
clocks = <&rcc STM32_SRC_PLLI2S_Q CK48M_SEL(1)>;
12+
status = "okay";
13+
};
14+
15+
&plli2s {
16+
div-m = <4>;
17+
mul-n = <96>;
18+
div-q = <4>;
19+
div-r = <2>;
20+
clocks = <&clk_hse>;
21+
status = "okay";
22+
};
23+
24+
&sdmmc1 {
25+
clocks = <&rcc STM32_CLOCK(APB2, 11U)>,
26+
/* select one source for the sdmmc domain clock */
27+
<&rcc STM32_SRC_SYSCLK SDIO_SEL(1)>;
28+
/* <&rcc STM32_SRC_CK48 SDIO_SEL(0)>; */
29+
pinctrl-0 = <&sdio_cmd_pa6 &sdio_ck_pc12
30+
&sdio_d0_pc8 &sdio_d1_pc9
31+
&sdio_d2_pc10 &sdio_d3_pc11>;
32+
pinctrl-names = "default";
33+
status = "okay";
34+
};
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/*
2+
* Copyright (c) 2024 STMicroelectronics
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/ztest.h>
8+
#include <soc.h>
9+
#include <zephyr/drivers/clock_control.h>
10+
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
11+
#include <zephyr/logging/log.h>
12+
13+
#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sdmmc1))
14+
15+
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32_sdmmc)
16+
#define DT_DRV_COMPAT st_stm32_sdmmc1
17+
#endif
18+
19+
#if !DT_HAS_COMPAT_STATUS_OKAY(st_stm32_clock_mux)
20+
#warning "Missing clock 48MHz"
21+
#endif
22+
23+
#if !DT_HAS_COMPAT_STATUS_OKAY(st_stm32f411_plli2s_clock)
24+
#warning "Missing clock I2S PLL clock"
25+
#endif
26+
27+
#include "stm32_ll_rcc.h"
28+
29+
ZTEST(stm32_common_devices_clocks, test_sdmmc_clk_config)
30+
{
31+
static const struct stm32_pclken pclken[] = STM32_DT_CLOCKS(DT_NODELABEL(sdmmc1));
32+
33+
uint32_t dev_dt_clk_freq, dev_actual_clk_freq;
34+
uint32_t dev_actual_clk_src;
35+
int r;
36+
37+
/* Test clock_on(gating clock) */
38+
r = clock_control_on(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
39+
(clock_control_subsys_t) &pclken[0]);
40+
zassert_true((r == 0), "Could not enable SDMMC gating clock");
41+
42+
zassert_true(__HAL_RCC_SDIO_IS_CLK_ENABLED(), "SDMMC gating clock should be on");
43+
TC_PRINT("SDMMC gating clock on\n");
44+
45+
zassert_true((DT_NUM_CLOCKS(DT_NODELABEL(sdmmc1)) > 1), "No domain clock defined in dts");
46+
47+
if (pclken[1].bus == STM32_SRC_CK48) {
48+
/* CLK 48 is enabled through the clock-mux */
49+
zassert_true(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(clk48)), "No clock 48MHz");
50+
r = 0;
51+
} else if (pclken[1].bus == STM32_SRC_SYSCLK) {
52+
/* Test clock_on(domain_clk) STM32_SRC_SYSCLK */
53+
r = clock_control_configure(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
54+
(clock_control_subsys_t) &pclken[1],
55+
NULL);
56+
} else {
57+
r = -127;
58+
}
59+
60+
zassert_true((r == 0), "Could not enable SDMMC domain clock");
61+
TC_PRINT("SDMMC domain clock configured\n");
62+
63+
/* Test clock source */
64+
dev_actual_clk_src = __HAL_RCC_GET_SDIO_SOURCE();
65+
66+
if (pclken[1].bus == STM32_SRC_CK48) {
67+
zassert_equal(dev_actual_clk_src, RCC_SDIOCLKSOURCE_CLK48,
68+
"Expected SDMMC src: CLK 48 (0x%lx). Actual src: 0x%x",
69+
RCC_SDIOCLKSOURCE_CLK48, dev_actual_clk_src);
70+
} else if (pclken[1].bus == STM32_SRC_SYSCLK) {
71+
zassert_equal(dev_actual_clk_src, RCC_SDIOCLKSOURCE_SYSCLK,
72+
"Expected SDMMC src: SYSCLK (0x%lx). Actual src: 0x%x",
73+
RCC_SDIOCLKSOURCE_SYSCLK, dev_actual_clk_src);
74+
} else {
75+
zassert_true(0, "Unexpected domain clk (0x%x)", dev_actual_clk_src);
76+
}
77+
78+
/* Test get_rate(srce clk) */
79+
if (pclken[1].bus == STM32_SRC_CK48) {
80+
/* Get the CK48M source : PLL Q or PLLI2S Q */
81+
if (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE) ==
82+
LL_RCC_CK48M_CLKSOURCE_PLL) {
83+
/* Get the PLL Q freq. No HAL macro for that */
84+
TC_PRINT("SDMMC sourced by PLLQ at ");
85+
dev_actual_clk_freq = __LL_RCC_CALC_PLLCLK_48M_FREQ(HSE_VALUE,
86+
LL_RCC_PLLI2S_GetDivider(),
87+
LL_RCC_PLLI2S_GetN(),
88+
LL_RCC_PLLI2S_GetQ()
89+
);
90+
} else {
91+
/* Get the I2S PLL Q freq. No HAL macro for that */
92+
dev_actual_clk_freq = __LL_RCC_CALC_PLLI2S_48M_FREQ(HSE_VALUE,
93+
LL_RCC_PLLI2S_GetDivider(),
94+
LL_RCC_PLLI2S_GetN(),
95+
LL_RCC_PLLI2S_GetQ()
96+
);
97+
TC_PRINT("SDMMC sourced by PLLI2SQ at ");
98+
}
99+
100+
TC_PRINT("%d Hz\n", dev_actual_clk_freq);
101+
r = 0;
102+
103+
} else if (pclken[1].bus == STM32_SRC_SYSCLK) {
104+
dev_actual_clk_freq = HAL_RCC_GetSysClockFreq();
105+
TC_PRINT(" STM32_SRC_SYSCLK at %d\n", dev_actual_clk_freq);
106+
} else {
107+
r = -127;
108+
}
109+
110+
zassert_true((r == 0), "Could not get SDMMC clk srce freq");
111+
112+
r = clock_control_get_rate(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
113+
(clock_control_subsys_t) &pclken[1],
114+
&dev_dt_clk_freq);
115+
116+
zassert_equal(dev_dt_clk_freq, dev_actual_clk_freq,
117+
"Expected freq: %d Hz. Actual clk: %d Hz",
118+
dev_dt_clk_freq, dev_actual_clk_freq);
119+
120+
TC_PRINT("SDMMC clock rate: %d Hz\n", dev_dt_clk_freq);
121+
122+
/* Test clock_off(gating clk) */
123+
r = clock_control_off(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
124+
(clock_control_subsys_t) &pclken[0]);
125+
zassert_true((r == 0), "Could not disable SDMMC gating clk");
126+
127+
zassert_true(!__HAL_RCC_SDIO_IS_CLK_ENABLED(), "SDMMC gating clk should be off");
128+
TC_PRINT("SDMMC gating clk off\n");
129+
}
130+
#endif

tests/drivers/clock_control/stm32_clock_configuration/stm32_common_devices/testcase.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,8 @@ tests:
3434
drivers.clock.stm32_clock_configuration.common_device.f3.i2c1_hsi:
3535
extra_args: DTC_OVERLAY_FILE="boards/f3_i2c1_hsi.overlay"
3636
platform_allow: stm32f3_disco
37+
drivers.clock.stm32_clock_configuration.common_device.f4.sdmmc_48:
38+
extra_args: DTC_OVERLAY_FILE="boards/f4_sdmmc48_pll.overlay"
39+
platform_allow:
40+
- stm32f412g_disco
41+
- nucleo_f412zg

0 commit comments

Comments
 (0)