1 /* $NetBSD: iq31244_7seg.c,v 1.2 2003/07/15 00:25:01 lukem Exp $ */
4 * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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
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.
39 * Support for the 7-segment display on the Intel IQ31244.
42 #include <sys/cdefs.h>
43 __FBSDID("$FreeBSD$");
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/kernel.h>
48 #include <sys/module.h>
50 #include <sys/sysctl.h>
52 #include <machine/bus.h>
54 #include <arm/xscale/i80321/iq80321reg.h>
55 #include <arm/xscale/i80321/iq80321var.h>
57 #define WRITE(x, v) *((__volatile uint8_t *) (x)) = (v)
59 static int snakestate;
62 * The 7-segment display looks like so:
75 * Setting a bit clears the corresponding segment on the
78 #define SEG_A (1 << 0)
79 #define SEG_B (1 << 1)
80 #define SEG_C (1 << 2)
81 #define SEG_D (1 << 3)
82 #define SEG_E (1 << 4)
83 #define SEG_F (1 << 5)
84 #define SEG_G (1 << 6)
85 #define SEG_DP (1 << 7)
87 static const uint8_t digitmap[] = {
110 SEG_A|SEG_D|SEG_E|SEG_F|SEG_G,
210 iq80321_7seg_xlate(char c)
214 if (c >= '0' && c <= '9')
215 rv = digitmap[c - '0'];
217 rv = (uint8_t) ~SEG_DP;
225 iq80321_7seg(char a, char b)
229 msb = iq80321_7seg_xlate(a);
230 lsb = iq80321_7seg_xlate(b);
234 WRITE(IQ80321_7SEG_MSB, msb);
235 WRITE(IQ80321_7SEG_LSB, lsb);
238 static const uint8_t snakemap[][2] = {
337 SYSCTL_NODE(_hw, OID_AUTO, sevenseg, CTLFLAG_RD, 0, "7 seg");
338 static int freq = 20;
339 SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0,
340 "7 Seg update frequency");
342 iq31244_7seg_snake(void)
344 static int snakefreq;
345 int cur = snakestate;
348 if ((snakefreq % freq))
350 WRITE(IQ80321_7SEG_MSB, snakemap[cur][0]);
351 WRITE(IQ80321_7SEG_LSB, snakemap[cur][1]);
353 snakestate = (cur + 1) & 7;
356 struct iq31244_7seg_softc {
361 iq31244_7seg_probe(device_t dev)
364 device_set_desc(dev, "IQ31244 7seg");
368 extern void (*i80321_hardclock_hook)(void);
370 iq31244_7seg_attach(device_t dev)
373 i80321_hardclock_hook = iq31244_7seg_snake;
377 static device_method_t iq31244_7seg_methods[] = {
378 DEVMETHOD(device_probe, iq31244_7seg_probe),
379 DEVMETHOD(device_attach, iq31244_7seg_attach),
383 static driver_t iq31244_7seg_driver = {
385 iq31244_7seg_methods,
386 sizeof(struct iq31244_7seg_softc),
388 static devclass_t iq31244_7seg_devclass;
390 DRIVER_MODULE(iqseg, iq, iq31244_7seg_driver, iq31244_7seg_devclass, 0, 0);