mirror of
https://github.com/oliverschmidt/contiki.git
synced 2025-01-02 19:29:30 +00:00
cc2538: uart: Fix crippled output occurring upon lpm_enter()
lpm_enter() must not enter PM1+ if the UART TX FIFO is not empty. Otherwise, the UART clock gets disabled, and its TX is broken. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
This commit is contained in:
parent
0692ee251d
commit
b8b54a033c
@ -41,8 +41,10 @@
|
|||||||
#include "dev/ioc.h"
|
#include "dev/ioc.h"
|
||||||
#include "dev/gpio.h"
|
#include "dev/gpio.h"
|
||||||
#include "dev/uart.h"
|
#include "dev/uart.h"
|
||||||
|
#include "lpm.h"
|
||||||
#include "reg.h"
|
#include "reg.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -96,9 +98,19 @@ reset(void)
|
|||||||
REG(UART_BASE | UART_CTL) |= UART_CTL_UARTEN;
|
REG(UART_BASE | UART_CTL) |= UART_CTL_UARTEN;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static bool
|
||||||
|
permit_pm1(void)
|
||||||
|
{
|
||||||
|
/* Note: UART_FR.TXFE reads 0 if the UART clock is gated. */
|
||||||
|
return (REG(SYS_CTRL_RCGCUART) & SYS_CTRL_RCGCUART_UART) == 0 ||
|
||||||
|
(REG(UART_BASE | UART_FR) & UART_FR_TXFE) != 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uart_init(void)
|
uart_init(void)
|
||||||
{
|
{
|
||||||
|
lpm_register_peripheral(permit_pm1);
|
||||||
|
|
||||||
/* Enable clock for the UART while Running, in Sleep and Deep Sleep */
|
/* Enable clock for the UART while Running, in Sleep and Deep Sleep */
|
||||||
REG(SYS_CTRL_RCGCUART) |= SYS_CTRL_RCGCUART_UART;
|
REG(SYS_CTRL_RCGCUART) |= SYS_CTRL_RCGCUART_UART;
|
||||||
REG(SYS_CTRL_SCGCUART) |= SYS_CTRL_SCGCUART_UART;
|
REG(SYS_CTRL_SCGCUART) |= SYS_CTRL_SCGCUART_UART;
|
||||||
|
@ -102,7 +102,7 @@ static uint8_t max_pm;
|
|||||||
#ifdef LPM_CONF_PERIPH_PERMIT_PM1_FUNCS_MAX
|
#ifdef LPM_CONF_PERIPH_PERMIT_PM1_FUNCS_MAX
|
||||||
#define LPM_PERIPH_PERMIT_PM1_FUNCS_MAX LPM_CONF_PERIPH_PERMIT_PM1_FUNCS_MAX
|
#define LPM_PERIPH_PERMIT_PM1_FUNCS_MAX LPM_CONF_PERIPH_PERMIT_PM1_FUNCS_MAX
|
||||||
#else
|
#else
|
||||||
#define LPM_PERIPH_PERMIT_PM1_FUNCS_MAX 1
|
#define LPM_PERIPH_PERMIT_PM1_FUNCS_MAX 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
lpm_periph_permit_pm1_func_t
|
lpm_periph_permit_pm1_func_t
|
||||||
|
@ -182,7 +182,7 @@ typedef bool (*lpm_periph_permit_pm1_func_t)(void);
|
|||||||
* \param permit_pm1_func Pointer to the function
|
* \param permit_pm1_func Pointer to the function
|
||||||
*
|
*
|
||||||
* Some peripherals are sensitive to PM changes. For instance, we don't want to
|
* Some peripherals are sensitive to PM changes. For instance, we don't want to
|
||||||
* drop to PM1+ if the USB PLL is active.
|
* drop to PM1+ if the USB PLL is active or if the UART TX FIFO is not clear.
|
||||||
*
|
*
|
||||||
* When changing power modes, the LPM driver will call all FPs registered with
|
* When changing power modes, the LPM driver will call all FPs registered with
|
||||||
* this function. The peripheral's function will return true or false to permit
|
* this function. The peripheral's function will return true or false to permit
|
||||||
|
Loading…
Reference in New Issue
Block a user