source: rtems/bsps/arm/edb7312/console/uart.c

Last change on this file was d7d66d7, checked in by Sebastian Huber <sebastian.huber@…>, on 04/19/18 at 04:28:01

bsps: Move console drivers to bsps

This patch is a part of the BSP source reorganization.

Update #3285.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Cirrus EP7312 Console Driver
3 *
4 * Copyright (c) 2002 by Jay Monkman <jtm@smoothsmoothie.com>
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 <bsp.h>                /* Must be before libio.h */
12#include <rtems/libio.h>
13#include <termios.h>
14#include <rtems/bspIo.h>
15
16#include <ep7312.h>
17#include <libchip/serial.h>
18#include <libchip/sersupp.h>
19
20#define NUM_DEVS 1
21int     uart_poll_read(int minor);
22
23static int     uart_first_open(int major, int minor, void *arg);
24static int     uart_last_close(int major, int minor, void *arg);
25static int     uart_read(int minor);
26static ssize_t uart_write(int minor, const char *buf, size_t len);
27static void    uart_init(int minor);
28static void    uart_write_polled(int minor, char c);
29static int     uart_set_attributes(int minor, const struct termios *t);
30
31unsigned long Console_Configuration_Count = NUM_DEVS;
32
33const console_fns uart_fns =
34{
35    libchip_serial_default_probe,
36    uart_first_open,
37    uart_last_close,
38    uart_read,
39    uart_write,
40    uart_init,
41    uart_write_polled,
42    uart_set_attributes,
43    FALSE
44};
45console_tbl Console_Configuration_Ports[] = {
46    {
47        "/dev/com0",                      /* sDeviceName */
48        SERIAL_CUSTOM,                    /* deviceType */
49        &uart_fns,                        /* pDeviceFns */
50        NULL,                             /* deviceProbe */
51        NULL,                             /* pDeviceFlow */
52        16,                               /* ulMargin */
53        8,                                /* ulHysteresis */
54        NULL,                             /* pDeviceParams */
55        (uint32_t)EP7312_UARTCR1,       /* ulCtrlPort1 */
56        (uint32_t)EP7312_SYSFLG1,       /* ulCtrlPort2 */
57        (uint32_t)EP7312_UARTDR1,       /* ulDataPort */
58        0,                                /* getRegister */
59        0,                                /* setRegister */
60        0,                                /* getData */
61        0,                                /* setData */
62        0,                                /* ulClock */
63        0                                 /* ulIntVector */
64    }};
65
66static int     uart_first_open(int major, int minor, void *arg) {return 0;}
67static int     uart_last_close(int major, int minor, void *arg) {return 0;}
68static int     uart_read(int minor)
69{
70    return uart_poll_read(minor);
71}
72
73static void    uart_write_polled(int minor, char c)
74{
75    uart_write(minor, &c, 1);
76}
77
78static int     uart_set_attributes(int minor, const struct termios *t)
79{
80    return 0;
81}
82
83int uart_poll_read(int minor)
84{
85    volatile uint32_t   *data_reg;
86    volatile uint32_t   *ctrl_reg2;
87    char        c;
88    int         err;
89
90    data_reg  = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort;
91    ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2;
92
93    if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) {
94        return -1;
95    }
96
97    err  = *data_reg;
98    c    = err & 0xff;
99    err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR);
100
101    return c;
102}
103
104static ssize_t uart_do_write(
105    volatile uint32_t *uartdr,
106    const char *buf,
107    size_t len,
108    volatile uint32_t *sysflg
109)
110{
111    size_t i;
112
113    for (i = 0; i < len; i++) {
114        /* Wait for fifo to have room */
115        while ((*sysflg & EP7312_UART_UTXFF1) != 0) {
116            continue;
117        }
118
119        *uartdr = buf[i];
120    }
121
122    return len;
123}
124
125static ssize_t uart_write(int minor, const char *buf, size_t len)
126{
127    volatile uint32_t   *data_reg;
128    volatile uint32_t   *ctrl_reg2;
129
130    data_reg  = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort;
131    ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2;
132
133    return uart_do_write(data_reg, buf, len, ctrl_reg2);
134}
135
136static void uart_init(int minor)
137{
138    volatile uint32_t   *ctrl_reg1;
139
140    ctrl_reg1 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort1;
141
142    /*   *ctrl_reg = (BSP_UART_DATA8       |
143                 BSP_UART_STOP1       |
144                 BSP_UART_PARITY_NONE |
145                 EP7312_UART_FIFOEN     |
146                 BSP_UART_BAUD_9600);
147    */
148    *ctrl_reg1 = (EP7312_UART_WRDLEN8    |
149                 EP7312_UART_FIFOEN     |
150                 0x17);              /* 9600 baud */
151
152}
153
154/*
155 * Debug IO support
156 */
157static void _BSP_null_char(char c)
158{
159  uart_do_write(EP7312_UARTDR1, &c, 1, EP7312_SYSFLG1);
160}
161
162static int _BSP_get_char(void)
163{
164  return uart_poll_read(0);
165}
166
167BSP_output_char_function_type BSP_output_char = _BSP_null_char;
168
169BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char;
Note: See TracBrowser for help on using the repository browser.