1/*
2 * Copyright (c) 2007, 2008, 2009, ETH Zurich. All rights reserved.
3 *
4 * This file is distributed under the terms in the attached LICENSE file.
5 * If you do not find this file, copies can be found by writing to:
6 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
7 */
8
9/*
10 * pc16550d_uart.dev
11 *
12 * DESCRIPTION: PC16550D Universal Asynchronous Receiver Transmitter
13 *              with FIFOs
14 *
15 * This is derived from the IC specification white paper from National
16 * Semiconductor (TL/C/8652 and RRD-B30M75).
17 */
18
19device pc16550d_mem lsbfirst ( addr base ) "PC16550D UART Memory Represenation" {
20  constants trigger_lvl "RCVR FIFO trigger level" {
21    bytes1  = 0b00      "Every byte";
22    bytes4  = 0b01      "Every 4th byte";
23    bytes8  = 0b10      "Every 8th byte";
24    bytes14 = 0b11      "Every 14th byte";
25  };
26
27  constants char_len "Character Length" {
28    bits5   = 0b00   "5 Bits";
29    bits6   = 0b01   "6 Bits";
30    bits7   = 0b10   "7 Bits";
31    bits8   = 0b11   "8 Bits";
32  };
33
34  constants irq_id "Interrupt ID" {
35    irq_none    = 0b0001          "No interrupt pending";
36    irq_rls     = 0b0110          "Receiver line status";
37    irq_rda     = 0b0100          "Receiver data available";
38    irq_cti     = 0b1100          "Character timeout";
39    irq_thre    = 0b0010          "Transmitter holding register empty";
40    irq_ms      = 0b0000          "Modem status";
41  };
42
43  constants divisor "Baud Rate Divisor" {
44    baud50          = 2304     "50 bps";
45    baud75          = 1536     "75 bps";
46    baud110         = 1047     "110 bps";
47    baud134_5       = 857      "134.5 bps";
48    baud150         = 768      "150 bps";
49    baud300         = 384      "300 bps";
50    baud600         = 192      "600 bps";
51    baud1200        = 96       "1200 bps";
52    baud1800        = 64       "1800 bps";
53    baud2000        = 58       "2000 bps";
54    baud2400        = 48       "2400 bps";
55    baud4800        = 24       "4800 bps";
56    baud7200        = 16       "7200 bps";
57    baud9600        = 12       "9600 bps";
58    baud19200       = 6        "19200 bps";
59    baud38400       = 3        "38400 bps";
60    baud57600       = 2        "57600 bps";
61    baud115200      = 1        "115200 bps";
62  };
63
64  constants fifo_type "FIFO Type" {
65    no_fifo         = 0b00      "No FIFO";
66    unusable_fifo   = 0b10      "Unusable FIFO (16550 only)";
67    fifo_enabled    = 0b11      "FIFO enabled";
68  };
69
70  register rbr rw addr ( base, 0x0 ) "Receiver buffer" type(uint8);
71  register thr rw also addr ( base , 0x1 ) "Transmitter holding" type(uint8);
72
73  register ier rw addr ( base, 0x2 ) "Interrupt enable" {
74    erbfi         1  "Enable received data available interrupt";
75    etbei         1  "Enable transmitter holding register empty interrupt";
76    elsi          1  "Enable receiver line status interrupt";
77    edssi         1  "Enable modem status interrupt";
78    _             4  mbz;
79  };
80
81  register iir rw addr ( base, 0x3 ) "Interrupt identification" {
82    iid           4  type(irq_id) "Interrupt ID";
83    _             2  mbz;
84    fifoe         2  type(fifo_type) "FIFOs enabled";
85  };
86
87  register fcr rw also addr ( base, 0x4 ) "FIFO control" {
88    fifoe         1  "FIFO enable";
89    rfifo_reset   1  "RCVR FIFO reset";
90    xfifo_reset   1  "XMIT FIFO reset";
91    dma_mode      1  "DMA mode select";
92    _             2;
93    rtrigger      2  type(trigger_lvl)  "RCVR trigger";
94  };
95
96  register lcr rw addr ( base, 0x5 ) "Line control" {
97    wls           2  type(char_len) "Word length select";
98    stb           1  "Number of stop bits";
99    pen           1  "Parity enable";
100    eps           1  "Even parity select";
101    sp            1  "Stick parity";
102    sb            1  "Set break";
103    dlab          1  "Divisor latch access";
104  };
105
106  register mcr rw addr ( base, 0x6 ) "Modem control" {
107    dtr           1  "Data terminal ready";
108    rts           1  "Request to send";
109    out           2  "Out";
110    loop          1  "Loop";
111    _             3  mbz;
112  };
113
114  register lsr rw addr ( base, 0x7 ) "Line status" {
115    dr            1  "Data ready";
116    oe            1  "Overrun error";
117    pe            1  "Parity error";
118    fe            1  "Framing error";
119    bi            1  "Break interrupt";
120    thre          1  "Transmitter holding register";
121    temt          1  "Transmitter empty";
122    erfifo        1  "Error in RCVR FIFO";
123  };
124
125  register msr rw addr ( base, 0x8 ) "Modem status" {
126    dcts          1  "Delta clear to send";
127    ddsr          1  "Delta data set ready";
128    teri          1  "Trailing edge ring indicator";
129    ddcd          1  "Delta data carrier detect";
130    cts           1  "Clear to send";
131    dsr           1  "Data set ready";
132    ri            1  "Ring indicator";
133    dcd           1  "Data carrier detect";
134  };
135
136  register scr rw addr ( base , 0x9 ) "Scratch register" type(uint8);
137  register dl rw also addr ( base , 0xa ) "Divisor latch" type(uint16);
138  register dll rw also addr ( base , 0xa ) "Divisor latch LSB" type(uint8);
139  register dlm rw also addr ( base , 0xb ) "Divisor latch MSB" type(uint8);
140};
141