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