diff --git a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c index f1d7b5e89c..29a6b05359 100644 --- a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c +++ b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c @@ -44,11 +44,15 @@ static inline void uart_enable_interrupts(struct uart_periph* p) { ((uartRegs_t *)(p->reg_addr))->ier = UIER_ERBFI; } -static inline void uart_set_baudrate(struct uart_periph* p, uint32_t baud) { - // set the baudrate - ((uartRegs_t *)(p->reg_addr))->lcr = ULCR_DLAB_ENABLE; // select divisor latches - ((uartRegs_t *)(p->reg_addr))->dll = (uint8_t)baud; // set for baud low byte - ((uartRegs_t *)(p->reg_addr))->dlm = (uint8_t)(baud >> 8); // set for baud high byte +static inline void uart_set_baudrate(struct uart_periph* p, enum UartBaud baud) { + /* calculate the baudrate */ + uint32_t _baud_reg_val = (uint16_t)((PCLK / (((float)baud) * 16.0)) + 0.5); + /* select divisor latches */ + ((uartRegs_t *)(p->reg_addr))->lcr = ULCR_DLAB_ENABLE; + /* set for baud low byte */ + ((uartRegs_t *)(p->reg_addr))->dll = (uint8_t)_baud_reg_val; + /* set for baud high byte */ + ((uartRegs_t *)(p->reg_addr))->dlm = (uint8_t)(_baud_reg_val >> 8); // set the number of characters and other // user specified operating parameters @@ -58,7 +62,7 @@ static inline void uart_set_baudrate(struct uart_periph* p, uint32_t baud) { ((uartRegs_t *)(p->reg_addr))->fcr = UART_FIFO_8; } -void uart_periph_set_baudrate(struct uart_periph* p, uint32_t baud, bool_t hw_flow_control __attribute__ ((unused))) { +void uart_periph_set_baudrate(struct uart_periph* p, enum UartBaud baud, bool_t hw_flow_control __attribute__ ((unused))) { uart_disable_interrupts(p); uart_set_baudrate(p, baud); uart_enable_interrupts(p); diff --git a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.h b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.h index c4ae2e4804..874449f7b7 100644 --- a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.h +++ b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.h @@ -34,18 +34,6 @@ #include "LPC21xx.h" #include BOARD_CONFIG -#define UART_BAUD(baud) (uint16_t)((PCLK / ((baud) * 16.0)) + 0.5) - -#define B1200 UART_BAUD(1200) -#define B2400 UART_BAUD(2400) -#define B4800 UART_BAUD(4800) -#define B9600 UART_BAUD(9600) -#define B19200 UART_BAUD(19200) -#define B38400 UART_BAUD(38400) -#define B57600 UART_BAUD(57600) -#define B115200 UART_BAUD(115200) -#define B230400 UART_BAUD(230400) - #define UART_8N1 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO + ULCR_STOP_1) #define UART_7N1 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_NO + ULCR_STOP_1) #define UART_8N2 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO + ULCR_STOP_2) diff --git a/sw/airborne/arch/omap/mcu_periph/uart_arch.c b/sw/airborne/arch/omap/mcu_periph/uart_arch.c index 397bd9a57d..b3ec43b3f3 100644 --- a/sw/airborne/arch/omap/mcu_periph/uart_arch.c +++ b/sw/airborne/arch/omap/mcu_periph/uart_arch.c @@ -102,7 +102,7 @@ static inline void uart_handler(struct uart_periph* p) { void uart0_init( void ) { uart_periph_init(&uart0); uart.dev = UART0_DEV; - uart_periph_set_baudrate(&uart0,UART0_BAUD); + uart_periph_set_baudrate(&uart0,UART0_BAUD,FALSE); } @@ -117,7 +117,7 @@ void uart0_handler(void) { void uart1_init( void ) { uart_periph_init(&uart1); uart.dev = UART1_DEV; - uart_periph_init_param(&uart1,UART1_BAUD); + uart_periph_set_baudrate(&uart1,UART1_BAUD,FALSE); } void uart1_handler(void) { diff --git a/sw/airborne/arch/stm32/mcu_periph/uart_arch.c b/sw/airborne/arch/stm32/mcu_periph/uart_arch.c index 262f93759d..3351287df5 100644 --- a/sw/airborne/arch/stm32/mcu_periph/uart_arch.c +++ b/sw/airborne/arch/stm32/mcu_periph/uart_arch.c @@ -34,7 +34,7 @@ #include #include "std.h" -void uart_periph_set_baudrate(struct uart_periph* p, uint32_t baud, bool_t hw_flow_control) { +void uart_periph_set_baudrate(struct uart_periph* p, enum UartBaud baud, bool_t hw_flow_control) { /* Configure USART */ usart_set_baudrate((u32)p->reg_addr, baud); diff --git a/sw/airborne/arch/stm32/mcu_periph/uart_arch.h b/sw/airborne/arch/stm32/mcu_periph/uart_arch.h index 8b1f5210ce..a375fb83ee 100644 --- a/sw/airborne/arch/stm32/mcu_periph/uart_arch.h +++ b/sw/airborne/arch/stm32/mcu_periph/uart_arch.h @@ -31,10 +31,4 @@ #include "std.h" -#define B4800 4800 -#define B9600 9600 -#define B38400 38400 -#define B57600 57600 -#define B115200 115200 - #endif /* STM32_UART_ARCH_H */ diff --git a/sw/airborne/mcu_periph/uart.h b/sw/airborne/mcu_periph/uart.h index 4540af5949..17ffe780d0 100644 --- a/sw/airborne/mcu_periph/uart.h +++ b/sw/airborne/mcu_periph/uart.h @@ -35,6 +35,21 @@ #define UART_TX_BUFFER_SIZE 128 #define UART_DEV_NAME_SIZE 16 +/** + * UART Baud rates + */ +enum UartBaud { + B1200 = 1200, + B2400 = 2400, + B4800 = 4800, + B9600 = 9600, + B19200 = 19200, + B38400 = 38400, + B57600 = 57600, + B115200 = 115200, + B230400 = 230400 +}; + /** * UART peripheral */ @@ -55,8 +70,7 @@ struct uart_periph { }; extern void uart_periph_init(struct uart_periph* p); -extern void uart_periph_set_baudrate(struct uart_periph* p, uint32_t baud, bool_t hw_flow_control); -//extern void uart_periph_init_param(struct uart_periph* p, uint32_t baud, uint8_t mode, uint8_t fmode, char * dev); +extern void uart_periph_set_baudrate(struct uart_periph* p, enum UartBaud, bool_t hw_flow_control); extern void uart_transmit(struct uart_periph* p, uint8_t data); extern bool_t uart_check_free_space(struct uart_periph* p, uint8_t len); @@ -81,7 +95,6 @@ extern void uart0_init(void); #define Uart0Getch() UartGetch(uart0) #define Uart0TxRunning uart0.tx_running #define Uart0SetBaudrate(_b) uart_periph_set_baudrate(&uart0, _b, FALSE) -//#define Uart0InitParam(_b, _m, _fm) uart_periph_init_param(&uart0, _b, _m, _fm, "") #define UART0Init Uart0Init #define UART0CheckFreeSpace Uart0CheckFreeSpace @@ -110,7 +123,6 @@ extern void uart1_init(void); #else #define Uart1SetBaudrate(_b) uart_periph_set_baudrate(&uart1, _b, FALSE) #endif -//#define Uart1InitParam(_b, _m, _fm) uart_periph_init_param(&uart1, _b, _m, _fm, "") #define UART1Init Uart1Init #define UART1CheckFreeSpace Uart1CheckFreeSpace @@ -135,7 +147,6 @@ extern void uart2_init(void); #define Uart2Getch() UartGetch(uart2) #define Uart2TxRunning uart2.tx_running #define Uart2SetBaudrate(_b) uart_periph_set_baudrate(&uart2, _b, FALSE) -//#define Uart2InitParam(_b, _m, _fm) uart_periph_init_param(&uart2, _b, _m, _fm, "") #define UART2Init Uart2Init #define UART2CheckFreeSpace Uart2CheckFreeSpace @@ -160,7 +171,6 @@ extern void uart3_init(void); #define Uart3Getch() UartGetch(uart3) #define Uart3TxRunning uart3.tx_running #define Uart3SetBaudrate(_b) uart_periph_set_baudrate(&uart3, _b, FALSE) -//#define Uart3InitParam(_b, _m, _fm) uart_periph_init_param(&uart3, _b, _m, _fm, "") #define UART3Init Uart3Init #define UART3CheckFreeSpace Uart3CheckFreeSpace @@ -185,7 +195,6 @@ extern void uart5_init(void); #define Uart5Getch() UartGetch(uart5) #define Uart5TxRunning uart5.tx_running #define Uart5SetBaudrate(_b) uart_periph_set_baudrate(&uart5, _b, FALSE) -//#define Uart5InitParam(_b, _m, _fm) uart_periph_init_param(&uart5, _b, _m, _fm, "") #define UART5Init Uart5Init #define UART5CheckFreeSpace Uart5CheckFreeSpace