Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/tc - Hide memory mapped VDAC hardware register layou...



details:   https://anonhg.NetBSD.org/src/rev/9b7f43690329
branches:  trunk
changeset: 473977:9b7f43690329
user:      nisimura <nisimura%NetBSD.org@localhost>
date:      Thu Jun 24 03:51:14 1999 +0000

description:
- Hide memory mapped VDAC hardware register layouts using the array
element access instead of C bitfield (hello, BCPL).
- XXX Some TURBOchannel framebuffers might need shutdownhooks().  It
seems not necessarily hardware sprite cursor images are re-initialized
by DECstation PROMs upon exits from kernel.
- XXX It'd be an arguable point to allow user programs to change the
shade of gray freely for pixel value 0 and 1.

diffstat:

 sys/dev/tc/mfb.c |  158 +++++++++++++++++++++++++-----------------------------
 1 files changed, 72 insertions(+), 86 deletions(-)

diffs (259 lines):

diff -r c41e42134b18 -r 9b7f43690329 sys/dev/tc/mfb.c
--- a/sys/dev/tc/mfb.c  Thu Jun 24 01:35:33 1999 +0000
+++ b/sys/dev/tc/mfb.c  Thu Jun 24 03:51:14 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfb.c,v 1.13 1999/06/23 23:48:28 nisimura Exp $ */
+/* $NetBSD: mfb.c,v 1.14 1999/06/24 03:51:14 nisimura Exp $ */
 
 /*
  * Copyright (c) 1999 Tohru Nishimura.  All rights reserved.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: mfb.c,v 1.13 1999/06/23 23:48:28 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfb.c,v 1.14 1999/06/24 03:51:14 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -59,52 +59,34 @@
 #define        machine_btop(x) mips_btop(x)
 #define        MACHINE_KSEG0_TO_PHYS(x) MIPS_KSEG0_TO_PHYS(x)
 
-struct bt455reg {
-       u_int8_t        bt_reg;
-       unsigned : 24;
-       u_int8_t        bt_cmap;
-       unsigned : 24;
-       u_int8_t        bt_clr;
-       unsigned : 24;
-       u_int8_t        bt_ovly;
-};
-
-/*
- * N.B. a pair of Bt431s are located adjascently.
- *     struct bt431twin {
- *             struct {
- *                     u_int8_t u0;    for sprite image
- *                     u_int8_t u1;    for sprite mask
- *                     unsigned :16;
- *             } bt_lo;
- *             ...
- */
-struct bt431reg {
-       u_int16_t       bt_lo;
-       unsigned : 16;
-       u_int16_t       bt_hi;
-       unsigned : 16;
-       u_int16_t       bt_ram;
-       unsigned : 16;
-       u_int16_t       bt_ctl;
-};
-
 #define        BYTE(base, index)       *((u_int8_t *)(base) + ((index)<<2))
 #define        HALF(base, index)       *((u_int16_t *)(base) + ((index)<<1))
 
+/* Bt431 hardware registers */
+#define        bt_reg  0
+#define        bt_cmap 1
+#define        bt_clr  2
+#define        bt_ovly 3
+
+/* Bt455 hardware registers */
+#define        bt_lo   0
+#define        bt_hi   1
+#define        bt_ram  2
+#define        bt_ctl  3
+
 #define BT455_SELECT(vdac, regno) do { \
-       (vdac)->bt_reg = regno;         \
-       (vdac)->bt_clr = 0;             \
+       BYTE(vdac, bt_reg) = (regno);   \
+       BYTE(vdac, bt_clr) = 0;         \
        tc_wmb();                       \
    } while (0)
 
-#define        TWIN(x)    ((x)|(x) << 8)
+#define        TWIN(x)    ((x)|((x) << 8))
 #define        TWIN_LO(x) (twin = (x) & 0x00ff, twin << 8 | twin)
 #define        TWIN_HI(x) (twin = (x) & 0xff00, twin | twin >> 8)
 
 #define        BT431_SELECT(curs, regno) do {  \
