source: rtems/bsps/arm/lm3s69xx/console/uart.c @ ba619b7f

Last change on this file since ba619b7f was ba619b7f, checked in by Joel Sherrill <joel@…>, on 03/01/22 at 21:38:20

bsps/arm/: Scripted embedded brains header file clean up

Updates #4625.

  • Property mode set to 100644
File size: 3.7 KB
Line 
1/*
2 * Copyright (c) 2013 Eugeniy Meshcheryakov <eugen@debian.org>
3 *
4 * Copyright (c) 2011 Sebastian Huber.  All rights reserved.
5 *
6 * The license and distribution terms for this file may be
7 * found in the file LICENSE in this distribution or at
8 * http://www.rtems.org/license/LICENSE.
9 */
10
11#include <bspopts.h>
12#include <bsp/uart.h>
13#include <libchip/sersupp.h>
14#include <bsp/syscon.h>
15#include <bsp/lm3s69xx.h>
16#include <rtems/irq-extension.h>
17#include <assert.h>
18
19#define LM3S69XX_UART_FIFO_DEPTH 16
20
21static volatile lm3s69xx_uart *get_uart_regs(int minor)
22{
23  console_tbl *ct = Console_Port_Tbl [minor];
24
25  return (lm3s69xx_uart *) ct->ulCtrlPort1;
26}
27
28static unsigned int get_uart_number(int minor)
29{
30  console_tbl *ct = Console_Port_Tbl [minor];
31
32  return (unsigned int)ct->pDeviceParams;
33}
34
35/*
36 * Returns both integer and fractional parts as one number.
37 */
38static uint32_t get_baud_div(uint32_t baud)
39{
40  uint32_t clock4 = LM3S69XX_SYSTEM_CLOCK * 4;
41  return (clock4 + baud - 1) / baud;
42}
43
44static void irq_handler(void *arg)
45{
46  int minor = (int)arg;
47  console_data *cd = &Console_Port_Data [minor];
48  volatile lm3s69xx_uart *uart = get_uart_regs(minor);
49
50  do {
51    char buf[LM3S69XX_UART_FIFO_DEPTH];
52    int i = 0;
53    uint32_t status = uart->fr;
54
55    while (((status & UARTFR_RXFE) == 0) && (i < LM3S69XX_UART_FIFO_DEPTH)) {
56      uint32_t d = uart->dr;
57
58      if ((d & UARTDR_ERROR_MSK) == 0) {
59        buf[i] = UARTDR_DATA_GET(d);
60        i++;
61      }
62
63      status = uart->fr;
64    }
65
66    if (i > 0)
67      rtems_termios_enqueue_raw_characters(cd->termios_data, buf, i);
68  } while (uart->mis != 0);
69}
70
71static void initialize(int minor)
72{
73  const console_tbl *ct = Console_Port_Tbl[minor];
74  volatile lm3s69xx_uart *uart = get_uart_regs(minor);
75  unsigned int num = get_uart_number(minor);
76
77  lm3s69xx_syscon_enable_uart_clock(num, true);
78
79  uart->ctl = 0;
80
81  uint32_t brd = get_baud_div(LM3S69XX_UART_BAUD);
82  uart->ibrd = brd / 64;
83  uart->fbrd = brd % 64;
84
85  uart->lcrh = UARTLCRH_WLEN(0x3) | UARTLCRH_FEN;
86  uart->ctl = UARTCTL_RXE | UARTCTL_TXE | UARTCTL_UARTEN;
87
88  int rv = rtems_interrupt_handler_install(ct->ulIntVector, "UART",
89      RTEMS_INTERRUPT_UNIQUE, irq_handler, (void *)minor);
90  assert(rv == RTEMS_SUCCESSFUL);
91}
92
93static int first_open(int major, int minor, void *arg)
94{
95  rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg;
96  struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1;
97  console_data *cd = &Console_Port_Data [minor];
98  volatile lm3s69xx_uart *uart = get_uart_regs(minor);
99
100  cd->termios_data = tty;
101  rtems_termios_set_initial_baud(tty, LM3S69XX_UART_BAUD);
102
103  /* Drain the RX FIFO. */
104  while ((uart->fr & UARTFR_RXFE) == 0)
105    (void)uart->dr;
106
107  uart->im = UARTI_RX | UARTI_RT;
108
109  return 0;
110}
111
112static int last_close(int major, int minor, void *arg)
113{
114  volatile lm3s69xx_uart *uart = get_uart_regs(minor);
115  uart->im = 0;
116
117  return 0;
118}
119
120static void write_polled(int minor, char c)
121{
122  volatile lm3s69xx_uart *uart = get_uart_regs(minor);
123
124  while ((uart->fr & UARTFR_TXFF) != 0) {
125    /* Wait */
126  }
127
128  uart->dr = UARTDR_DATA(c);
129}
130
131static ssize_t write_support_polled(
132  int minor,
133  const char *s,
134  size_t n
135)
136{
137  ssize_t i = 0;
138
139  for (i = 0; i < n; ++i) {
140    write_polled(minor, s [i]);
141  }
142
143  return n;
144}
145
146static int set_attribues(int minor, const struct termios *term)
147{
148  return -1;
149}
150
151const console_fns lm3s69xx_uart_fns = {
152  .deviceProbe = libchip_serial_default_probe,
153  .deviceFirstOpen = first_open,
154  .deviceLastClose = last_close,
155  .deviceRead = NULL,
156  .deviceWrite = write_support_polled,
157  .deviceInitialize = initialize,
158  .deviceWritePolled = write_polled,
159  .deviceSetAttributes = set_attribues,
160  .deviceOutputUsesInterrupts = false
161};
Note: See TracBrowser for help on using the repository browser.