summaryrefslogtreecommitdiff
path: root/sys/arch/pc532/dev/scnreg.h
blob: 569ce9c5db7ef5a8bea40cf3e6b93356536fc64c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*	$NetBSD: scnreg.h,v 1.5 1994/10/26 08:24:19 cgd Exp $	*/

/* 
 * Copyright (c) 1993 Philip A. Nelson.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Philip A. Nelson.
 * 4. The name of Philip A. Nelson may not be used to endorse or promote
 *    products derived from this software without specific prior written
 *    permission.
 *
 * THIS SOFTWARE IS PROVIDED BY PHILIP NELSON ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL PHILIP NELSON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *	scnreg.h: definitions for the scn serial driver.
 */

/* Constants. */
#ifdef COMDEF_SPEED
#undef  TTYDEF_SPEED
#define TTYDEF_SPEED    COMDEF_SPEED	/* default baud rate */
#endif

#define SCN_FIRST_ADR	  0x28000000	/* address of first RS232 port */
#define SCN_FIRST_MAP_ADR 0xFFC80000	/* mapped address of first port */

#define SCN_SIZE	         0x8	/* address space for port */

#define SCN_CONSOLE 		   0	/* minor number of console */

#define SCN_CON_MAP_STAT  0xFFC80001	/* raw addresses for console */
#define SCN_CON_MAP_DATA  0xFFC80003	/* Mapped .... */
#define SCN_CON_MAP_ISR	  0xFFC80005

#define SCN_CON_STAT 	  0x28000001    /* raw addresses for console */
#define SCN_CON_DATA  	  0x28000003    /* Unmapped .... */
#define SCN_CON_ISR	  0x28000005


/* SCN2691 registers, values. */
#define LINE_SZ		0x08
#define UART_SZ		0x10
#define MR_ADR		(line_base+0)
#define STAT_ADR	(line_base+1)
#define SPEED_ADR	(line_base+1)
#define CMD_ADR		(line_base+2)
#define DATA_ADR	(line_base+3)
#define IPCR_ADR	(uart_base+4)
#define ACR_ADR		(uart_base+4)
#define ISR_ADR		(uart_base+5)
#define IMR_ADR		(uart_base+5)
#define IP_ADR		(uart_base+13)
#define OPCR_ADR	(uart_base+13)
#define SET_OP_ADR	(uart_base+14)
#define CLR_OP_ADR	(uart_base+15)

/* Data Values */
#define LC_ODD		0x04
#define	LC_EVEN		0x00
#define LC_NONE		0x10
#define LC_STOP1	0x07
#define LC_STOP2	0x0f
#define LC_BITS5	0x00
#define LC_BITS6	0x01
#define LC_BITS7	0x02
#define LC_BITS8	0x03
#define LC_CHARS	0x03
#define LC_CHARS_SHIFT  0x08
#define LC_SP_GRP	0x10
#define LC_SP_BOTH	0x20

#define RTS_BIT		0x1
#define CTS_BIT		0x1
#define DTR_BIT		0x4
#define DCD_BIT		0x4

/* CR (command) register values. */
#define CMD_ENA_RX	0x01
#define CMD_DIS_RX	0x02
#define CMD_ENA_TX	0x04
#define CMD_DIS_TX	0x08
#define CMD_MR1		0x10
#define CMD_RESET_RX	0x20
#define CMD_RESET_TX	0x30
#define CMD_RESET_ERR	0x40
#define CMD_RESET_BRK	0x50
#define CMD_START_BRK	0x60
#define CMD_STOP_BRK	0x70

/* SR register */
#define SR_RX_RDY	0x01
#define SR_TX_RDY	0x04
#define SR_BREAK	0x80
#define SR_FRAME	0x40
#define SR_PARITY	0x20
#define SR_OVERRUN	0x10

/* Output port configuration. */
#define OPCR_CONFIG	0x00

/* Input port interrupt config. */
#define ACR_CTS		0x01
#define ACR_DCD		0x04
#define IPCR_CTS	0x10
#define IPCR_DCD	0x40

/* Interrupt configurations. */
#define IMR_IP_INT	0x80
#define IMR_BRK_INT	0x04
#define IMR_RX_INT	0x02
#define IMR_TX_INT	0x01
#define IMR_BRKB_INT	0x40
#define IMR_RXB_INT	0x20
#define IMR_TXB_INT	0x10

/* If we need a delay.... */
#define DELAY(x)  {int i; for (i=0; i<x*10000; i++); }

#define istart(rs) \
  (WR_ADR(u_char, rs->opset_port, (RTS_BIT | DTR_BIT) << (rs)->a_or_b))

#define istop(rs) \
  (WR_ADR(u_char, rs->opclr_port, RTS_BIT << (rs)->a_or_b))

#define get_dcd(rs) \
  (RD_ADR(u_char, rs->ip_port) & (DCD_BIT << (1-rs->a_or_b)))

#define tx_rdy(rs) \
  (RD_ADR(u_char, rs->stat_port) & SR_TX_RDY)

/* Interrupts on and off. */
#define tx_ints_off(rs) \
    { rs->uart->imr_int_bits &=	~((IMR_TX_INT) << (4*rs->a_or_b)); \
      WR_ADR (u_char, rs->uart->imr_port, rs->uart->imr_int_bits); }

#define tx_ints_on(rs) \
    { rs->uart->imr_int_bits |= (IMR_TX_INT) << (4*rs->a_or_b); \
      WR_ADR (u_char, rs->uart->imr_port, rs->uart->imr_int_bits); }

#define rx_ints_off(rs) \
    { rs->uart->imr_int_bits &=	~((IMR_RX_INT) << (4*rs->a_or_b)); \
      WR_ADR (u_char, rs->uart->imr_port, rs->uart->imr_int_bits); }

#define rx_ints_on(rs) \
    { rs->uart->imr_int_bits |= (IMR_RX_INT) << (4*rs->a_or_b); \
      WR_ADR (u_char, rs->uart->imr_port, rs->uart->imr_int_bits); }

/* Structure definitions. */
typedef unsigned long port_t;

/* The DUART description table */
struct duart_info {
  char i_speed[2], o_speed[2];	/* Channel A and B speeds. */
  char i_code[2],  o_code[2];	/* Channel A and B speeds. */
  char speed_grp;		/* ACR bit 7 */
  char acr_int_bits;		/* ACR bits 0-6 */
  char imr_int_bits;		/* IMR bits current set. */

  port_t isr_port;
  port_t imr_port;
  port_t ipcr_port;
  port_t opcr_port;
};

/* RS232 device structure, one per device. */
struct rs232_s {
  int unit;			/* unit number of this line (base 0) */
  struct duart_info *uart;	/* pointer to uart struct */
  char a_or_b;			/* 0 => A, 1 => B */
  
  long scn_bits;		/* Temp! for TIOCM ... */

  port_t xmit_port;		/* i/o ports */
  port_t recv_port;
  port_t mr_port;
  port_t stat_port;	/* sra or srb */
  port_t speed_port;	/* csra or csrb */
  port_t cmd_port;	/* cra or crb */
  port_t acr_port;
  port_t ip_port;
  port_t opset_port;
  port_t opclr_port;

  unsigned char lstatus;	/* last line status */
  unsigned framing_errors;	/* error counts (no reporting yet) */
  unsigned overrun_errors;
  unsigned parity_errors;
  unsigned break_interrupts;

};