embox
178 строк · 4.3 Кб
1/**
2* @file
3* @brief
4*
5* @author Anton Kozlov
6* @date 06.08.2014
7*/
8
9#include <stdint.h>10#include <string.h>11
12#include <drivers/serial/diag_serial.h>13
14#include <drivers/serial/stm_usart.h>15
16#include <drivers/serial/uart_dev.h>17
18static int stm32_uart_putc(struct uart *dev, int ch) {19USART_TypeDef *uart = (void *) dev->base_addr;20
21while ((STM32_USART_FLAGS(uart) & USART_FLAG_TXE) == 0);22
23STM32_USART_TXDATA(uart) = (uint8_t) ch;24
25return 0;26}
27
28static int stm32_uart_hasrx(struct uart *dev) {29USART_TypeDef *uart = (void *) dev->base_addr;30
31/* Clear possible Overruns. It can happen, for example,32* when start scripts executed and you press buttons at the same time. */
33STM32_USART_CLEAR_ORE(uart);34
35return STM32_USART_FLAGS(uart) & USART_FLAG_RXNE;36}
37
38static int stm32_uart_getc(struct uart *dev) {39USART_TypeDef *uart = (void *) dev->base_addr;40
41return (uint8_t)(STM32_USART_RXDATA(uart) & 0xFF);42}
43
44static void stm32cube_fill_uart_init_param(const struct uart_params *params, UART_InitTypeDef *init) {45uint32_t flags;46
47flags = params->uart_param_flags;48
49switch (UART_PARAM_FLAGS_PARITY_MASK(flags)) {50case UART_PARAM_FLAGS_PARITY_ODD:51init->Parity = UART_PARITY_ODD;52break;53case UART_PARAM_FLAGS_PARITY_EVEN:54init->Parity = UART_PARITY_EVEN;55break;56case UART_PARAM_FLAGS_PARITY_NONE:57default:58init->Parity = UART_PARITY_NONE;59break;60}61
62switch (UART_PARAM_FLAGS_BIT_WORD_MASK(flags)) {63#if defined (UART_WORDLENGTH_7B)64case UART_PARAM_FLAGS_7BIT_WORD:65init->WordLength = UART_WORDLENGTH_7B;66break;67#endif68case UART_PARAM_FLAGS_9BIT_WORD:69init->WordLength = UART_WORDLENGTH_9B;70break;71case UART_PARAM_FLAGS_8BIT_WORD:72default:73init->WordLength = UART_WORDLENGTH_8B;74break;75}76
77
78switch (UART_PARAM_FLAGS_STOPS_MASK(flags)) {79#if defined (UART_STOPBITS_0_5)80case UART_PARAM_FLAGS_0_5_STOP:81init->StopBits = UART_STOPBITS_0_5;82break;83#endif84#if defined (UART_STOPBITS_1_5)85case UART_PARAM_FLAGS_1_5_STOP:86init->StopBits = UART_STOPBITS_1_5;87break;88#endif89case UART_PARAM_FLAGS_2_STOP:90init->StopBits = UART_STOPBITS_2;91break;92case UART_PARAM_FLAGS_1_STOP:93default:94init->StopBits = UART_STOPBITS_1;95break;96}97
98switch (UART_PARAM_FLAGS_HWCTRL_MASK(flags)) {99case UART_PARAM_FLAGS_HWCRTL_CTS:100init->HwFlowCtl = UART_HWCONTROL_CTS;101break;102case UART_PARAM_FLAGS_HWCRTL_RTS:103init->HwFlowCtl = UART_HWCONTROL_RTS;104break;105case UART_PARAM_FLAGS_HWCRTL_BOTH:106init->HwFlowCtl = UART_HWCONTROL_RTS_CTS;107break;108case UART_PARAM_FLAGS_HWCRTL_NONE:109default:110init->HwFlowCtl = UART_HWCONTROL_NONE;111break;112}113
114init->BaudRate = params->baud_rate;115init->Mode = UART_MODE_TX_RX;116
117}
118
119static int stm32_uart_setup(struct uart *dev, const struct uart_params *params) {120UART_HandleTypeDef UartHandle;121
122memset(&UartHandle, 0, sizeof(UartHandle));123
124UartHandle.Instance = (void*) dev->base_addr;125
126stm32cube_fill_uart_init_param(params, &UartHandle.Init);127
128if (HAL_UART_Init(&UartHandle) != HAL_OK) {129return -1;130}131
132if (dev->params.uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {133/* Enable the UART Data Register not empty Interrupt */134__HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);135}136
137return 0;138}
139
140static int stm32_uart_irq_en(struct uart *dev, const struct uart_params *params) {141if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {142UART_HandleTypeDef UartHandle;143
144memset(&UartHandle, 0, sizeof(UartHandle));145
146UartHandle.Instance = (void*) dev->base_addr;147
148stm32cube_fill_uart_init_param(params, &UartHandle.Init);149
150/* Enable the UART Data Register not empty Interrupt */151__HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);152}153return 0;154}
155
156static int stm32_uart_irq_dis(struct uart *dev, const struct uart_params *params) {157if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {158UART_HandleTypeDef UartHandle;159
160memset(&UartHandle, 0, sizeof(UartHandle));161
162UartHandle.Instance = (void*) dev->base_addr;163
164stm32cube_fill_uart_init_param(params, &UartHandle.Init);165
166__HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);167}168return 0;169}
170
171const struct uart_ops stm32_uart_ops = {172.uart_getc = stm32_uart_getc,173.uart_putc = stm32_uart_putc,174.uart_hasrx = stm32_uart_hasrx,175.uart_setup = stm32_uart_setup,176.uart_irq_en = stm32_uart_irq_en,177.uart_irq_dis = stm32_uart_irq_dis,178};179