-       (curs)->bt_lo = TWIN(regno);    \
-       (curs)->bt_hi = 0;              \
+       HALF(curs, bt_lo) = TWIN(regno);\
+       HALF(curs, bt_hi) = 0;          \
        tc_wmb();                       \
    } while (0);
 
@@ -504,8 +486,8 @@
 {
        struct mfb_softc *sc = arg;
        caddr_t mfbbase = (caddr_t)sc->sc_dc->dc_vaddr;
-       struct bt455reg *vdac;
-       struct bt431reg *curs;
+       void *vdac;
+       void *curs;
        int v;
        volatile register int junk;
        
@@ -522,23 +504,23 @@
        sc->sc_changed = 0;     
        if (v & DATA_ENB_CHANGED) {
                BT431_SELECT(curs, BT431_REG_COMMAND);
-               curs->bt_ctl = (sc->sc_curenb) ? 0x4444 : 0x0404;
+               HALF(curs, bt_ctl) = (sc->sc_curenb) ? 0x4444 : 0x0404;
        }
        if (v & DATA_CURCMAP_CHANGED) {
                u_int8_t *cp = sc->sc_cursor.cc_color;
 
                BT455_SELECT(vdac, 8);
-               vdac->bt_cmap = 0;      tc_wmb();
-               vdac->bt_cmap = cp[1];  tc_wmb();
-               vdac->bt_cmap = 0;      tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
+               BYTE(vdac, bt_cmap) = cp[1];    tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
 
-               vdac->bt_cmap = 0;      tc_wmb();
-               vdac->bt_cmap = cp[1];  tc_wmb();
-               vdac->bt_cmap = 0;      tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
+               BYTE(vdac, bt_cmap) = cp[1];    tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
 
-               vdac->bt_ovly = 0;      tc_wmb();
-               vdac->bt_ovly = cp[0];  tc_wmb();
-               vdac->bt_ovly = 0;      tc_wmb();
+               BYTE(vdac, bt_ovly) = 0;        tc_wmb();
+               BYTE(vdac, bt_ovly) = cp[0];    tc_wmb();
+               BYTE(vdac, bt_ovly) = 0;        tc_wmb();
        }
        if (v & DATA_CURSHAPE_CHANGED) {
                u_int8_t *ip, *mp, img, msk;
@@ -553,21 +535,22 @@
                while (bcnt < sc->sc_cursor.cc_size.y * 16) {
                        /* pad right half 32 pixel when smaller than 33 */
                        if ((bcnt & 0x8) && sc->sc_cursor.cc_size.x < 33) {
-                               curs->bt_ram = 0;
+                               HALF(curs, bt_ram) = 0;
                                tc_wmb();
                        }
                        else {
                                img = *ip++;
                                msk = *mp++;
                                img &= msk;     /* cookie off image */
-                               curs->bt_ram = (flip[msk] << 8) | flip[img];
+                               HALF(curs, bt_ram)
+                                   = (flip[msk] << 8) | flip[img];
                                tc_wmb();
                        }
                        bcnt += 2;
                }
                /* pad unoccupied scan lines */
                while (bcnt < CURSOR_MAX_SIZE * 16) {
-                       curs->bt_ram = 0;
+                       HALF(curs, bt_ram) = 0;
                        tc_wmb();
                        bcnt += 2;
                }
@@ -580,43 +563,46 @@
        struct fb_devconfig *dc;
 {
        caddr_t mfbbase = (caddr_t)dc->dc_vaddr;
-       struct bt431reg *curs = (void *)(mfbbase + MX_BT431_OFFSET);
-       struct bt455reg *vdac = (void *)(mfbbase + MX_BT455_OFFSET);
+       void *curs = (void *)(mfbbase + MX_BT431_OFFSET);
+       void *vdac = (void *)(mfbbase + MX_BT455_OFFSET);
        int i;
 
        BT431_SELECT(curs, BT431_REG_COMMAND);
-       curs->bt_ctl = 0x0404;  tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
-       curs->bt_ctl = 0;       tc_wmb();
+       HALF(curs, bt_ctl) = 0x0404;            tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* XLO */       tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* XHI */       tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* YLO */       tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* YHI */       tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* XWLO */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* XWHI */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WYLO */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WYLO */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WWLO */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WWHI */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WHLO */      tc_wmb();
+       HALF(curs, bt_ctl) = 0; /* WHHI */      tc_wmb();
 
+       /* 0: black, 1: white, 8,9: cursor mask, ovly: cursor image */
        BT455_SELECT(vdac, 0);
-       vdac->bt_cmap = 0;      tc_wmb();
-       vdac->bt_cmap = 0;      tc_wmb();
-       vdac->bt_cmap = 0;      tc_wmb();
-
-       vdac->bt_cmap = 0;      tc_wmb();
-       vdac->bt_cmap = 0xff;   tc_wmb();
-       vdac->bt_cmap = 0;      tc_wmb();
-
+       BYTE(vdac, bt_cmap) = 0;                tc_wmb();
+       BYTE(vdac, bt_cmap) = 0;                tc_wmb();
+       BYTE(vdac, bt_cmap) = 0;                tc_wmb();
+       BYTE(vdac, bt_cmap) = 0;                tc_wmb();
+       BYTE(vdac, bt_cmap) = 0xff;             tc_wmb();
+       BYTE(vdac, bt_cmap) = 0;                tc_wmb();
        for (i = 2; i < 16; i++) {
-               vdac->bt_cmap = 0;      tc_wmb();
-               vdac->bt_cmap = 0;      tc_wmb();
-               vdac->bt_cmap = 0;      tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
+               BYTE(vdac, bt_cmap) = 0;        tc_wmb();
        }
+       BYTE(vdac, bt_ovly) = 0;        tc_wmb();
+       BYTE(vdac, bt_ovly) = 0xff;     tc_wmb();
+       BYTE(vdac, bt_ovly) = 0;        tc_wmb();
 
-       vdac->bt_ovly = 0;      tc_wmb();
-       vdac->bt_ovly = 0xff;   tc_wmb();
-       vdac->bt_ovly = 0;      tc_wmb();
+       BT431_SELECT(curs, BT431_REG_CRAM_BASE);
+       for (i = 0; i < 512; i++) {
+               HALF(curs, bt_ram) = 0; tc_wmb();
+       }
 }
 
 static int
@@ -706,7 +692,7 @@
        struct mfb_softc *sc;
 {
        caddr_t mfbbase = (caddr_t)sc->sc_dc->dc_vaddr;
-       struct bt431reg *curs = (void *)(mfbbase + MX_BT431_OFFSET);
+       void *curs = (void *)(mfbbase + MX_BT431_OFFSET);
        u_int16_t twin;
        int x, y, s;
 
@@ -719,10 +705,10 @@
        s = spltty();
 
        BT431_SELECT(curs, BT431_REG_CURSOR_X_LOW);
-       curs->bt_ctl = TWIN_LO(x);      tc_wmb();
-       curs->bt_ctl = TWIN_HI(x);      tc_wmb();
-       curs->bt_ctl = TWIN_LO(y);      tc_wmb();
-       curs->bt_ctl = TWIN_HI(y);      tc_wmb();
+       HALF(curs, bt_ctl) = TWIN_LO(x);        tc_wmb();
+       HALF(curs, bt_ctl) = TWIN_HI(x);        tc_wmb();
+       HALF(curs, bt_ctl) = TWIN_LO(y);        tc_wmb();
+       HALF(curs, bt_ctl) = TWIN_HI(y);        tc_wmb();
 
        splx(s);
 }



Home | Main Index | Thread Index | Old Index