From b802bd07b2e21947d7cabebc76768076ac5015ad Mon Sep 17 00:00:00 2001 From: Chuck McManis Date: Mon, 15 Aug 2016 17:19:55 +0000 Subject: [PATCH] stm32f4: rcc: support PLL_SAI and PLL_I2S Adds the missing enums for the extra clocks on stm32f4x9 parts. Signed-off-by: Karl Palsson --- include/libopencm3/stm32/f4/rcc.h | 2 ++ lib/stm32/f4/rcc.c | 56 ++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/include/libopencm3/stm32/f4/rcc.h b/include/libopencm3/stm32/f4/rcc.h index 94fe6cb1..d49a5a77 100644 --- a/include/libopencm3/stm32/f4/rcc.h +++ b/include/libopencm3/stm32/f4/rcc.h @@ -665,6 +665,8 @@ extern const struct rcc_clock_scale rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_END]; enum rcc_osc { RCC_PLL, + RCC_PLLSAI, + RCC_PLLI2S, RCC_HSE, RCC_HSI, RCC_LSE, diff --git a/lib/stm32/f4/rcc.c b/lib/stm32/f4/rcc.c index bfc5cd9b..d6394d6d 100644 --- a/lib/stm32/f4/rcc.c +++ b/lib/stm32/f4/rcc.c @@ -311,6 +311,12 @@ void rcc_osc_ready_int_clear(enum rcc_osc osc) case RCC_LSI: RCC_CIR |= RCC_CIR_LSIRDYC; break; + case RCC_PLLSAI: + RCC_CIR |= RCC_CIR_PLLSAIRDYC; + break; + case RCC_PLLI2S: + RCC_CIR |= RCC_CIR_PLLI2SRDYC; + break; } } @@ -332,6 +338,12 @@ void rcc_osc_ready_int_enable(enum rcc_osc osc) case RCC_LSI: RCC_CIR |= RCC_CIR_LSIRDYIE; break; + case RCC_PLLSAI: + RCC_CIR |= RCC_CIR_PLLSAIRDYIE; + break; + case RCC_PLLI2S: + RCC_CIR |= RCC_CIR_PLLI2SRDYIE; + break; } } @@ -353,6 +365,12 @@ void rcc_osc_ready_int_disable(enum rcc_osc osc) case RCC_LSI: RCC_CIR &= ~RCC_CIR_LSIRDYIE; break; + case RCC_PLLSAI: + RCC_CIR &= ~RCC_CIR_PLLSAIRDYIE; + break; + case RCC_PLLI2S: + RCC_CIR &= ~RCC_CIR_PLLI2SRDYIE; + break; } } @@ -361,22 +379,20 @@ int rcc_osc_ready_int_flag(enum rcc_osc osc) switch (osc) { case RCC_PLL: return ((RCC_CIR & RCC_CIR_PLLRDYF) != 0); - break; case RCC_HSE: return ((RCC_CIR & RCC_CIR_HSERDYF) != 0); - break; case RCC_HSI: return ((RCC_CIR & RCC_CIR_HSIRDYF) != 0); - break; case RCC_LSE: return ((RCC_CIR & RCC_CIR_LSERDYF) != 0); - break; case RCC_LSI: return ((RCC_CIR & RCC_CIR_LSIRDYF) != 0); - break; + case RCC_PLLSAI: + return ((RCC_CIR & RCC_CIR_PLLSAIRDYF) != 0); + case RCC_PLLI2S: + return ((RCC_CIR & RCC_CIR_PLLI2SRDYF) != 0); } - - cm3_assert_not_reached(); + return 0; } void rcc_css_int_clear(void) @@ -407,6 +423,12 @@ void rcc_wait_for_osc_ready(enum rcc_osc osc) case RCC_LSI: while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); break; + case RCC_PLLSAI: + while ((RCC_CR & RCC_CR_PLLSAIRDY) == 0); + break; + case RCC_PLLI2S: + while ((RCC_CR & RCC_CR_PLLI2SRDY) == 0); + break; } } @@ -449,6 +471,12 @@ void rcc_osc_on(enum rcc_osc osc) case RCC_LSI: RCC_CSR |= RCC_CSR_LSION; break; + case RCC_PLLSAI: + RCC_CR |= RCC_CR_PLLSAION; + break; + case RCC_PLLI2S: + RCC_CR |= RCC_CR_PLLI2SON; + break; } } @@ -470,6 +498,12 @@ void rcc_osc_off(enum rcc_osc osc) case RCC_LSI: RCC_CSR &= ~RCC_CSR_LSION; break; + case RCC_PLLSAI: + RCC_CR &= ~RCC_CR_PLLSAION; + break; + case RCC_PLLI2S: + RCC_CR &= ~RCC_CR_PLLI2SON; + break; } } @@ -492,9 +526,7 @@ void rcc_osc_bypass_enable(enum rcc_osc osc) case RCC_LSE: RCC_BDCR |= RCC_BDCR_LSEBYP; break; - case RCC_PLL: - case RCC_HSI: - case RCC_LSI: + default: /* Do nothing, only HSE/LSE allowed here. */ break; } @@ -509,9 +541,7 @@ void rcc_osc_bypass_disable(enum rcc_osc osc) case RCC_LSE: RCC_BDCR &= ~RCC_BDCR_LSEBYP; break; - case RCC_PLL: - case RCC_HSI: - case RCC_LSI: + default: /* Do nothing, only HSE/LSE allowed here. */ break; }