embox
83 строки · 2.1 Кб
1/**
2* @file
3*
4* @date Feb 11, 2023
5* @author Anton Bondarev
6*/
7
8#include <kernel/irq.h>9
10#include <util/macro.h>11
12#include <drivers/serial/uart_dev.h>13#include <drivers/ttys.h>14
15#include <drivers/common/memory.h>16
17#include <framework/mod/options.h>18
19#define UART_BASE OPTION_GET(NUMBER, base_addr)20#define IRQ_NUM OPTION_GET(NUMBER, irq_num)21
22#define PINS_INIT OPTION_GET(NUMBER, pins_init)23
24#define TTY_NAME ttyS125
26extern int elvees_uart_setup_common(struct uart *dev, const struct uart_params *params);27extern int elvees_uart_has_symbol(struct uart *dev);28extern int elvees_uart_getc(struct uart *dev);29extern int elvees_uart_putc(struct uart *dev, int ch);30
31#if PINS_INIT == 032
33static int elvees_uart_setup(struct uart *dev, const struct uart_params *params) {34return 0;35}
36
37#else38
39#include <drivers/gpio/gpio_driver.h>40
41#define PIN_RX_PORT OPTION_GET(NUMBER, pin_rx_port)42#define PIN_RX_PIN OPTION_GET(NUMBER, pin_rx_pin)43#define PIN_TX_PORT OPTION_GET(NUMBER, pin_tx_port)44#define PIN_TX_PIN OPTION_GET(NUMBER, pin_tx_pin)45
46static int elvees_uart_setup(struct uart *dev, const struct uart_params *params) {47#define GPIO_ALT_FUNC_UART (4)48
49gpio_setup_mode(PIN_RX_PORT, 1 << PIN_RX_PIN, GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(GPIO_ALT_FUNC_UART));50gpio_setup_mode(PIN_TX_PORT, 1 << PIN_TX_PIN, GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(GPIO_ALT_FUNC_UART));51
52elvees_uart_setup_common(dev, params);53
54return 0;55}
56#endif57
58static const struct uart_ops elvees_uart_uart_ops = {59.uart_getc = elvees_uart_getc,60.uart_putc = elvees_uart_putc,61.uart_hasrx = elvees_uart_has_symbol,62.uart_setup = elvees_uart_setup,63};64
65extern irq_return_t uart_irq_handler(unsigned int irq_nr, void *data);66
67
68
69static struct uart uart_ttyS1 = {70.uart_ops = &elvees_uart_uart_ops,71.irq_num = IRQ_NUM,72.base_addr = UART_BASE,73.params = {74.baud_rate = OPTION_GET(NUMBER,baud_rate),75.uart_param_flags = UART_PARAM_FLAGS_8BIT_WORD | UART_PARAM_FLAGS_USE_IRQ,76},77};78
79PERIPH_MEMORY_DEFINE(elvees_uart, UART_BASE, 0x1000);80
81STATIC_IRQ_ATTACH(IRQ_NUM, uart_irq_handler, &uart_ttyS1);82
83TTYS_DEF(TTY_NAME, &uart_ttyS1);84