Skip to content

Commit 528e9aa

Browse files
committed
library: wire: enhance i2c_getClkFreq()
Some series provides the HAL_RCCEx_GetPeriphCLKFreq() which returns the peripheral clock frequency based on Peripheral clock identifier. Signed-off-by: Frederic Pillon <[email protected]>
1 parent a8f9f66 commit 528e9aa

File tree

1 file changed

+162
-111
lines changed
  • libraries/Wire/src/utility

1 file changed

+162
-111
lines changed

libraries/Wire/src/utility/twi.c

+162-111
Original file line numberDiff line numberDiff line change
@@ -189,192 +189,243 @@ static I2C_HandleTypeDef *i2c_handles[I2C_NUM];
189189
static uint32_t i2c_getClkFreq(I2C_TypeDef *i2c)
190190
{
191191
uint32_t clkSrcFreq = 0;
192-
#if !defined(STM32MP1xx)
193192
#ifdef STM32H7xx
194193
PLL3_ClocksTypeDef PLL3_Clocks;
195194
#endif
196-
#if defined I2C1_BASE
195+
#if defined(I2C1_BASE)
197196
if (i2c == I2C1) {
198-
switch (__HAL_RCC_GET_I2C1_SOURCE()) {
199-
case RCC_I2C1CLKSOURCE_HSI:
200-
clkSrcFreq = HSI_VALUE;
201-
break;
197+
#if defined(RCC_PERIPHCLK_I2C1) || defined(RCC_PERIPHCLK_I2C12)
198+
#ifdef RCC_PERIPHCLK_I2C1
199+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C1);
200+
#else
201+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
202+
#endif
203+
if (clkSrcFreq == 0)
204+
#endif
205+
{
206+
#ifdef __HAL_RCC_GET_I2C1_SOURCE
207+
switch (__HAL_RCC_GET_I2C1_SOURCE()) {
208+
#ifdef RCC_I2C1CLKSOURCE_HSI
209+
case RCC_I2C1CLKSOURCE_HSI:
210+
clkSrcFreq = HSI_VALUE;
211+
break;
212+
#endif
202213
#ifdef RCC_I2C1CLKSOURCE_SYSCLK
203-
case RCC_I2C1CLKSOURCE_SYSCLK:
204-
clkSrcFreq = SystemCoreClock;
205-
break;
214+
case RCC_I2C1CLKSOURCE_SYSCLK:
215+
clkSrcFreq = SystemCoreClock;
216+
break;
206217
#endif
207218
#if defined(RCC_I2C1CLKSOURCE_PCLK1) || defined(RCC_I2C1CLKSOURCE_D2PCLK1)
208219
#ifdef RCC_I2C1CLKSOURCE_PCLK1
209-
case RCC_I2C1CLKSOURCE_PCLK1:
220+
case RCC_I2C1CLKSOURCE_PCLK1:
210221
#endif
211222
#ifdef RCC_I2C1CLKSOURCE_D2PCLK1
212-
case RCC_I2C1CLKSOURCE_D2PCLK1:
223+
case RCC_I2C1CLKSOURCE_D2PCLK1:
213224
#endif
214-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
215-
break;
225+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
226+
break;
216227
#endif
217228
#ifdef RCC_I2C1CLKSOURCE_CSI
218-
case RCC_I2C1CLKSOURCE_CSI:
219-
clkSrcFreq = CSI_VALUE;
220-
break;
229+
case RCC_I2C1CLKSOURCE_CSI:
230+
clkSrcFreq = CSI_VALUE;
231+
break;
221232
#endif
222233
#ifdef RCC_I2C1CLKSOURCE_PLL3
223-
case RCC_I2C1CLKSOURCE_PLL3:
224-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
225-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
226-
break;
234+
case RCC_I2C1CLKSOURCE_PLL3:
235+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
236+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
237+
break;
238+
#endif
239+
default:
240+
Error_Handler();
241+
}
242+
#else
243+
Error_Handler();
227244
#endif
228-
default:
229-
Error_Handler();
230245
}
231246
}
232247
#endif // I2C1_BASE
233-
#if defined I2C2_BASE
248+
#if defined(I2C2_BASE)
234249
if (i2c == I2C2) {
250+
#if defined(RCC_PERIPHCLK_I2C2) || defined(RCC_PERIPHCLK_I2C12)
251+
#ifdef RCC_PERIPHCLK_I2C2
252+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C2);
253+
#else
254+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
255+
#endif
256+
if (clkSrcFreq == 0)
257+
#endif
258+
{
235259
#ifdef __HAL_RCC_GET_I2C2_SOURCE
236-
switch (__HAL_RCC_GET_I2C2_SOURCE()) {
237-
case RCC_I2C2CLKSOURCE_HSI:
238-
clkSrcFreq = HSI_VALUE;
239-
break;
260+
switch (__HAL_RCC_GET_I2C2_SOURCE()) {
261+
case RCC_I2C2CLKSOURCE_HSI:
262+
clkSrcFreq = HSI_VALUE;
263+
break;
240264
#ifdef RCC_I2C2CLKSOURCE_SYSCLK
241-
case RCC_I2C2CLKSOURCE_SYSCLK:
242-
clkSrcFreq = SystemCoreClock;
243-
break;
265+
case RCC_I2C2CLKSOURCE_SYSCLK:
266+
clkSrcFreq = SystemCoreClock;
267+
break;
244268
#endif
245269
#if defined(RCC_I2C2CLKSOURCE_PCLK1) || defined(RCC_I2C2CLKSOURCE_D2PCLK1)
246270
#ifdef RCC_I2C2CLKSOURCE_PCLK1
247-
case RCC_I2C2CLKSOURCE_PCLK1:
271+
case RCC_I2C2CLKSOURCE_PCLK1:
248272
#endif
249273
#ifdef RCC_I2C2CLKSOURCE_D2PCLK1
250-
case RCC_I2C2CLKSOURCE_D2PCLK1:
274+
case RCC_I2C2CLKSOURCE_D2PCLK1:
251275
#endif
252-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
253-
break;
276+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
277+
break;
254278
#endif
255279
#ifdef RCC_I2C2CLKSOURCE_CSI
256-
case RCC_I2C2CLKSOURCE_CSI:
257-
clkSrcFreq = CSI_VALUE;
258-
break;
280+
case RCC_I2C2CLKSOURCE_CSI:
281+
clkSrcFreq = CSI_VALUE;
282+
break;
259283
#endif
260284
#ifdef RCC_I2C2CLKSOURCE_PLL3
261-
case RCC_I2C2CLKSOURCE_PLL3:
262-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
263-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
264-
break;
285+
case RCC_I2C2CLKSOURCE_PLL3:
286+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
287+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
288+
break;
265289
#endif
266-
default:
267-
Error_Handler();
268-
}
290+
default:
291+
Error_Handler();
292+
}
269293
#else
270-
/* STM32 L0/G0 I2C2 has no independent clock */
271-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
294+
/* STM32 L0/G0 I2C2 has no independent clock */
295+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
272296
#endif
297+
}
273298
}
274299
#endif // I2C2_BASE
275-
#if defined I2C3_BASE
300+
#if defined(I2C3_BASE)
276301
if (i2c == I2C3) {
302+
#if defined(RCC_PERIPHCLK_I2C3) || defined(RCC_PERIPHCLK_I2C35)
303+
#ifdef RCC_PERIPHCLK_I2C3
304+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C3);
305+
#else
306+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
307+
#endif
308+
if (clkSrcFreq == 0)
309+
#endif
310+
{
277311
#if defined(__HAL_RCC_GET_I2C3_SOURCE)
278-
switch (__HAL_RCC_GET_I2C3_SOURCE()) {
279-
case RCC_I2C3CLKSOURCE_HSI:
280-
clkSrcFreq = HSI_VALUE;
281-
break;
312+
switch (__HAL_RCC_GET_I2C3_SOURCE()) {
313+
case RCC_I2C3CLKSOURCE_HSI:
314+
clkSrcFreq = HSI_VALUE;
315+
break;
282316
#ifdef RCC_I2C3CLKSOURCE_SYSCLK
283-
case RCC_I2C3CLKSOURCE_SYSCLK:
284-
clkSrcFreq = SystemCoreClock;
285-
break;
317+
case RCC_I2C3CLKSOURCE_SYSCLK:
318+
clkSrcFreq = SystemCoreClock;
319+
break;
286320
#endif
287321
#if defined(RCC_I2C3CLKSOURCE_PCLK1) || defined(RCC_I2C3CLKSOURCE_D2PCLK1)
288322
#ifdef RCC_I2C3CLKSOURCE_PCLK1
289-
case RCC_I2C3CLKSOURCE_PCLK1:
323+
case RCC_I2C3CLKSOURCE_PCLK1:
290324
#endif
291325
#ifdef RCC_I2C3CLKSOURCE_D2PCLK1
292-
case RCC_I2C3CLKSOURCE_D2PCLK1:
326+
case RCC_I2C3CLKSOURCE_D2PCLK1:
293327
#endif
294-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
295-
break;
328+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
329+
break;
296330
#endif
297331
#ifdef RCC_I2C3CLKSOURCE_CSI
298-
case RCC_I2C3CLKSOURCE_CSI:
299-
clkSrcFreq = CSI_VALUE;
300-
break;
332+
case RCC_I2C3CLKSOURCE_CSI:
333+
clkSrcFreq = CSI_VALUE;
334+
break;
301335
#endif
302336
#ifdef RCC_I2C3CLKSOURCE_PLL3
303-
case RCC_I2C3CLKSOURCE_PLL3:
304-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
305-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
306-
break;
337+
case RCC_I2C3CLKSOURCE_PLL3:
338+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
339+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
340+
break;
307341
#endif
308-
default:
309-
Error_Handler();
310-
}
342+
default:
343+
Error_Handler();
344+
}
311345
#else
312-
/* STM32 G0 I2C3 has no independent clock */
313-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
346+
/* STM32 G0 I2C3 has no independent clock */
347+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
314348
#endif
349+
}
315350
}
316351
#endif // I2C3_BASE
317-
#if defined I2C4_BASE
352+
#if defined(I2C4_BASE)
318353
if (i2c == I2C4) {
319-
switch (__HAL_RCC_GET_I2C4_SOURCE()) {
320-
case RCC_I2C4CLKSOURCE_HSI:
321-
clkSrcFreq = HSI_VALUE;
322-
break;
354+
#if defined(RCC_PERIPHCLK_I2C4) || defined(RCC_PERIPHCLK_I2C46)
355+
#ifdef RCC_PERIPHCLK_I2C4
356+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C4);
357+
#else
358+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
359+
#endif
360+
if (clkSrcFreq == 0)
361+
#endif
362+
{
363+
#if defined(__HAL_RCC_GET_I2C4_SOURCE)
364+
switch (__HAL_RCC_GET_I2C4_SOURCE()) {
365+
#ifdef RCC_I2C4CLKSOURCE_HSI
366+
case RCC_I2C4CLKSOURCE_HSI:
367+
clkSrcFreq = HSI_VALUE;
368+
break;
369+
#endif
323370
#ifdef RCC_I2C4CLKSOURCE_SYSCLK
324-
case RCC_I2C4CLKSOURCE_SYSCLK:
325-
clkSrcFreq = SystemCoreClock;
326-
break;
371+
case RCC_I2C4CLKSOURCE_SYSCLK:
372+
clkSrcFreq = SystemCoreClock;
373+
break;
327374
#endif
328375
#ifdef RCC_I2C4CLKSOURCE_PCLK1
329-
case RCC_I2C4CLKSOURCE_PCLK1:
330-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
331-
break;
376+
case RCC_I2C4CLKSOURCE_PCLK1:
377+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
378+
break;
332379
#endif
333380
#ifdef RCC_I2C4CLKSOURCE_D3PCLK1
334-
case RCC_I2C4CLKSOURCE_D3PCLK1:
335-
clkSrcFreq = HAL_RCCEx_GetD3PCLK1Freq();
336-
break;
381+
case RCC_I2C4CLKSOURCE_D3PCLK1:
382+
clkSrcFreq = HAL_RCCEx_GetD3PCLK1Freq();
383+
break;
337384
#endif
338385
#ifdef RCC_I2C4CLKSOURCE_CSI
339-
case RCC_I2C4CLKSOURCE_CSI:
340-
clkSrcFreq = CSI_VALUE;
341-
break;
386+
case RCC_I2C4CLKSOURCE_CSI:
387+
clkSrcFreq = CSI_VALUE;
388+
break;
342389
#endif
343390
#ifdef RCC_I2C4CLKSOURCE_PLL3
344-
case RCC_I2C4CLKSOURCE_PLL3:
345-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
346-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
347-
break;
391+
case RCC_I2C4CLKSOURCE_PLL3:
392+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
393+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
394+
break;
395+
#endif
396+
default:
397+
Error_Handler();
398+
}
399+
#else
400+
Error_Handler();
348401
#endif
349-
default:
350-
Error_Handler();
351402
}
352403
}
353404
#endif // I2C4_BASE
354-
355-
#elif defined(STM32MP1xx)
356-
if (i2c == I2C1) {
357-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
358-
}
359-
if (i2c == I2C2) {
360-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
361-
}
362-
if (i2c == I2C3) {
363-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
364-
}
365-
if (i2c == I2C4) {
366-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
367-
}
368-
#endif // STM32MP1xx
369-
370-
#if defined I2C5_BASE
405+
#if defined(I2C5_BASE)
371406
if (i2c == I2C5) {
407+
#if defined(RCC_PERIPHCLK_I2C5) || defined(RCC_PERIPHCLK_I2C35)
408+
#ifdef RCC_PERIPHCLK_I2C5
409+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C5);
410+
#else
372411
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
412+
#endif
413+
if (clkSrcFreq == 0)
414+
#endif
415+
{
416+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
417+
}
373418
}
374419
#endif // I2C5_BASE
375-
#if defined I2C6_BASE
420+
#if defined(I2C6_BASE)
376421
if (i2c == I2C6) {
422+
#if defined(RCC_PERIPHCLK_I2C6) || defined(RCC_PERIPHCLK_I2C46)
423+
#ifdef RCC_PERIPHCLK_I2C6
424+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C6);
425+
#else
377426
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
427+
#endif
428+
#endif
378429
}
379430
#endif // I2C6_BASE
380431
return clkSrcFreq;

0 commit comments

Comments
 (0)