18{
19#if (STM32_RTCSEL == STM32_RTCSEL_LSE)
20
21
22
23 int timeout = 1000000000;
24 if ((RCC->BDCR & STM32_RTCSEL_MASK) == STM32_RTCSEL) {
25
26 return;
27 }
28 if ((RCC->BDCR & RCC_BDCR_LSERDY) == 0) {
29
30 efiPrintf("LSE in not ready");
31 return;
32 }
33
34 efiPrintf("Switching RTC to LSE clock");
35
36
37 RTCDateTime timespec;
38 rtcGetTime(&RTCD1, ×pec);
39
40
41
42
43 RCC->BDCR |= RCC_BDCR_BDRST;
44 RCC->BDCR &= ~RCC_BDCR_BDRST;
45
46#if defined(STM32_LSE_BYPASS)
47
48 RCC->BDCR |= STM32_LSEDRV | RCC_BDCR_LSEON | RCC_BDCR_LSEBYP;
49#else
50
51 RCC->BDCR |= STM32_LSEDRV | RCC_BDCR_LSEON;
52#endif
53
54 while (((RCC->BDCR & RCC_BDCR_LSERDY) == 0) && (timeout--)) {
55
56
57 }
58
59
60 if (RCC->BDCR & RCC_BDCR_LSERDY) {
61 RCC->BDCR |= STM32_RTCSEL;
62 } else {
63
64 efiPrintf("LSE in not ready after restart attemp");
65
66 RCC->BDCR |= RUSEFI_STM32_LSE_WAIT_MAX_RTCSEL;
67 }
68
69
70 RCC->BDCR |= RCC_BDCR_RTCEN;
71
72
73 rtcInit();
74
75 rtcSetTime(&RTCD1, ×pec);
76#endif
77}