diff options
author | cognet <cognet@FreeBSD.org> | 2007-09-22 16:25:43 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2007-09-22 16:25:43 +0000 |
commit | 6b6ebc8c908ac584e9a243e1a2766707efbb506c (patch) | |
tree | 82b172c57dc69ede6326ad7e47a3878a3d2d6392 | |
parent | 910d5007854379f381cf1e08ba6d710db1d917aa (diff) | |
download | FreeBSD-src-6b6ebc8c908ac584e9a243e1a2766707efbb506c.zip FreeBSD-src-6b6ebc8c908ac584e9a243e1a2766707efbb506c.tar.gz |
Add a driver for the 7seg found on the CRB board, largely based on the
IQ31244 version.
Approved by: re (blanket)
-rw-r--r-- | sys/arm/conf/CRB | 2 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/crb_machdep.c | 7 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/files.crb | 1 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/i81342.c | 1 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/i81342reg.h | 3 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/iq81342_7seg.c | 391 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/iq81342reg.h | 33 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/iq81342var.h | 32 |
8 files changed, 470 insertions, 0 deletions
diff --git a/sys/arm/conf/CRB b/sys/arm/conf/CRB index 8302ed6..6180a2d 100644 --- a/sys/arm/conf/CRB +++ b/sys/arm/conf/CRB @@ -84,6 +84,8 @@ device atapifd # ATAPI floppy drives device atapist # ATAPI tape drives options ATA_STATIC_ID # Static device numbering +device "7seg" + # SCSI Controllers device pty diff --git a/sys/arm/xscale/i8134x/crb_machdep.c b/sys/arm/xscale/i8134x/crb_machdep.c index 032528b..d29693f 100644 --- a/sys/arm/xscale/i8134x/crb_machdep.c +++ b/sys/arm/xscale/i8134x/crb_machdep.c @@ -171,6 +171,13 @@ static const struct pmap_devmap iq81342_devmap[] = { VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, + { + IOP34X_PCE1_VADDR, + IOP34X_PCE1, + IOP34X_PCE1_SIZE, + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, { 0, 0, diff --git a/sys/arm/xscale/i8134x/files.crb b/sys/arm/xscale/i8134x/files.crb index d5e2b6f..25398af 100644 --- a/sys/arm/xscale/i8134x/files.crb +++ b/sys/arm/xscale/i8134x/files.crb @@ -1,2 +1,3 @@ # $FreeBSD$ arm/xscale/i8134x/crb_machdep.c standard +arm/xscale/i8134x/iq81342_7seg.c optional 7seg diff --git a/sys/arm/xscale/i8134x/i81342.c b/sys/arm/xscale/i8134x/i81342.c index f33e79a..072685b 100644 --- a/sys/arm/xscale/i8134x/i81342.c +++ b/sys/arm/xscale/i8134x/i81342.c @@ -400,6 +400,7 @@ i81342_attach(device_t dev) device_add_child(dev, "iopwdog", 0); device_add_child(dev, "pcib", 0); device_add_child(dev, "pcib", 1); + device_add_child(dev, "iqseg", 0); bus_generic_probe(dev); bus_generic_attach(dev); return (0); diff --git a/sys/arm/xscale/i8134x/i81342reg.h b/sys/arm/xscale/i8134x/i81342reg.h index 6380f00..25e5ba1 100644 --- a/sys/arm/xscale/i8134x/i81342reg.h +++ b/sys/arm/xscale/i8134x/i81342reg.h @@ -49,6 +49,9 @@ #define IOP34X_PBBAR0 0x81588 /* PBI Base Address Register 0 */ #define IOP34X_PBBAR0_ADDRMASK 0xfffff000 #define IOP34X_PBBAR1 0x81590 +#define IOP34X_PCE1 0xF2000000 +#define IOP34X_PCE1_SIZE 0x00100000 +#define IOP34X_PCE1_VADDR 0xF1000000 #define IOP34X_ESSTSR0 0x82188 #define IOP34X_CONTROLLER_ONLY (1 << 14) #define IOP34X_INT_SEL_PCIX (1 << 15) diff --git a/sys/arm/xscale/i8134x/iq81342_7seg.c b/sys/arm/xscale/i8134x/iq81342_7seg.c new file mode 100644 index 0000000..eeecd41 --- /dev/null +++ b/sys/arm/xscale/i8134x/iq81342_7seg.c @@ -0,0 +1,391 @@ +/* $NetBSD: iq31244_7seg.c,v 1.2 2003/07/15 00:25:01 lukem Exp $ */ + +/*- + * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Jason R. Thorpe for Wasabi Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Support for the 7-segment display on the Intel IQ81342. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/bus.h> +#include <sys/sysctl.h> + +#include <machine/bus.h> + +#include <arm/xscale/i8134x/i81342reg.h> +#include <arm/xscale/i8134x/iq81342reg.h> +#include <arm/xscale/i8134x/iq81342var.h> + +#define WRITE(x, v) *((__volatile uint8_t *) (x)) = (v) + +static int snakestate; + +/* + * The 7-segment display looks like so: + * + * A + * +-----+ + * | | + * F | | B + * | G | + * +-----+ + * | | + * E | | C + * | D | + * +-----+ o DP + * + * Setting a bit clears the corresponding segment on the + * display. + */ +#define SEG_A (1 << 1) +#define SEG_B (1 << 2) +#define SEG_C (1 << 3) +#define SEG_D (1 << 4) +#define SEG_E (1 << 5) +#define SEG_F (1 << 6) +#define SEG_G (1 << 7) +#define SEG_DP (1 << 0) + +static const uint8_t digitmap[] = { +/* +#####+ + * # # + * # # + * # # + * +-----+ + * # # + * # # + * # # + * +#####+ + */ + (unsigned char)~SEG_G, + +/* +-----+ + * | # + * | # + * | # + * +-----+ + * | # + * | # + * | # + * +-----+ + */ + SEG_B|SEG_C, + +/* +#####+ + * | # + * | # + * | # + * +#####+ + * # | + * # | + * # | + * +#####+ + */ + ~(SEG_C|SEG_F), + +/* +#####+ + * | # + * | # + * | # + * +#####+ + * | # + * | # + * | # + * +#####+ + */ + ~(SEG_E|SEG_F), + +/* +-----+ + * # # + * # # + * # # + * +#####+ + * | # + * | # + * | # + * +-----+ + */ + ~(SEG_A|SEG_D|SEG_E), + +/* +#####+ + * # | + * # | + * # | + * +#####+ + * | # + * | # + * | # + * +#####+ + */ + ~(SEG_B|SEG_E), + +/* +#####+ + * # | + * # | + * # | + * +#####+ + * # # + * # # + * # # + * +#####+ + */ + ~(SEG_B), + +/* +#####+ + * | # + * | # + * | # + * +-----+ + * | # + * | # + * | # + * +-----+ + */ + ~(SEG_D|SEG_E|SEG_F), + +/* +#####+ + * # # + * # # + * # # + * +#####+ + * # # + * # # + * # # + * +#####+ + */ + ~0, + +/* +#####+ + * # # + * # # + * # # + * +#####+ + * | # + * | # + * | # + * +-----+ + */ + ~(SEG_D|SEG_E), +}; + +static uint8_t +iq81342_7seg_xlate(char c) +{ + uint8_t rv; + + if (c >= '0' && c <= '9') + rv = digitmap[c - '0']; + else if (c == '.') + rv = (uint8_t) ~SEG_DP; + else + rv = 0xff; + + return (rv); +} + +void +iq81342_7seg(char a, char b) +{ + uint8_t msb, lsb; + + msb = iq81342_7seg_xlate(a); + lsb = iq81342_7seg_xlate(b); + + snakestate = 0; + + WRITE(IQ8134X_7SEG_MSB, msb); + WRITE(IQ8134X_7SEG_LSB, lsb); +} + +static const uint8_t snakemap[][2] = { + +/* +#####+ +#####+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + */ + { SEG_A, SEG_A }, + +/* +-----+ +-----+ + * # | | # + * # | | # + * # | | # + * +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + */ + { SEG_F, SEG_B }, + +/* +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +#####+ +#####+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + */ + { SEG_G, SEG_G }, + +/* +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + * | # # | + * | # # | + * | # # | + * +-----+ +-----+ + */ + { SEG_C, SEG_E }, + +/* +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +#####+ +#####+ + */ + { SEG_D, SEG_D }, + +/* +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + * # | | # + * # | | # + * # | | # + * +-----+ +-----+ + */ + { SEG_E, SEG_C }, + +/* +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +#####+ +#####+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + */ + { SEG_G, SEG_G }, + +/* +-----+ +-----+ + * | # # | + * | # # | + * | # # | + * +-----+ +-----+ + * | | | | + * | | | | + * | | | | + * +-----+ +-----+ + */ + { SEG_B, SEG_F }, +}; + +SYSCTL_NODE(_hw, OID_AUTO, sevenseg, CTLFLAG_RD, 0, "7 seg"); +static int freq = 20; +SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0, + "7 Seg update frequency"); +static void +iq81342_7seg_snake(void) +{ + static int snakefreq; + int cur = snakestate; + + snakefreq++; + if ((snakefreq % freq)) + return; + WRITE(IQ8134X_7SEG_MSB, snakemap[cur][0]); + WRITE(IQ8134X_7SEG_LSB, snakemap[cur][1]); + + snakestate = (cur + 1) & 7; +} + +struct iq81342_7seg_softc { + device_t dev; +}; + +static int +iq81342_7seg_probe(device_t dev) +{ + + device_set_desc(dev, "IQ81342 7seg"); + return (0); +} + +extern void (*i80321_hardclock_hook)(void); +static int +iq81342_7seg_attach(device_t dev) +{ + + i80321_hardclock_hook = iq81342_7seg_snake; + return (0); +} + +static device_method_t iq81342_7seg_methods[] = { + DEVMETHOD(device_probe, iq81342_7seg_probe), + DEVMETHOD(device_attach, iq81342_7seg_attach), + {0, 0}, +}; + +static driver_t iq81342_7seg_driver = { + "iqseg", + iq81342_7seg_methods, + sizeof(struct iq81342_7seg_softc), +}; +static devclass_t iq81342_7seg_devclass; + +DRIVER_MODULE(iqseg, iq, iq81342_7seg_driver, iq81342_7seg_devclass, 0, 0); diff --git a/sys/arm/xscale/i8134x/iq81342reg.h b/sys/arm/xscale/i8134x/iq81342reg.h new file mode 100644 index 0000000..b1e2516 --- /dev/null +++ b/sys/arm/xscale/i8134x/iq81342reg.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2006 Olivier Houchard + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* $FreeBSD$ */ + +#ifndef _IQ81342REG_H_ +#define _IQ81342REG_H_ +#define IQ8134X_7SEG_MSB IOP34X_PCE1_VADDR + 0x40000 +#define IQ8134X_7SEG_LSB IOP34X_PCE1_VADDR + 0x50000 +#endif /* _IQ81342REG_H_ */ diff --git a/sys/arm/xscale/i8134x/iq81342var.h b/sys/arm/xscale/i8134x/iq81342var.h new file mode 100644 index 0000000..af30b16 --- /dev/null +++ b/sys/arm/xscale/i8134x/iq81342var.h @@ -0,0 +1,32 @@ +/*- + * Copyright (c) 2006 Olivier Houchard + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* $FreeBSD$ */ + +#ifndef _IQ81342VAR_H_ +#define _IQ81342VAR_H_ +void iq81342_7seg(char, char); +#endif /* _I8Q1342VAR_H_ */ |