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