From af870d7ae3039f0686c7a7d9e8f51f38eb09bb8c Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 24 May 2013 11:11:48 -0600 Subject: [PATCH] Fix bugs in SLCD test and in SLCD CODEC --- arch/arm/src/stm32/stm32_lse.c | 15 ++++++++++ configs/stm32ldiscovery/src/stm32_lcd.c | 2 +- libc/misc/lib_slcddecode.c | 40 ++++++++++--------------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/arch/arm/src/stm32/stm32_lse.c b/arch/arm/src/stm32/stm32_lse.c index 1080b4b201..56d68b1dca 100644 --- a/arch/arm/src/stm32/stm32_lse.c +++ b/arch/arm/src/stm32/stm32_lse.c @@ -41,6 +41,7 @@ #include "up_arch.h" +#include "stm32_pwr.h" #include "stm32_rcc.h" #include "stm32_waste.h" @@ -78,6 +79,16 @@ #ifdef CONFIG_STM32_STM32L15XX void stm32_rcc_enablelse(void) { + uint16_t pwrcr; + + /* The LSE is in the RTC domain and write access is denied to this domain + * after reset, you have to enable write access using DBP bit in the PWR CR + * register before to configuring the LSE. + */ + + pwrcr = getreg16(STM32_PWR_CR); + putreg16(pwrcr | PWR_CR_DBP, STM32_PWR_CR); + /* Enable the External Low-Speed (LSE) oscillator by setting the LSEON bit * the RCC CSR register. */ @@ -110,6 +121,10 @@ void stm32_rcc_enablelse(void) modifyreg32(STM32_RCC_CSR, 0, RCC_CSR_RTCEN); #endif #endif + + /* Restore the previous state of the DBP bit */ + + putreg16(pwrcr, STM32_PWR_CR); } #else diff --git a/configs/stm32ldiscovery/src/stm32_lcd.c b/configs/stm32ldiscovery/src/stm32_lcd.c index c94eeea097..57e09d9cb3 100644 --- a/configs/stm32ldiscovery/src/stm32_lcd.c +++ b/configs/stm32ldiscovery/src/stm32_lcd.c @@ -841,7 +841,7 @@ static void slcd_writech(uint8_t ch, uint8_t curpos, uint8_t options) { segset |= 0x0002; } - else if ((options & SCLD_DP) != 0) + else if ((options & SCLD_COLON) != 0) { segset |= 0x0020; } diff --git a/libc/misc/lib_slcddecode.c b/libc/misc/lib_slcddecode.c index 04e9e569e3..97fa951c8b 100644 --- a/libc/misc/lib_slcddecode.c +++ b/libc/misc/lib_slcddecode.c @@ -109,7 +109,7 @@ static uint8_t slcd_nibble(uint8_t ascii) * Name: slcd_reget * * Description: - * We have unused characters from the last, unsuccessful decode attempt. + * We have unused characters from the last, unsuccessful decode attempt. * Return one of these instead of the new character from the stream. * * Input Parameters: @@ -260,9 +260,14 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream, if (!IS_HEX(ch)) { + /* Decode the value following the bracket */ + + code = CODE_RETURN(ch); + count = 0; + /* Verify the special CLCD action code */ - if (ch < (int)FIRST_SLCDCODE || ch > (int)LAST_SLCDCODE) + if (code < (int)FIRST_SLCDCODE || code > (int)LAST_SLCDCODE) { /* Not a special command code.. put the character in the reget * buffer. @@ -275,11 +280,6 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream, return slcd_reget(state, pch, parg); } - - /* Provide the return values */ - - code = CODE_RETURN(ch); - count = 0; } else { @@ -312,7 +312,7 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream, return slcd_reget(state, pch, parg); } - + /* Save the second character of the two byte hexidecimal number */ state->buf[NDX_COUNTL] = (uint8_t)ch; @@ -337,28 +337,21 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream, state->buf[NDX_CODE5] = (uint8_t)ch; state->nch = NCH_CODE5; - /* Verify the special CLCD action code */ - - if (ch < (int)FIRST_SLCDCODE || ch > (int)LAST_SLCDCODE) - { - /* Not a special command code. Return the ESC now and the rest - * of the characters later. - */ - - return slcd_reget(state, pch, parg); - } - - /* Provide the return values */ + /* Get the code and the count values. All count values must be greater + * than 0 or something is wrong. + */ code = CODE_RETURN(ch); count = slcd_nibble(state->buf[NDX_COUNTH]) << 4; slcd_nibble(state->buf[NDX_COUNTL]); - /* All count values must be greater than 0 or something is wrong */ + /* Verify the special CLCD action code */ - if (count < 1) + if (code < (int)FIRST_SLCDCODE || code > (int)LAST_SLCDCODE || count < 1) { - /* Return the ESC now and the rest of the characters later. */ + /* Not a special command code. Return the ESC now and the rest + * of the characters later. + */ return slcd_reget(state, pch, parg); } @@ -374,4 +367,3 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream, state->nch = 0; return SLCDRET_SPEC; } -