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 IQ81342.
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/i8134x/i81342reg.h>
55 #include <arm/xscale/i8134x/iq81342reg.h>
56 #include <arm/xscale/i8134x/iq81342var.h>
58 #define WRITE(x, v) *((__volatile uint8_t *) (x)) = (v)
60 static int snakestate;
63 * The 7-segment display looks like so:
76 * Setting a bit clears the corresponding segment on the
79 #define SEG_A (1 << 1)
80 #define SEG_B (1 << 2)
81 #define SEG_C (1 << 3)
82 #define SEG_D (1 << 4)
83 #define SEG_E (1 << 5)
84 #define SEG_F (1 << 6)
85 #define SEG_G (1 << 7)
86 #define SEG_DP (1 << 0)
88 static const uint8_t digitmap[] = {
99 (unsigned char)~SEG_G,
147 ~(SEG_A|SEG_D|SEG_E),
183 ~(SEG_D|SEG_E|SEG_F),
211 iq81342_7seg_xlate(char c)
215 if (c >= '0' && c <= '9')
216 rv = digitmap[c - '0'];
218 rv = (uint8_t) ~SEG_DP;
226 iq81342_7seg(char a, char b)
230 msb = iq81342_7seg_xlate(a);
231 lsb = iq81342_7seg_xlate(b);
235 WRITE(IQ8134X_7SEG_MSB, msb);
236 WRITE(IQ8134X_7SEG_LSB, lsb);
239 static const uint8_t snakemap[][2] = {
338 static SYSCTL_NODE(_hw, OID_AUTO, sevenseg, CTLFLAG_RD, 0, "7 seg");
339 static int freq = 20;
340 SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0,
341 "7 Seg update frequency");
343 iq81342_7seg_snake(void)
345 static int snakefreq;
346 int cur = snakestate;
349 if ((snakefreq % freq))
351 WRITE(IQ8134X_7SEG_MSB, snakemap[cur][0]);
352 WRITE(IQ8134X_7SEG_LSB, snakemap[cur][1]);
354 snakestate = (cur + 1) & 7;
357 struct iq81342_7seg_softc {
362 iq81342_7seg_probe(device_t dev)
365 device_set_desc(dev, "IQ81342 7seg");
369 extern void (*i80321_hardclock_hook)(void);
371 iq81342_7seg_attach(device_t dev)
374 i80321_hardclock_hook = iq81342_7seg_snake;
378 static device_method_t iq81342_7seg_methods[] = {
379 DEVMETHOD(device_probe, iq81342_7seg_probe),
380 DEVMETHOD(device_attach, iq81342_7seg_attach),
384 static driver_t iq81342_7seg_driver = {
386 iq81342_7seg_methods,
387 sizeof(struct iq81342_7seg_softc),
389 static devclass_t iq81342_7seg_devclass;
391 DRIVER_MODULE(iqseg, iq, iq81342_7seg_driver, iq81342_7seg_devclass, 0, 0);