source: rtems/c/src/lib/libbsp/arm/edb7312/console/uart.c @ eb18d28

4.104.11
Last change on this file since eb18d28 was eb18d28, checked in by Ralf Corsepius <ralf.corsepius@…>, on Apr 14, 2010 at 9:27:31 AM

2010-04-10 Ralf Corsépius <ralf.corsepius@…>

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