xref: /qemu/tests/qtest/stm32l4x5_usart-test.c (revision 019fbfa4bcd2d3a835c241295e22ab2b5b56129b)
1214652daSArnaud Minier /*
2214652daSArnaud Minier  * QTest testcase for STML4X5_USART
3214652daSArnaud Minier  *
4214652daSArnaud Minier  * Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr>
5214652daSArnaud Minier  * Copyright (c) 2023 Inès Varhol <ines.varhol@telecom-paris.fr>
6214652daSArnaud Minier  *
7214652daSArnaud Minier  * This work is licensed under the terms of the GNU GPL, version 2 or later.
8214652daSArnaud Minier  * See the COPYING file in the top-level directory.
9214652daSArnaud Minier  */
10214652daSArnaud Minier 
11214652daSArnaud Minier #include "qemu/osdep.h"
12214652daSArnaud Minier #include "libqtest.h"
13214652daSArnaud Minier #include "hw/misc/stm32l4x5_rcc_internals.h"
14214652daSArnaud Minier #include "hw/registerfields.h"
1588446cfeSInès Varhol #include "stm32l4x5.h"
16214652daSArnaud Minier 
17214652daSArnaud Minier #define RCC_BASE_ADDR 0x40021000
18214652daSArnaud Minier /* Use USART 1 ADDR, assume the others work the same */
19214652daSArnaud Minier #define USART1_BASE_ADDR 0x40013800
20214652daSArnaud Minier 
21214652daSArnaud Minier /* See stm32l4x5_usart for definitions */
22214652daSArnaud Minier REG32(CR1, 0x00)
23214652daSArnaud Minier     FIELD(CR1, M1, 28, 1)
24214652daSArnaud Minier     FIELD(CR1, OVER8, 15, 1)
25214652daSArnaud Minier     FIELD(CR1, M0, 12, 1)
26214652daSArnaud Minier     FIELD(CR1, PCE, 10, 1)
27214652daSArnaud Minier     FIELD(CR1, TXEIE, 7, 1)
28214652daSArnaud Minier     FIELD(CR1, RXNEIE, 5, 1)
29214652daSArnaud Minier     FIELD(CR1, TE, 3, 1)
30214652daSArnaud Minier     FIELD(CR1, RE, 2, 1)
31214652daSArnaud Minier     FIELD(CR1, UE, 0, 1)
32214652daSArnaud Minier REG32(CR2, 0x04)
33214652daSArnaud Minier REG32(CR3, 0x08)
34214652daSArnaud Minier     FIELD(CR3, OVRDIS, 12, 1)
35214652daSArnaud Minier REG32(BRR, 0x0C)
36214652daSArnaud Minier REG32(GTPR, 0x10)
37214652daSArnaud Minier REG32(RTOR, 0x14)
38214652daSArnaud Minier REG32(RQR, 0x18)
39214652daSArnaud Minier REG32(ISR, 0x1C)
406cce0dccSJacob Abrams     FIELD(ISR, REACK, 22, 1)
416cce0dccSJacob Abrams     FIELD(ISR, TEACK, 21, 1)
42214652daSArnaud Minier     FIELD(ISR, TXE, 7, 1)
43214652daSArnaud Minier     FIELD(ISR, RXNE, 5, 1)
44214652daSArnaud Minier     FIELD(ISR, ORE, 3, 1)
45214652daSArnaud Minier REG32(ICR, 0x20)
46214652daSArnaud Minier REG32(RDR, 0x24)
47214652daSArnaud Minier REG32(TDR, 0x28)
48214652daSArnaud Minier 
49214652daSArnaud Minier #define NVIC_ISPR1 0XE000E204
50214652daSArnaud Minier #define NVIC_ICPR1 0xE000E284
51214652daSArnaud Minier #define USART1_IRQ 37
52214652daSArnaud Minier 
check_nvic_pending(QTestState * qts,unsigned int n)53214652daSArnaud Minier static bool check_nvic_pending(QTestState *qts, unsigned int n)
54214652daSArnaud Minier {
55214652daSArnaud Minier     /* No USART interrupts are less than 32 */
56214652daSArnaud Minier     assert(n > 32);
57214652daSArnaud Minier     n -= 32;
58214652daSArnaud Minier     return qtest_readl(qts, NVIC_ISPR1) & (1 << n);
59214652daSArnaud Minier }
60214652daSArnaud Minier 
clear_nvic_pending(QTestState * qts,unsigned int n)61214652daSArnaud Minier static bool clear_nvic_pending(QTestState *qts, unsigned int n)
62214652daSArnaud Minier {
63214652daSArnaud Minier     /* No USART interrupts are less than 32 */
64214652daSArnaud Minier     assert(n > 32);
65214652daSArnaud Minier     n -= 32;
66214652daSArnaud Minier     qtest_writel(qts, NVIC_ICPR1, (1 << n));
67214652daSArnaud Minier     return true;
68214652daSArnaud Minier }
69214652daSArnaud Minier 
70214652daSArnaud Minier /*
71214652daSArnaud Minier  * Wait indefinitely for the flag to be updated.
72214652daSArnaud Minier  * If this is run on a slow CI runner,
73214652daSArnaud Minier  * the meson harness will timeout after 10 minutes for us.
74214652daSArnaud Minier  */
usart_wait_for_flag(QTestState * qts,uint32_t event_addr,uint32_t flag)75214652daSArnaud Minier static bool usart_wait_for_flag(QTestState *qts, uint32_t event_addr,
76214652daSArnaud Minier                                 uint32_t flag)
77214652daSArnaud Minier {
78214652daSArnaud Minier     while (true) {
79214652daSArnaud Minier         if ((qtest_readl(qts, event_addr) & flag)) {
80214652daSArnaud Minier             return true;
81214652daSArnaud Minier         }
82214652daSArnaud Minier         g_usleep(1000);
83214652daSArnaud Minier     }
84214652daSArnaud Minier 
85214652daSArnaud Minier     return false;
86214652daSArnaud Minier }
87214652daSArnaud Minier 
usart_receive_string(QTestState * qts,int sock_fd,const char * in,char * out)88214652daSArnaud Minier static void usart_receive_string(QTestState *qts, int sock_fd, const char *in,
89214652daSArnaud Minier                                  char *out)
90214652daSArnaud Minier {
91214652daSArnaud Minier     int i, in_len = strlen(in);
92214652daSArnaud Minier 
93214652daSArnaud Minier     g_assert_true(send(sock_fd, in, in_len, 0) == in_len);
94214652daSArnaud Minier     for (i = 0; i < in_len; i++) {
95214652daSArnaud Minier         g_assert_true(usart_wait_for_flag(qts,
96214652daSArnaud Minier             USART1_BASE_ADDR + A_ISR, R_ISR_RXNE_MASK));
97214652daSArnaud Minier         out[i] = qtest_readl(qts, USART1_BASE_ADDR + A_RDR);
98214652daSArnaud Minier     }
99214652daSArnaud Minier     out[i] = '\0';
100214652daSArnaud Minier }
101214652daSArnaud Minier 
usart_send_string(QTestState * qts,const char * in)102214652daSArnaud Minier static void usart_send_string(QTestState *qts, const char *in)
103214652daSArnaud Minier {
104214652daSArnaud Minier     int i, in_len = strlen(in);
105214652daSArnaud Minier 
106214652daSArnaud Minier     for (i = 0; i < in_len; i++) {
107214652daSArnaud Minier         qtest_writel(qts, USART1_BASE_ADDR + A_TDR, in[i]);
108214652daSArnaud Minier         g_assert_true(usart_wait_for_flag(qts,
109214652daSArnaud Minier             USART1_BASE_ADDR + A_ISR, R_ISR_TXE_MASK));
110214652daSArnaud Minier     }
111214652daSArnaud Minier }
112214652daSArnaud Minier 
113214652daSArnaud Minier /* Init the RCC clocks to run at 80 MHz */
init_clocks(QTestState * qts)114214652daSArnaud Minier static void init_clocks(QTestState *qts)
115214652daSArnaud Minier {
116214652daSArnaud Minier     uint32_t value;
117214652daSArnaud Minier 
118214652daSArnaud Minier     /* MSIRANGE can be set only when MSI is OFF or READY */
119214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CR), R_CR_MSION_MASK);
120214652daSArnaud Minier 
121214652daSArnaud Minier     /* Clocking from MSI, in case MSI was not the default source */
122214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CFGR), 0);
123214652daSArnaud Minier 
124214652daSArnaud Minier     /*
125214652daSArnaud Minier      * Update PLL and set MSI as the source clock.
126214652daSArnaud Minier      * PLLM = 1 --> 000
127214652daSArnaud Minier      * PLLN = 40 --> 40
128214652daSArnaud Minier      * PPLLR = 2 --> 00
129214652daSArnaud Minier      * PLLDIV = unused, PLLP = unused (SAI3), PLLQ = unused (48M1)
130214652daSArnaud Minier      * SRC = MSI --> 01
131214652daSArnaud Minier      */
132214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_PLLCFGR), R_PLLCFGR_PLLREN_MASK |
133214652daSArnaud Minier             (40 << R_PLLCFGR_PLLN_SHIFT) |
134214652daSArnaud Minier             (0b01 << R_PLLCFGR_PLLSRC_SHIFT));
135214652daSArnaud Minier 
136214652daSArnaud Minier     /* PLL activation */
137214652daSArnaud Minier 
138214652daSArnaud Minier     value = qtest_readl(qts, (RCC_BASE_ADDR + A_CR));
139214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CR), value | R_CR_PLLON_MASK);
140214652daSArnaud Minier 
141214652daSArnaud Minier     /* RCC_CFGR is OK by defaut */
142214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CFGR), 0);
143214652daSArnaud Minier 
144214652daSArnaud Minier     /* CCIPR : no periph clock by default */
145214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CCIPR), 0);
146214652daSArnaud Minier 
147214652daSArnaud Minier     /* Switches on the PLL clock source */
148214652daSArnaud Minier     value = qtest_readl(qts, (RCC_BASE_ADDR + A_CFGR));
149214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CFGR), (value & ~R_CFGR_SW_MASK) |
150214652daSArnaud Minier         (0b11 << R_CFGR_SW_SHIFT));
151214652daSArnaud Minier 
152214652daSArnaud Minier     /* Enable SYSCFG clock enabled */
153214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_APB2ENR), R_APB2ENR_SYSCFGEN_MASK);
154214652daSArnaud Minier 
155214652daSArnaud Minier     /* Enable the IO port B clock (See p.252) */
156214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_AHB2ENR), R_AHB2ENR_GPIOBEN_MASK);
157214652daSArnaud Minier 
158214652daSArnaud Minier     /* Enable the clock for USART1 (cf p.259) */
159214652daSArnaud Minier     /* We rewrite SYSCFGEN to not disable it */
160214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_APB2ENR),
161214652daSArnaud Minier                  R_APB2ENR_SYSCFGEN_MASK | R_APB2ENR_USART1EN_MASK);
162214652daSArnaud Minier 
163214652daSArnaud Minier     /* TODO: Enable usart via gpio */
164214652daSArnaud Minier 
165214652daSArnaud Minier     /* Set PCLK as the clock for USART1(cf p.272) i.e. reset both bits */
166214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_CCIPR), 0);
167214652daSArnaud Minier 
168214652daSArnaud Minier     /* Reset USART1 (see p.249) */
169214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_APB2RSTR), 1 << 14);
170214652daSArnaud Minier     qtest_writel(qts, (RCC_BASE_ADDR + A_APB2RSTR), 0);
171214652daSArnaud Minier }
172214652daSArnaud Minier 
init_uart(QTestState * qts)173214652daSArnaud Minier static void init_uart(QTestState *qts)
174214652daSArnaud Minier {
175214652daSArnaud Minier     uint32_t cr1;
176214652daSArnaud Minier 
177214652daSArnaud Minier     init_clocks(qts);
178214652daSArnaud Minier 
179214652daSArnaud Minier     /*
180214652daSArnaud Minier      * For 115200 bauds, see p.1349.
181214652daSArnaud Minier      * The clock has a frequency of 80Mhz,
182214652daSArnaud Minier      * for 115200, we have to put a divider of 695 = 0x2B7.
183214652daSArnaud Minier      */
184214652daSArnaud Minier     qtest_writel(qts, (USART1_BASE_ADDR + A_BRR), 0x2B7);
185214652daSArnaud Minier 
186214652daSArnaud Minier     /*
187214652daSArnaud Minier      * Set the oversampling by 16,
188214652daSArnaud Minier      * disable the parity control and
189214652daSArnaud Minier      * set the word length to 8. (cf p.1377)
190214652daSArnaud Minier      */
191214652daSArnaud Minier     cr1 = qtest_readl(qts, (USART1_BASE_ADDR + A_CR1));
192214652daSArnaud Minier     cr1 &= ~(R_CR1_M1_MASK | R_CR1_M0_MASK | R_CR1_OVER8_MASK | R_CR1_PCE_MASK);
193214652daSArnaud Minier     qtest_writel(qts, (USART1_BASE_ADDR + A_CR1), cr1);
194214652daSArnaud Minier 
195214652daSArnaud Minier     /* Enable the transmitter, the receiver and the USART. */
196214652daSArnaud Minier     qtest_writel(qts, (USART1_BASE_ADDR + A_CR1),
1976cce0dccSJacob Abrams         cr1 | R_CR1_UE_MASK | R_CR1_RE_MASK | R_CR1_TE_MASK);
198214652daSArnaud Minier }
199214652daSArnaud Minier 
test_write_read(void)200214652daSArnaud Minier static void test_write_read(void)
201214652daSArnaud Minier {
202214652daSArnaud Minier     QTestState *qts = qtest_init("-M b-l475e-iot01a");
203214652daSArnaud Minier 
204214652daSArnaud Minier     /* Test that we can write and retrieve a value from the device */
205214652daSArnaud Minier     qtest_writel(qts, USART1_BASE_ADDR + A_TDR, 0xFFFFFFFF);
206214652daSArnaud Minier     const uint32_t tdr = qtest_readl(qts, USART1_BASE_ADDR + A_TDR);
207214652daSArnaud Minier     g_assert_cmpuint(tdr, ==, 0x000001FF);
208d1e8bea9SPeter Maydell 
209d1e8bea9SPeter Maydell     qtest_quit(qts);
210214652daSArnaud Minier }
211214652daSArnaud Minier 
test_receive_char(void)212214652daSArnaud Minier static void test_receive_char(void)
213214652daSArnaud Minier {
214214652daSArnaud Minier     int sock_fd;
215214652daSArnaud Minier     uint32_t cr1;
216214652daSArnaud Minier     QTestState *qts = qtest_init_with_serial("-M b-l475e-iot01a", &sock_fd);
217214652daSArnaud Minier 
218214652daSArnaud Minier     init_uart(qts);
219214652daSArnaud Minier 
220214652daSArnaud Minier     /* Try without initializing IRQ */
221214652daSArnaud Minier     g_assert_true(send(sock_fd, "a", 1, 0) == 1);
222214652daSArnaud Minier     usart_wait_for_flag(qts, USART1_BASE_ADDR + A_ISR, R_ISR_RXNE_MASK);
223214652daSArnaud Minier     g_assert_cmphex(qtest_readl(qts, USART1_BASE_ADDR + A_RDR), ==, 'a');
224214652daSArnaud Minier     g_assert_false(check_nvic_pending(qts, USART1_IRQ));
225214652daSArnaud Minier 
226214652daSArnaud Minier     /* Now with the IRQ */
227214652daSArnaud Minier     cr1 = qtest_readl(qts, (USART1_BASE_ADDR + A_CR1));
228214652daSArnaud Minier     cr1 |= R_CR1_RXNEIE_MASK;
229214652daSArnaud Minier     qtest_writel(qts, USART1_BASE_ADDR + A_CR1, cr1);
230214652daSArnaud Minier     g_assert_true(send(sock_fd, "b", 1, 0) == 1);
231214652daSArnaud Minier     usart_wait_for_flag(qts, USART1_BASE_ADDR + A_ISR, R_ISR_RXNE_MASK);
232214652daSArnaud Minier     g_assert_cmphex(qtest_readl(qts, USART1_BASE_ADDR + A_RDR), ==, 'b');
233214652daSArnaud Minier     g_assert_true(check_nvic_pending(qts, USART1_IRQ));
234214652daSArnaud Minier     clear_nvic_pending(qts, USART1_IRQ);
235214652daSArnaud Minier 
236214652daSArnaud Minier     close(sock_fd);
237214652daSArnaud Minier 
238214652daSArnaud Minier     qtest_quit(qts);
239214652daSArnaud Minier }
240214652daSArnaud Minier 
test_send_char(void)241214652daSArnaud Minier static void test_send_char(void)
242214652daSArnaud Minier {
243214652daSArnaud Minier     int sock_fd;
244214652daSArnaud Minier     char s[1];
245214652daSArnaud Minier     uint32_t cr1;
246214652daSArnaud Minier     QTestState *qts = qtest_init_with_serial("-M b-l475e-iot01a", &sock_fd);
247214652daSArnaud Minier 
248214652daSArnaud Minier     init_uart(qts);
249214652daSArnaud Minier 
250214652daSArnaud Minier     /* Try without initializing IRQ */
251214652daSArnaud Minier     qtest_writel(qts, USART1_BASE_ADDR + A_TDR, 'c');
252214652daSArnaud Minier     g_assert_true(recv(sock_fd, s, 1, 0) == 1);
253214652daSArnaud Minier     g_assert_cmphex(s[0], ==, 'c');
254214652daSArnaud Minier     g_assert_false(check_nvic_pending(qts, USART1_IRQ));
255214652daSArnaud Minier 
256214652daSArnaud Minier     /* Now with the IRQ */
257214652daSArnaud Minier     cr1 = qtest_readl(qts, (USART1_BASE_ADDR + A_CR1));
258214652daSArnaud Minier     cr1 |= R_CR1_TXEIE_MASK;
259214652daSArnaud Minier     qtest_writel(qts, USART1_BASE_ADDR + A_CR1, cr1);
260214652daSArnaud Minier     qtest_writel(qts, USART1_BASE_ADDR + A_TDR, 'd');
261214652daSArnaud Minier     g_assert_true(recv(sock_fd, s, 1, 0) == 1);
262214652daSArnaud Minier     g_assert_cmphex(s[0], ==, 'd');
263214652daSArnaud Minier     g_assert_true(check_nvic_pending(qts, USART1_IRQ));
264214652daSArnaud Minier     clear_nvic_pending(qts, USART1_IRQ);
265214652daSArnaud Minier 
266214652daSArnaud Minier     close(sock_fd);
267214652daSArnaud Minier 
268214652daSArnaud Minier     qtest_quit(qts);
269214652daSArnaud Minier }
270214652daSArnaud Minier 
test_receive_str(void)271214652daSArnaud Minier static void test_receive_str(void)
272214652daSArnaud Minier {
273214652daSArnaud Minier     int sock_fd;
274214652daSArnaud Minier     char s[10];
275214652daSArnaud Minier     QTestState *qts = qtest_init_with_serial("-M b-l475e-iot01a", &sock_fd);
276214652daSArnaud Minier 
277214652daSArnaud Minier     init_uart(qts);
278214652daSArnaud Minier 
279214652daSArnaud Minier     usart_receive_string(qts, sock_fd, "hello", s);
280214652daSArnaud Minier     g_assert_true(memcmp(s, "hello", 5) == 0);
281214652daSArnaud Minier 
282214652daSArnaud Minier     close(sock_fd);
283214652daSArnaud Minier 
284214652daSArnaud Minier     qtest_quit(qts);
285214652daSArnaud Minier }
286214652daSArnaud Minier 
test_send_str(void)287214652daSArnaud Minier static void test_send_str(void)
288214652daSArnaud Minier {
289214652daSArnaud Minier     int sock_fd;
290214652daSArnaud Minier     char s[10];
291214652daSArnaud Minier     QTestState *qts = qtest_init_with_serial("-M b-l475e-iot01a", &sock_fd);
292214652daSArnaud Minier 
293214652daSArnaud Minier     init_uart(qts);
294214652daSArnaud Minier 
295214652daSArnaud Minier     usart_send_string(qts, "world");
296214652daSArnaud Minier     g_assert_true(recv(sock_fd, s, 10, 0) == 5);
297214652daSArnaud Minier     g_assert_true(memcmp(s, "world", 5) == 0);
298214652daSArnaud Minier 
299214652daSArnaud Minier     close(sock_fd);
300214652daSArnaud Minier 
301214652daSArnaud Minier     qtest_quit(qts);
302214652daSArnaud Minier }
303214652daSArnaud Minier 
test_ack(void)3046cce0dccSJacob Abrams static void test_ack(void)
3056cce0dccSJacob Abrams {
3066cce0dccSJacob Abrams     uint32_t cr1;
3076cce0dccSJacob Abrams     uint32_t isr;
3086cce0dccSJacob Abrams     QTestState *qts = qtest_init("-M b-l475e-iot01a");
3096cce0dccSJacob Abrams 
3106cce0dccSJacob Abrams     init_uart(qts);
3116cce0dccSJacob Abrams 
3126cce0dccSJacob Abrams     cr1 = qtest_readl(qts, (USART1_BASE_ADDR + A_CR1));
3136cce0dccSJacob Abrams 
3146cce0dccSJacob Abrams     /* Disable the transmitter and receiver. */
3156cce0dccSJacob Abrams     qtest_writel(qts, (USART1_BASE_ADDR + A_CR1),
3166cce0dccSJacob Abrams         cr1 & ~(R_CR1_RE_MASK | R_CR1_TE_MASK));
3176cce0dccSJacob Abrams 
3186cce0dccSJacob Abrams     /* Test ISR ACK for transmitter and receiver disabled */
3196cce0dccSJacob Abrams     isr = qtest_readl(qts, (USART1_BASE_ADDR + A_ISR));
3206cce0dccSJacob Abrams     g_assert_false(isr & R_ISR_TEACK_MASK);
3216cce0dccSJacob Abrams     g_assert_false(isr & R_ISR_REACK_MASK);
3226cce0dccSJacob Abrams 
3236cce0dccSJacob Abrams     /* Enable the transmitter and receiver. */
3246cce0dccSJacob Abrams     qtest_writel(qts, (USART1_BASE_ADDR + A_CR1),
3256cce0dccSJacob Abrams         cr1 | (R_CR1_RE_MASK | R_CR1_TE_MASK));
3266cce0dccSJacob Abrams 
3276cce0dccSJacob Abrams     /* Test ISR ACK for transmitter and receiver disabled */
3286cce0dccSJacob Abrams     isr = qtest_readl(qts, (USART1_BASE_ADDR + A_ISR));
3296cce0dccSJacob Abrams     g_assert_true(isr & R_ISR_TEACK_MASK);
3306cce0dccSJacob Abrams     g_assert_true(isr & R_ISR_REACK_MASK);
3316cce0dccSJacob Abrams 
3326cce0dccSJacob Abrams     qtest_quit(qts);
3336cce0dccSJacob Abrams }
3346cce0dccSJacob Abrams 
check_clock(QTestState * qts,const char * path,uint32_t rcc_reg,uint32_t reg_offset)33588446cfeSInès Varhol static void check_clock(QTestState *qts, const char *path, uint32_t rcc_reg,
33688446cfeSInès Varhol                         uint32_t reg_offset)
33788446cfeSInès Varhol {
33888446cfeSInès Varhol     g_assert_cmpuint(get_clock_period(qts, path), ==, 0);
33988446cfeSInès Varhol     qtest_writel(qts, rcc_reg, qtest_readl(qts, rcc_reg) | (0x1 << reg_offset));
34088446cfeSInès Varhol     g_assert_cmpuint(get_clock_period(qts, path), ==, SYSCLK_PERIOD);
34188446cfeSInès Varhol }
34288446cfeSInès Varhol 
test_clock_enable(void)34388446cfeSInès Varhol static void test_clock_enable(void)
34488446cfeSInès Varhol {
34588446cfeSInès Varhol     /*
34688446cfeSInès Varhol      * For each USART device, enable its clock in RCC
34788446cfeSInès Varhol      * and check that its clock frequency is SYSCLK_PERIOD
34888446cfeSInès Varhol      */
34988446cfeSInès Varhol     QTestState *qts = qtest_init("-M b-l475e-iot01a");
35088446cfeSInès Varhol 
35188446cfeSInès Varhol     check_clock(qts, "machine/soc/usart[0]/clk", RCC_APB2ENR, 14);
35288446cfeSInès Varhol     check_clock(qts, "machine/soc/usart[1]/clk", RCC_APB1ENR1, 17);
35388446cfeSInès Varhol     check_clock(qts, "machine/soc/usart[2]/clk", RCC_APB1ENR1, 18);
35488446cfeSInès Varhol     check_clock(qts, "machine/soc/uart[0]/clk", RCC_APB1ENR1, 19);
35588446cfeSInès Varhol     check_clock(qts, "machine/soc/uart[1]/clk", RCC_APB1ENR1, 20);
35688446cfeSInès Varhol     check_clock(qts, "machine/soc/lpuart1/clk", RCC_APB1ENR2, 0);
35788446cfeSInès Varhol 
35888446cfeSInès Varhol     qtest_quit(qts);
35988446cfeSInès Varhol }
36088446cfeSInès Varhol 
main(int argc,char ** argv)361214652daSArnaud Minier int main(int argc, char **argv)
362214652daSArnaud Minier {
363214652daSArnaud Minier     g_test_init(&argc, &argv, NULL);
364214652daSArnaud Minier     g_test_set_nonfatal_assertions();
365214652daSArnaud Minier 
366214652daSArnaud Minier     qtest_add_func("stm32l4x5/usart/write_read", test_write_read);
367214652daSArnaud Minier     qtest_add_func("stm32l4x5/usart/receive_char", test_receive_char);
368214652daSArnaud Minier     qtest_add_func("stm32l4x5/usart/send_char", test_send_char);
369214652daSArnaud Minier     qtest_add_func("stm32l4x5/usart/receive_str", test_receive_str);
370214652daSArnaud Minier     qtest_add_func("stm32l4x5/usart/send_str", test_send_str);
3716cce0dccSJacob Abrams     qtest_add_func("stm32l4x5/usart/ack", test_ack);
37288446cfeSInès Varhol     qtest_add_func("stm32l4x5/usart/clock_enable", test_clock_enable);
373*720a0e41SMarkus Armbruster     return g_test_run();
374214652daSArnaud Minier }
375214652daSArnaud Minier 
376