[BACK]Return to lcd.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / dev

Annotation of sys/arch/hppa/dev/lcd.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: lcd.c,v 1.2 2007/07/20 22:13:45 kettenis Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2007 Mark Kettenis
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice and this permission notice appear in all copies.
        !             9:  *
        !            10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            17:  */
        !            18:
        !            19: #include <sys/param.h>
        !            20: #include <sys/device.h>
        !            21: #include <sys/kernel.h>
        !            22: #include <sys/systm.h>
        !            23: #include <sys/timeout.h>
        !            24:
        !            25: #include <machine/autoconf.h>
        !            26: #include <machine/bus.h>
        !            27: #include <machine/cpu.h>
        !            28: #include <machine/pdc.h>
        !            29:
        !            30: #define LCD_CLS                0x01
        !            31: #define LCD_HOME       0x02
        !            32: #define LCD_LOCATE(X, Y)       (((Y) & 1 ? 0xc0 : 0x80) | ((X) & 0x0f))
        !            33:
        !            34: struct lcd_softc {
        !            35:        struct device           sc_dv;
        !            36:
        !            37:        bus_space_tag_t         sc_iot;
        !            38:        bus_space_handle_t      sc_cmdh, sc_datah;
        !            39:
        !            40:        u_int                   sc_delay;
        !            41:        u_int8_t                sc_heartbeat[3];
        !            42:
        !            43:        struct timeout          sc_to;
        !            44:        int                     sc_on;
        !            45:        struct blink_led        sc_blink;
        !            46: };
        !            47:
        !            48: int    lcd_match(struct device *, void *, void *);
        !            49: void   lcd_attach(struct device *, struct device *, void *);
        !            50:
        !            51: struct cfattach lcd_ca = {
        !            52:        sizeof(struct lcd_softc), lcd_match, lcd_attach
        !            53: };
        !            54:
        !            55: struct cfdriver lcd_cd = {
        !            56:        NULL, "lcd", DV_DULL
        !            57: };
        !            58:
        !            59: void   lcd_write(struct lcd_softc *, const char *);
        !            60: void   lcd_blink(void *, int);
        !            61: void   lcd_blink_finish(void *);
        !            62:
        !            63: int
        !            64: lcd_match(struct device *parent, void *match, void *aux)
        !            65: {
        !            66:        struct confargs *ca = aux;
        !            67:
        !            68:        if (strcmp(ca->ca_name, "lcd") == 0)
        !            69:                return (1);
        !            70:
        !            71:        return (0);
        !            72: }
        !            73:
        !            74: void
        !            75: lcd_attach(struct device *parent, struct device *self, void *aux)
        !            76: {
        !            77:        struct lcd_softc *sc = (struct lcd_softc *)self;
        !            78:        struct confargs *ca = aux;
        !            79:        struct pdc_chassis_lcd *pdc_lcd = (void *)ca->ca_pdc_iodc_read;
        !            80:        int i;
        !            81:
        !            82:        sc->sc_iot = ca->ca_iot;
        !            83:        if (bus_space_map(sc->sc_iot, pdc_lcd->cmd_addr,
        !            84:                1, 0, &sc->sc_cmdh)) {
        !            85:                printf(": cannot map cmd register\n");
        !            86:                return;
        !            87:        }
        !            88:
        !            89:        if (bus_space_map(sc->sc_iot, pdc_lcd->data_addr,
        !            90:                1, 0, &sc->sc_datah)) {
        !            91:                printf(": cannot map data register\n");
        !            92:                bus_space_unmap(sc->sc_iot, sc->sc_cmdh, 1);
        !            93:                return;
        !            94:        }
        !            95:
        !            96:        printf(": model %d\n", pdc_lcd->model);
        !            97:
        !            98:        sc->sc_delay = pdc_lcd->delay;
        !            99:        for (i = 0; i < 3; i++)
        !           100:                sc->sc_heartbeat[i] = pdc_lcd->heartbeat[i];
        !           101:
        !           102:        bus_space_write_1(sc->sc_iot, sc->sc_cmdh, 0, LCD_CLS);
        !           103:        delay(100 * sc->sc_delay);
        !           104:
        !           105:        bus_space_write_1(sc->sc_iot, sc->sc_cmdh, 0, LCD_LOCATE(0, 0));
        !           106:        delay(sc->sc_delay);
        !           107:        lcd_write(sc, "OpenBSD/" MACHINE);
        !           108:
        !           109:        timeout_set(&sc->sc_to, lcd_blink_finish, sc);
        !           110:
        !           111:        sc->sc_blink.bl_func = lcd_blink;
        !           112:        sc->sc_blink.bl_arg = sc;
        !           113:        blink_led_register(&sc->sc_blink);
        !           114: }
        !           115:
        !           116: void
        !           117: lcd_write(struct lcd_softc *sc, const char *str)
        !           118: {
        !           119:        while (*str) {
        !           120:                bus_space_write_1(sc->sc_iot, sc->sc_datah, 0, *str++);
        !           121:                delay(sc->sc_delay);
        !           122:        }
        !           123: }
        !           124:
        !           125: void
        !           126: lcd_blink(void *v, int on)
        !           127: {
        !           128:        struct lcd_softc *sc = v;
        !           129:
        !           130:        sc->sc_on = on;
        !           131:        bus_space_write_1(sc->sc_iot, sc->sc_cmdh, 0, sc->sc_heartbeat[0]);
        !           132:        timeout_add(&sc->sc_to, max(1, (sc->sc_delay * hz) / 1000000));
        !           133: }
        !           134:
        !           135: void
        !           136: lcd_blink_finish(void *v)
        !           137: {
        !           138:        struct lcd_softc *sc = v;
        !           139:        u_int8_t data;
        !           140:
        !           141:        if (sc->sc_on)
        !           142:                data = sc->sc_heartbeat[1];
        !           143:        else
        !           144:                data = sc->sc_heartbeat[2];
        !           145:
        !           146:        bus_space_write_1(sc->sc_iot, sc->sc_datah, 0, data);
        !           147: }

CVSweb