Annotation of sys/arch/landisk/stand/boot/scifcons.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: scifcons.c,v 1.2 2006/10/10 05:26:54 miod Exp $ */
2: /* $NetBSD: scifcons.c,v 1.1 2006/09/01 21:26:18 uwe Exp $ */
3: /* NetBSD: scif.c,v 1.38 2004/12/13 02:14:13 chs Exp */
4:
5: /*-
6: * Copyright (C) 1999 T.Horiuchi and SAITOH Masanobu. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. The name of the author may not be used to endorse or promote products
17: * derived from this software without specific prior written permission.
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29: */
30: /*-
31: * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
32: * All rights reserved.
33: *
34: * This code is derived from software contributed to The NetBSD Foundation
35: * by Charles M. Hannum.
36: *
37: * Redistribution and use in source and binary forms, with or without
38: * modification, are permitted provided that the following conditions
39: * are met:
40: * 1. Redistributions of source code must retain the above copyright
41: * notice, this list of conditions and the following disclaimer.
42: * 2. Redistributions in binary form must reproduce the above copyright
43: * notice, this list of conditions and the following disclaimer in the
44: * documentation and/or other materials provided with the distribution.
45: * 3. All advertising materials mentioning features or use of this software
46: * must display the following acknowledgement:
47: * This product includes software developed by the NetBSD
48: * Foundation, Inc. and its contributors.
49: * 4. Neither the name of The NetBSD Foundation nor the names of its
50: * contributors may be used to endorse or promote products derived
51: * from this software without specific prior written permission.
52: *
53: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
54: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
55: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
57: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
58: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
59: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
60: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
61: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
62: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
63: * POSSIBILITY OF SUCH DAMAGE.
64: */
65: /*
66: * Copyright (c) 1991 The Regents of the University of California.
67: * All rights reserved.
68: *
69: * Redistribution and use in source and binary forms, with or without
70: * modification, are permitted provided that the following conditions
71: * are met:
72: * 1. Redistributions of source code must retain the above copyright
73: * notice, this list of conditions and the following disclaimer.
74: * 2. Redistributions in binary form must reproduce the above copyright
75: * notice, this list of conditions and the following disclaimer in the
76: * documentation and/or other materials provided with the distribution.
77: * 3. Neither the name of the University nor the names of its contributors
78: * may be used to endorse or promote products derived from this software
79: * without specific prior written permission.
80: *
81: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
82: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
83: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
84: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
85: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
86: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
87: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
88: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
89: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
90: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
91: * SUCH DAMAGE.
92: *
93: * @(#)com.c 7.5 (Berkeley) 5/16/91
94: */
95: /*
96: * SH internal serial driver
97: *
98: * This code is derived from both z8530tty.c and com.c
99: */
100:
101: #include <libsa.h>
102:
103: #include <arch/sh/dev/scifreg.h>
104:
105: #define scif_smr_read() SHREG_SCSMR2
106: #define scif_smr_write(v) (SHREG_SCSMR2 = (v))
107:
108: #define scif_brr_read() SHREG_SCBRR2
109: #define scif_brr_write(v) (SHREG_SCBRR2 = (v))
110:
111: #define scif_scr_read() SHREG_SCSCR2
112: #define scif_scr_write(v) (SHREG_SCSCR2 = (v))
113:
114: #define scif_ftdr_write(v) (SHREG_SCFTDR2 = (v))
115:
116: #define scif_ssr_read() SHREG_SCSSR2
117: #define scif_ssr_write(v) (SHREG_SCSSR2 = (v))
118:
119: #define scif_frdr_read() SHREG_SCFRDR2
120:
121: #define scif_fcr_read() SHREG_SCFCR2
122: #define scif_fcr_write(v) (SHREG_SCFCR2 = (v))
123:
124: #define scif_fdr_read() SHREG_SCFDR2
125:
126: #define scif_sptr_read() SHREG_SCSPTR2
127: #define scif_sptr_write(v) (SHREG_SCSPTR2 = (v))
128:
129: #define scif_lsr_read() SHREG_SCLSR2
130: #define scif_lsr_write(v) (SHREG_SCLSR2 = (v))
131:
132: #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */
133:
134: #define SERBUFSIZE 16
135: static u_char serbuf[SERBUFSIZE];
136: static int serbuf_read = 0;
137: static int serbuf_write = 0;
138:
139: void
140: scif_init(unsigned int bps)
141: {
142:
143: serbuf_read = 0;
144: serbuf_write = 0;
145:
146: /* Initialize SCR */
147: scif_scr_write(0x00);
148:
149: /* Clear FIFO */
150: scif_fcr_write(SCFCR2_TFRST | SCFCR2_RFRST);
151:
152: /* Serial Mode Register */
153: scif_smr_write(0x00); /* 8bit,NonParity,Even,1Stop */
154:
155: /* Bit Rate Register */
156: scif_brr_write(divrnd(PCLOCK, 32 * bps) - 1);
157:
158: delay(100);
159:
160: scif_sptr_write(SCSPTR2_RTSIO);
161:
162: scif_fcr_write(FIFO_RCV_TRIGGER_1 | FIFO_XMT_TRIGGER_8);
163:
164: /* Send permission, Receive permission ON */
165: scif_scr_write(SCSCR2_TE | SCSCR2_RE);
166:
167: /* Serial Status Register */
168: scif_ssr_write(scif_ssr_read() & SCSSR2_TDFE); /* Clear Status */
169: }
170:
171: int
172: scif_getc(void)
173: {
174: unsigned char c, err_c;
175: unsigned short err_c2;
176:
177: if (serbuf_read != serbuf_write) {
178: c = serbuf[serbuf_read];
179: serbuf_read = (serbuf_read + 1) % SERBUFSIZE;
180: return (c);
181: }
182:
183: for (;;) {
184: /* wait for ready */
185: while ((scif_fdr_read() & SCFDR2_RECVCNT) == 0)
186: continue;
187:
188: c = scif_frdr_read();
189: err_c = scif_ssr_read();
190: scif_ssr_write(scif_ssr_read()
191: & ~(SCSSR2_ER | SCSSR2_BRK | SCSSR2_RDF | SCSSR2_DR));
192:
193: err_c2 = scif_lsr_read();
194: scif_lsr_write(scif_lsr_read() & ~SCLSR2_ORER);
195:
196: if ((err_c & (SCSSR2_ER | SCSSR2_BRK | SCSSR2_FER
197: | SCSSR2_PER)) == 0) {
198: if ((err_c2 & SCLSR2_ORER) == 0) {
199: return (c);
200: }
201: }
202: }
203: }
204:
205: void
206: scif_putc(int c)
207: {
208:
209: /* wait for ready */
210: while ((scif_fdr_read() & SCFDR2_TXCNT) == SCFDR2_TXF_FULL)
211: continue;
212:
213: /* write send data to send register */
214: scif_ftdr_write(c);
215:
216: /* clear ready flag */
217: scif_ssr_write(scif_ssr_read() & ~(SCSSR2_TDFE | SCSSR2_TEND));
218: }
219:
220: int
221: cnischar(void)
222: {
223: unsigned char c, err_c;
224: unsigned short err_c2;
225:
226: /* check if any preread input is already there */
227: if (serbuf_read != serbuf_write)
228: return (1);
229:
230: if (scif_fdr_read() & SCFDR2_RECVCNT) {
231: c = scif_frdr_read();
232: err_c = scif_ssr_read();
233: scif_ssr_write(scif_ssr_read()
234: & ~(SCSSR2_ER | SCSSR2_BRK | SCSSR2_RDF | SCSSR2_DR));
235:
236: err_c2 = scif_lsr_read();
237: scif_lsr_write(scif_lsr_read() & ~SCLSR2_ORER);
238:
239: if ((err_c & (SCSSR2_ER | SCSSR2_BRK | SCSSR2_FER
240: | SCSSR2_PER)) == 0) {
241: if ((err_c2 & SCLSR2_ORER) == 0) {
242: /* stuff char into preread buffer */
243: serbuf[serbuf_write] = (u_char)c;
244: serbuf_write = (serbuf_write + 1) % SERBUFSIZE;
245: return (1);
246: }
247: }
248: }
249: return (0); /* nothing out there... */
250: }
CVSweb