brh_7seg.c revision 1.1 1 /* $NetBSD: brh_7seg.c,v 1.1 2003/01/25 02:00:16 thorpej Exp $ */
2
3 /*
4 * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
23 * written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 /*
39 * Support for the 7-segment display on the ADI Engineering BRH board.
40 */
41
42 #include <sys/param.h>
43 #include <sys/systm.h>
44
45 #include <machine/bus.h>
46
47 #include <evbarm/adi_brh/brhreg.h>
48 #include <evbarm/adi_brh/brhvar.h>
49
50 #define WRITE(x, v) *((__volatile uint8_t *) (x)) = (v)
51
52 static int snakestate;
53
54 static const uint8_t digitmap[] = {
55 /* +#####+
56 * # #
57 * # #
58 * # #
59 * +-----+
60 * # #
61 * # #
62 * # #
63 * +#####+
64 */
65 SEG_G,
66
67 /* +-----+
68 * | #
69 * | #
70 * | #
71 * +-----+
72 * | #
73 * | #
74 * | #
75 * +-----+
76 */
77 SEG_A|SEG_D|SEG_E|SEG_F|SEG_G,
78
79 /* +#####+
80 * | #
81 * | #
82 * | #
83 * +#####+
84 * # |
85 * # |
86 * # |
87 * +#####+
88 */
89 SEG_C|SEG_F,
90
91 /* +#####+
92 * | #
93 * | #
94 * | #
95 * +#####+
96 * | #
97 * | #
98 * | #
99 * +#####+
100 */
101 SEG_E|SEG_F,
102
103 /* +-----+
104 * # #
105 * # #
106 * # #
107 * +#####+
108 * | #
109 * | #
110 * | #
111 * +-----+
112 */
113 SEG_A|SEG_D|SEG_E,
114
115 /* +#####+
116 * # |
117 * # |
118 * # |
119 * +#####+
120 * | #
121 * | #
122 * | #
123 * +#####+
124 */
125 SEG_B|SEG_E,
126
127 /* +#####+
128 * # |
129 * # |
130 * # |
131 * +#####+
132 * # #
133 * # #
134 * # #
135 * +#####+
136 */
137 SEG_B,
138
139 /* +#####+
140 * | #
141 * | #
142 * | #
143 * +-----+
144 * | #
145 * | #
146 * | #
147 * +-----+
148 */
149 SEG_D|SEG_E|SEG_F,
150
151 /* +#####+
152 * # #
153 * # #
154 * # #
155 * +#####+
156 * # #
157 * # #
158 * # #
159 * +#####+
160 */
161 0,
162
163 /* +#####+
164 * # #
165 * # #
166 * # #
167 * +#####+
168 * | #
169 * | #
170 * | #
171 * +-----+
172 */
173 SEG_D|SEG_E,
174 };
175
176 static uint8_t
177 brh_7seg_xlate(char c)
178 {
179 uint8_t rv;
180
181 if (c >= '0' && c <= '9')
182 rv = digitmap[c - '0'];
183 else if (c == '.')
184 rv = (u_int8_t) ~SEG_DP;
185 else
186 rv = 0xff;
187
188 return (rv);
189 }
190
191 void
192 brh_7seg(char a)
193 {
194 uint8_t ch;
195
196 ch = brh_7seg_xlate(a);
197
198 snakestate = 0;
199
200 WRITE(BRH_LED_VBASE, ch);
201 }
202
203 static const uint8_t snakemap[] = {
204
205 /* +#####+
206 * | |
207 * | |
208 * | |
209 * +-----+
210 * | |
211 * | |
212 * | |
213 * +-----+
214 */
215 ~SEG_A,
216
217 /* +-----+
218 * # |
219 * # |
220 * # |
221 * +-----+
222 * | |
223 * | |
224 * | |
225 * +-----+
226 */
227 ~SEG_F,
228
229 /* +-----+
230 * | |
231 * | |
232 * | |
233 * +#####+
234 * | |
235 * | |
236 * | |
237 * +-----+
238 */
239 ~SEG_G,
240
241 /* +-----+
242 * | |
243 * | |
244 * | |
245 * +-----+
246 * | #
247 * | #
248 * | #
249 * +-----+
250 */
251 ~SEG_C,
252
253 /* +-----+
254 * | |
255 * | |
256 * | |
257 * +-----+
258 * | |
259 * | |
260 * | |
261 * +#####+
262 */
263 ~SEG_D,
264
265 /* +-----+
266 * | |
267 * | |
268 * | |
269 * +-----+
270 * # |
271 * # |
272 * # |
273 * +-----+
274 */
275 ~SEG_E,
276
277 /* +-----+
278 * | |
279 * | |
280 * | |
281 * +#####+
282 * | |
283 * | |
284 * | |
285 * +-----+
286 */
287 ~SEG_G,
288
289 /* +-----+
290 * | #
291 * | #
292 * | #
293 * +-----+
294 * | |
295 * | |
296 * | |
297 * +-----+
298 */
299 ~SEG_B,
300 };
301
302 void
303 brh_7seg_snake(void)
304 {
305 int cur = snakestate;
306
307 WRITE(BRH_LED_VBASE, snakemap[cur]);
308
309 snakestate = (cur + 1) & 7;
310 }
311