source: mainline/kernel/genarch/include/drivers/arm926_uart/arm926_uart.h@ 8ec4144

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8ec4144 was 8ec4144, checked in by Jan Vesely <jano.vesely@…>, 13 years ago

integratorcp: Add uart kernel driver.

  • Property mode set to 100644
File size: 6.0 KB
Line 
1/*
2 * Copyright (c) 2012 Jan Vesely
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup genarch
30 * @{
31 */
32/**
33 * @file
34 * @brief ARM926 on-chip UART (PrimeCell UART, PL011) driver.
35 */
36
37#ifndef KERN_S3C24XX_UART_H_
38#define KERN_S3C24XX_UART_H_
39
40#include <ddi/irq.h>
41#include <console/chardev.h>
42#include <typedefs.h>
43
44
45/** ARM926 User Guide ch. 4.8.5 (p. 106 in the pdf) */
46#define ARM926_UART0_BASE_ADDRESS 0x16000000
47#define ARM926_UART1_BASE_ADDRESS 0x16000000
48
49/** ARM926 User Guide ch. A.1 (p. 124 in the pdf) */
50#define ARM926_UART0_IRQ 1
51#define ARM926_UART1_IRQ 2
52
53/** PrimeCell UART TRM ch. 3.3 (p. 49 in the pdf) */
54typedef struct {
55 /** UART data register */
56 ioport32_t data;
57#define ARM926_UART_DATA_DATA_MASK 0xff
58#define ARM926_UART_DATA_FE_FLAG (1 << 7)
59#define ARM926_UART_DATA_PE_FLAG (1 << 9)
60#define ARM926_UART_DATA_BE_FLAG (1 << 10)
61#define ARM926_UART_DATA_OE_FLAG (1 << 11)
62
63 union {
64 /* Same values that are in upper bits of data register*/
65 const ioport32_t status;
66#define ARM926_UART_STATUS_FE_FLAG (1 << 0)
67#define ARM926_UART_STATUS_PE_FLAG (1 << 1)
68#define ARM926_UART_STATUS_BE_FLAG (1 << 2)
69#define ARM926_UART_STATUS_OE_FLAG (1 << 3)
70 /* Writing anything clears all errors */
71 ioport32_t error_clear;
72 };
73 uint32_t padd0_[4];
74
75 const ioport32_t flag;
76#define ARM926_UART_FLAG_CTS_FLAG (1 << 0)
77#define ARM926_UART_FLAG_DSR_FLAG (1 << 1)
78#define ARM926_UART_FLAG_DCD_FLAG (1 << 2)
79#define ARM926_UART_FLAG_BUSY_FLAG (1 << 3)
80#define ARM926_UART_FLAG_RXFE_FLAG (1 << 4)
81#define ARM926_UART_FLAG_TXFF_FLAG (1 << 5)
82#define ARM926_UART_FLAG_RXFF_FLAG (1 << 6)
83#define ARM926_UART_FLAG_TXFE_FLAG (1 << 7)
84#define ARM926_UART_FLAG_RI_FLAG (1 << 8)
85 uint32_t padd1_;
86
87 ioport32_t irda_low_power;
88#define ARM926_UART_IRDA_LOW_POWER_MASK 0xff
89
90 ioport32_t int_baud_divisor;
91#define ARM926_UART_INT_BAUD_DIVISOR_MASK 0xffff
92
93 ioport32_t fract_baud_divisor;
94#define ARM926_UART_FRACT_BAUD_DIVISOR_MASK 0x1f
95
96 ioport32_t line_control_high;
97#define ARM926_UART_CONTROLHI_BRK_FLAG (1 << 0)
98#define ARM926_UART_CONTROLHI_PEN_FLAG (1 << 1)
99#define ARM926_UART_CONTROLHI_EPS_FLAG (1 << 2)
100#define ARM926_UART_CONTROLHI_STP2_FLAG (1 << 3)
101#define ARM926_UART_CONTROLHI_FEN_FLAG (1 << 4)
102#define ARM926_UART_CONTROLHI_WLEN_MASK 0x3
103#define ARM926_UART_CONTROLHI_WLEN_SHIFT 5
104#define ARM926_UART_CONTROLHI_SPS_FLAG (1 << 5)
105
106 ioport32_t control;
107#define ARM926_UART_CONTROL_UARTEN_FLAG (1 << 0)
108#define ARM926_UART_CONTROL_SIREN_FLAG (1 << 1)
109#define ARM926_UART_CONTROL_SIRLP_FLAG (1 << 2)
110#define ARM926_UART_CONTROL_LBE_FLAG (1 << 7)
111#define ARM926_UART_CONTROL_TXE_FLAG (1 << 8)
112#define ARM926_UART_CONTROL_RXE_FLAG (1 << 9)
113#define ARM926_UART_CONTROL_DTR_FLAG (1 << 10)
114#define ARM926_UART_CONTROL_RTS_FLAG (1 << 11)
115#define ARM926_UART_CONTROL_OUT1_FLAG (1 << 12)
116#define ARM926_UART_CONTROL_OUT2_FLAG (1 << 13)
117#define ARM926_UART_CONTROL_RTSE_FLAG (1 << 14)
118#define ARM926_UART_CONTROL_CTSE_FLAG (1 << 15)
119
120 ioport32_t interrupt_fifo;
121#define ARM926_UART_INTERRUPTFIFO_TX_MASK 0x7
122#define ARM926_UART_INTERRUPTFIFO_TX_SHIFT 0
123#define ARM926_UART_INTERRUPTFIFO_RX_MASK 0x7
124#define ARM926_UART_INTERRUPTFIFO_RX_SHIFT 3
125
126 /** Interrupt mask register */
127 ioport32_t interrupt_mask;
128 /** Pending interrupts before applying the mask */
129 const ioport32_t raw_interrupt_status;
130 /** Pending interrupts after applying the mask */
131 const ioport32_t masked_interrupt_status;
132 /** Write 1s to clear pending interrupts */
133 ioport32_t interrupt_clear;
134#define ARM926_UART_INTERRUPT_RIM_FLAG (1 << 0)
135#define ARM926_UART_INTERRUPT_CTSM_FLAG (1 << 1)
136#define ARM926_UART_INTERRUPT_DCDM_FLAG (1 << 2)
137#define ARM926_UART_INTERRUPT_DSRM_FLAG (1 << 3)
138#define ARM926_UART_INTERRUPT_RX_FLAG (1 << 4)
139#define ARM926_UART_INTERRUPT_TX_FLAG (1 << 5)
140#define ARM926_UART_INTERRUPT_RT_FLAG (1 << 6)
141#define ARM926_UART_INTERRUPT_FE_FLAG (1 << 7)
142#define ARM926_UART_INTERRUPT_PE_FLAG (1 << 8)
143#define ARM926_UART_INTERRUPT_BE_FLAG (1 << 9)
144#define ARM926_UART_INTERRUPT_OE_FLAG (1 << 10)
145#define ARM926_UART_INTERRUPT_ALL 0x3ff
146
147 ioport32_t dma_control;
148#define ARM926_UART_DMACONTROL_RXDMAEN_FLAG (1 << 0)
149#define ARM926_UART_DMACONTROL_TXDMAEN_FLAG (1 << 1)
150#define ARM926_UART_DMACONTROL_DMAONERR_FLAG (1 << 2)
151
152 // TODO There is some reserved space here followed by
153 // peripheral identification registers.
154} arm926_uart_regs_t;
155
156typedef struct {
157 arm926_uart_regs_t *regs;
158 indev_t *indev;
159 outdev_t outdev;
160 irq_t irq;
161} arm926_uart_t;
162
163bool arm926_uart_init(arm926_uart_t *, inr_t, uintptr_t, size_t);
164void arm926_uart_input_wire(arm926_uart_t *, indev_t *);
165
166#endif
167/**
168 * @}
169 */
Note: See TracBrowser for help on using the repository browser.