[BACK]Return to bt485.c CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/bt485.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: bt485.c,v 1.12 2002/11/09 22:51:48 miod Exp $ */
                      2: /* $NetBSD: bt485.c,v 1.2 2000/04/02 18:55:01 nathanw Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31:  /* This code was derived from and originally located in sys/dev/pci/
                     32:   *     NetBSD: tga_bt485.c,v 1.4 1999/03/24 05:51:21 mrg Exp
                     33:   */
                     34:
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/device.h>
                     38: #include <sys/buf.h>
                     39: #include <sys/kernel.h>
                     40: #include <sys/malloc.h>
                     41:
                     42: #include <uvm/uvm_extern.h>
                     43:
                     44: #include <dev/pci/pcivar.h>
                     45: #include <dev/ic/bt485reg.h>
                     46: #include <dev/ic/bt485var.h>
                     47: #include <dev/ic/ramdac.h>
                     48:
                     49: #include <dev/wscons/wsconsio.h>
                     50: #include <dev/wscons/wsdisplayvar.h>
                     51: #include <dev/rasops/rasops.h>
                     52:
                     53: /*
                     54:  * Functions exported via the RAMDAC configuration table.
                     55:  */
                     56: void   bt485_init(struct ramdac_cookie *);
                     57: int    bt485_set_cmap(struct ramdac_cookie *,
                     58:            struct wsdisplay_cmap *);
                     59: int    bt485_get_cmap(struct ramdac_cookie *,
                     60:            struct wsdisplay_cmap *);
                     61: int    bt485_set_cursor(struct ramdac_cookie *,
                     62:            struct wsdisplay_cursor *);
                     63: int    bt485_get_cursor(struct ramdac_cookie *,
                     64:            struct wsdisplay_cursor *);
                     65: int    bt485_set_curpos(struct ramdac_cookie *,
                     66:            struct wsdisplay_curpos *);
                     67: int    bt485_get_curpos(struct ramdac_cookie *,
                     68:            struct wsdisplay_curpos *);
                     69: int    bt485_get_curmax(struct ramdac_cookie *,
                     70:            struct wsdisplay_curpos *);
                     71:
                     72: /* XXX const */
                     73: struct ramdac_funcs bt485_funcsstruct = {
                     74:        "Bt485",
                     75:        bt485_register,
                     76:        bt485_init,
                     77:        bt485_set_cmap,
                     78:        bt485_get_cmap,
                     79:        bt485_set_cursor,
                     80:        bt485_get_cursor,
                     81:        bt485_set_curpos,
                     82:        bt485_get_curpos,
                     83:        bt485_get_curmax,
                     84:        NULL,                   /* check_curcmap; not needed */
                     85:        NULL,                   /* set_curcmap; not needed */
                     86:        NULL,                   /* get_curcmap; not needed */
                     87:        NULL,                   /* no dot clock to set */
                     88: };
                     89:
                     90: /*
                     91:  * Private data.
                     92:  */
                     93: struct bt485data {
                     94:        void            *cookie;        /* This is what is passed
                     95:                                         * around, and is probably
                     96:                                         * struct tga_devconfig *
                     97:                                         */
                     98:
                     99:        int             (*ramdac_sched_update)(void *, void (*)(void *));
                    100:        void            (*ramdac_wr)(void *, u_int, u_int8_t);
                    101:        u_int8_t        (*ramdac_rd)(void *, u_int);
                    102:
                    103:        int     changed;                        /* what changed; see below */
                    104:        int     curenb;                         /* cursor enabled */
                    105:        struct wsdisplay_curpos curpos;         /* current cursor position */
                    106:        struct wsdisplay_curpos curhot;         /* cursor hotspot */
                    107:        char curcmap_r[2];                      /* cursor colormap */
                    108:        char curcmap_g[2];
                    109:        char curcmap_b[2];
                    110:        struct wsdisplay_curpos cursize;        /* current cursor size */
                    111:        char curimage[512];                     /* cursor image data */
                    112:        char curmask[512];                      /* cursor mask data */
                    113:        char cmap_r[256];                               /* colormap */
                    114:        char cmap_g[256];
                    115:        char cmap_b[256];
                    116: };
                    117:
                    118: #define        DATA_ENB_CHANGED        0x01    /* cursor enable changed */
                    119: #define        DATA_CURCMAP_CHANGED    0x02    /* cursor colormap changed */
                    120: #define        DATA_CURSHAPE_CHANGED   0x04    /* cursor size, image, mask changed */
                    121: #define        DATA_CMAP_CHANGED       0x08    /* colormap changed */
                    122: #define        DATA_ALL_CHANGED        0x0f
                    123:
                    124: #define        CURSOR_MAX_SIZE         64
                    125:
                    126: /*
                    127:  * Internal functions.
                    128:  */
                    129: inline void    bt485_wr_i(struct bt485data *, u_int8_t, u_int8_t);
                    130: inline u_int8_t bt485_rd_i(struct bt485data *, u_int8_t);
                    131: void   bt485_update(void *);
                    132: void   bt485_update_curpos(struct bt485data *);
                    133:
                    134: /*****************************************************************************/
                    135:
                    136: /*
                    137:  * Functions exported via the RAMDAC configuration table.
                    138:  */
                    139:
                    140: struct ramdac_funcs *
                    141: bt485_funcs(void)
                    142: {
                    143:        return &bt485_funcsstruct;
                    144: }
                    145:
                    146: struct ramdac_cookie *
                    147: bt485_register(v, sched_update, wr, rd)
                    148:        void *v;
                    149:        int (*sched_update)(void *, void (*)(void *));
                    150:        void (*wr)(void *, u_int, u_int8_t);
                    151:        u_int8_t (*rd)(void *, u_int);
                    152: {
                    153:        struct bt485data *data;
                    154:        /*
                    155:         * XXX -- comment out of date.  rcd.
                    156:         * If we should allocate a new private info struct, do so.
                    157:         * Otherwise, use the one we have (if it's there), or
                    158:         * use the temporary one on the stack.
                    159:         */
                    160:        data = malloc(sizeof *data, M_DEVBUF, M_WAITOK);
                    161:        /* XXX -- if !data */
                    162:        data->cookie = v;
                    163:        data->ramdac_sched_update = sched_update;
                    164:        data->ramdac_wr = wr;
                    165:        data->ramdac_rd = rd;
                    166:        return (struct ramdac_cookie *)data;
                    167: }
                    168:
                    169: /*
                    170:  * This function exists solely to provide a means to init
                    171:  * the RAMDAC without first registering.  It is useful for
                    172:  * initializing the console early on.
                    173:  */
                    174: void
                    175: bt485_cninit(v, sched_update, wr, rd)
                    176:        void *v;
                    177:        int (*sched_update)(void *, void (*)(void *));
                    178:        void (*wr)(void *, u_int, u_int8_t);
                    179:        u_int8_t (*rd)(void *, u_int);
                    180: {
                    181:        struct bt485data tmp, *data = &tmp;
                    182:        data->cookie = v;
                    183:        data->ramdac_sched_update = sched_update;
                    184:        data->ramdac_wr = wr;
                    185:        data->ramdac_rd = rd;
                    186:        bt485_init((struct ramdac_cookie *)data);
                    187: }
                    188:
                    189: void
                    190: bt485_init(rc)
                    191:        struct ramdac_cookie *rc;
                    192: {
                    193:        u_int8_t regval;
                    194:        struct bt485data *data = (struct bt485data *)rc;
                    195:        int i;
                    196:
                    197:        /*
                    198:         * Init the BT485 for normal operation.
                    199:         */
                    200:
                    201:        /*
                    202:         * Allow indirect register access.  (Actually, this is
                    203:         * already enabled.  In fact, if it is _disabled_, for
                    204:         * some reason the monitor appears to lose sync!!! (?!?!)
                    205:         */
                    206:        regval = data->ramdac_rd(data->cookie, BT485_REG_COMMAND_0);
                    207:        regval |= 0x80;
                    208:        /*
                    209:         * Set the RAMDAC to 8 bit resolution, rather than 6 bit
                    210:         * resolution.
                    211:         */
                    212:        regval |= 0x02;
                    213:        data->ramdac_wr(data->cookie, BT485_REG_COMMAND_0, regval);
                    214:
                    215:        /* Set the RAMDAC to 8BPP (no interestion options). */
                    216:        data->ramdac_wr(data->cookie, BT485_REG_COMMAND_1, 0x40);
                    217:
                    218:        /* Disable the cursor (for now) */
                    219:        regval = data->ramdac_rd(data->cookie, BT485_REG_COMMAND_2);
                    220:        regval &= ~0x03;
                    221:        regval |= 0x24;
                    222:        data->ramdac_wr(data->cookie, BT485_REG_COMMAND_2, regval);
                    223:
                    224:        /* Use a 64x64x2 cursor */
                    225:        regval = bt485_rd_i(data, BT485_IREG_COMMAND_3);
                    226:        regval |= 0x04;
                    227:        regval |= 0x08;
                    228:        bt485_wr_i(data, BT485_IREG_COMMAND_3, regval);
                    229:
                    230:        /* Set the Pixel Mask to something useful */
                    231:        data->ramdac_wr(data->cookie, BT485_REG_PIXMASK, 0xff);
                    232:
                    233:        /*
                    234:         * Initalize the RAMDAC info struct to hold all of our
                    235:         * data, and fill it in.
                    236:         */
                    237:        data->changed = DATA_ALL_CHANGED;
                    238:
                    239:        data->curenb = 0;                               /* cursor disabled */
                    240:        data->curpos.x = data->curpos.y = 0;            /* right now at 0,0 */
                    241:        data->curhot.x = data->curhot.y = 0;            /* hot spot at 0,0 */
                    242:
                    243:        /* initial cursor colormap: 0 is black, 1 is white */
                    244:        data->curcmap_r[0] = data->curcmap_g[0] = data->curcmap_b[0] = 0;
                    245:        data->curcmap_r[1] = data->curcmap_g[1] = data->curcmap_b[1] = 0xff;
                    246:
                    247:        /* initial cursor data: 64x64 block of white. */
                    248:        data->cursize.x = data->cursize.y = 64;
                    249:        for (i = 0; i < 512; i++)
                    250:                data->curimage[i] = data->curmask[i] = 0xff;
                    251:
                    252:        /* Initial colormap: 0 is black, everything else is white */
                    253:        data->cmap_r[0] = data->cmap_g[0] = data->cmap_b[0] = 0;
                    254:        for (i = 0; i < 256; i++) {
                    255:                data->cmap_r[i] = rasops_cmap[3*i + 0];
                    256:                data->cmap_g[i] = rasops_cmap[3*i + 1];
                    257:                data->cmap_b[i] = rasops_cmap[3*i + 2];
                    258:        }
                    259:
                    260:        bt485_update((void *)data);
                    261: }
                    262:
                    263: int
                    264: bt485_set_cmap(rc, cmapp)
                    265:        struct ramdac_cookie *rc;
                    266:        struct wsdisplay_cmap *cmapp;
                    267: {
                    268:        struct bt485data *data = (struct bt485data *)rc;
                    269:        u_int count, index;
                    270:        int s, error;
                    271:
                    272: #ifdef DIAGNOSTIC
                    273:        if (rc == NULL)
                    274:                panic("bt485_set_cmap: rc");
                    275:        if (cmapp == NULL)
                    276:                panic("bt485_set_cmap: cmapp");
                    277: #endif
                    278:        index = cmapp->index;
                    279:        count = cmapp->count;
                    280:
                    281:        if (index >= 256 || count > 256 - index)
                    282:                return (EINVAL);
                    283:
                    284:        s = spltty();
                    285:
                    286:        if ((error = copyin(cmapp->red, &data->cmap_r[index], count)) != 0) {
                    287:                splx(s);
                    288:                return (error);
                    289:        }
                    290:        if ((error = copyin(cmapp->green, &data->cmap_g[index], count)) != 0) {
                    291:                splx(s);
                    292:                return (error);
                    293:        }
                    294:        if ((error = copyin(cmapp->blue, &data->cmap_b[index], count)) != 0) {
                    295:                splx(s);
                    296:                return (error);
                    297:        }
                    298:
                    299:        data->changed |= DATA_CMAP_CHANGED;
                    300:
                    301:        data->ramdac_sched_update(data->cookie, bt485_update);
                    302: #ifdef __alpha__
                    303:        alpha_mb();
                    304: #endif
                    305:        splx(s);
                    306:
                    307:        return (0);
                    308: }
                    309:
                    310: int
                    311: bt485_get_cmap(rc, cmapp)
                    312:        struct ramdac_cookie *rc;
                    313:        struct wsdisplay_cmap *cmapp;
                    314: {
                    315:        struct bt485data *data = (struct bt485data *)rc;
                    316:        u_int count, index;
                    317:        int error;
                    318:
                    319:        if (cmapp->index >= 256 || cmapp->count > 256 - cmapp->index)
                    320:                return (EINVAL);
                    321:
                    322:        count = cmapp->count;
                    323:        index = cmapp->index;
                    324:
                    325:        error = copyout(&data->cmap_r[index], cmapp->red, count);
                    326:        if (error)
                    327:                return (error);
                    328:        error = copyout(&data->cmap_g[index], cmapp->green, count);
                    329:        if (error)
                    330:                return (error);
                    331:        error = copyout(&data->cmap_b[index], cmapp->blue, count);
                    332:        return (error);
                    333: }
                    334:
                    335: int
                    336: bt485_set_cursor(rc, cursorp)
                    337:        struct ramdac_cookie *rc;
                    338:        struct wsdisplay_cursor *cursorp;
                    339: {
                    340:        struct bt485data *data = (struct bt485data *)rc;
                    341:        u_int count, index;
                    342:        int error;
                    343:        int v, s;
                    344:
                    345:        v = cursorp->which;
                    346:
                    347:        /*
                    348:         * For DOCMAP and DOSHAPE, verify that parameters are OK
                    349:         * before we do anything that we can't recover from.
                    350:         */
                    351:        if (v & WSDISPLAY_CURSOR_DOCMAP) {
                    352:                index = cursorp->cmap.index;
                    353:                count = cursorp->cmap.count;
                    354:                if (index >= 2 || count > 2 - index)
                    355:                        return (EINVAL);
                    356:        }
                    357:        if (v & WSDISPLAY_CURSOR_DOSHAPE) {
                    358:                if ((u_int)cursorp->size.x > CURSOR_MAX_SIZE ||
                    359:                    (u_int)cursorp->size.y > CURSOR_MAX_SIZE)
                    360:                        return (EINVAL);
                    361:        }
                    362:
                    363:        if (v & (WSDISPLAY_CURSOR_DOPOS | WSDISPLAY_CURSOR_DOCUR)) {
                    364:                if (v & WSDISPLAY_CURSOR_DOPOS)
                    365:                        data->curpos = cursorp->pos;
                    366:                if (v & WSDISPLAY_CURSOR_DOCUR)
                    367:                        data->curhot = cursorp->hot;
                    368:                bt485_update_curpos(data);
                    369:        }
                    370:
                    371:        s = spltty();
                    372:
                    373:        /* Parameters are OK; perform the requested operations. */
                    374:        if (v & WSDISPLAY_CURSOR_DOCUR) {
                    375:                data->curenb = cursorp->enable;
                    376:                data->changed |= DATA_ENB_CHANGED;
                    377:        }
                    378:        if (v & WSDISPLAY_CURSOR_DOCMAP) {
                    379:                index = cursorp->cmap.index;
                    380:                count = cursorp->cmap.count;
                    381:                if ((error = copyin(cursorp->cmap.red,
                    382:                    &data->curcmap_r[index], count)) != 0) {
                    383:                        splx(s);
                    384:                        return (error);
                    385:                }
                    386:                if ((error = copyin(cursorp->cmap.green,
                    387:                    &data->curcmap_g[index], count)) != 0) {
                    388:                        splx(s);
                    389:                        return (error);
                    390:                }
                    391:                if ((error = copyin(cursorp->cmap.blue,
                    392:                    &data->curcmap_b[index], count)) != 0) {
                    393:                        splx(s);
                    394:                        return (error);
                    395:                }
                    396:                data->changed |= DATA_CURCMAP_CHANGED;
                    397:        }
                    398:        if (v & WSDISPLAY_CURSOR_DOSHAPE) {
                    399:                data->cursize = cursorp->size;
                    400:                count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y;
                    401:                bzero(data->curimage, sizeof data->curimage);
                    402:                bzero(data->curmask, sizeof data->curmask);
                    403:                if ((error = copyin(cursorp->image, data->curimage,
                    404:                    count)) != 0) {
                    405:                        splx(s);
                    406:                        return (error);
                    407:                }
                    408:                if ((error = copyin(cursorp->mask, data->curmask,
                    409:                    count)) != 0) {
                    410:                        splx(s);
                    411:                        return (error);
                    412:                }
                    413:                data->changed |= DATA_CURSHAPE_CHANGED;
                    414:        }
                    415:
                    416:        if (data->changed)
                    417:                data->ramdac_sched_update(data->cookie, bt485_update);
                    418:        splx(s);
                    419:
                    420:        return (0);
                    421: }
                    422:
                    423: int
                    424: bt485_get_cursor(rc, cursorp)
                    425:        struct ramdac_cookie *rc;
                    426:        struct wsdisplay_cursor *cursorp;
                    427: {
                    428:        struct bt485data *data = (struct bt485data *)rc;
                    429:        int error, count;
                    430:
                    431:        /* we return everything they want */
                    432:        cursorp->which = WSDISPLAY_CURSOR_DOALL;
                    433:
                    434:        cursorp->enable = data->curenb; /* DOCUR */
                    435:        cursorp->pos = data->curpos;    /* DOPOS */
                    436:        cursorp->hot = data->curhot;    /* DOHOT */
                    437:
                    438:        cursorp->cmap.index = 0;        /* DOCMAP */
                    439:        cursorp->cmap.count = 2;
                    440:        if (cursorp->cmap.red != NULL) {
                    441:                error = copyout(data->curcmap_r, cursorp->cmap.red, 2);
                    442:                if (error)
                    443:                        return (error);
                    444:        }
                    445:        if (cursorp->cmap.green != NULL) {
                    446:                error = copyout(data->curcmap_g, cursorp->cmap.green, 2);
                    447:                if (error)
                    448:                        return (error);
                    449:        }
                    450:        if (cursorp->cmap.blue != NULL) {
                    451:                error = copyout(data->curcmap_b, cursorp->cmap.blue, 2);
                    452:                if (error)
                    453:                        return (error);
                    454:        }
                    455:
                    456:        cursorp->size = data->cursize;  /* DOSHAPE */
                    457:        if (cursorp->image != NULL) {
                    458:                count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y;
                    459:                error = copyout(data->curimage, cursorp->image, count);
                    460:                if (error)
                    461:                        return (error);
                    462:                error = copyout(data->curmask, cursorp->mask, count);
                    463:                if (error)
                    464:                        return (error);
                    465:        }
                    466:
                    467:        return (0);
                    468: }
                    469:
                    470: int
                    471: bt485_set_curpos(rc, curposp)
                    472:        struct ramdac_cookie *rc;
                    473:        struct wsdisplay_curpos *curposp;
                    474: {
                    475:        struct bt485data *data = (struct bt485data *)rc;
                    476:
                    477:        data->curpos = *curposp;
                    478:        bt485_update_curpos(data);
                    479:
                    480:        return (0);
                    481: }
                    482:
                    483: int
                    484: bt485_get_curpos(rc, curposp)
                    485:        struct ramdac_cookie *rc;
                    486:        struct wsdisplay_curpos *curposp;
                    487: {
                    488:        struct bt485data *data = (struct bt485data *)rc;
                    489:
                    490:        *curposp = data->curpos;
                    491:        return (0);
                    492: }
                    493:
                    494: int
                    495: bt485_get_curmax(rc, curposp)
                    496:        struct ramdac_cookie *rc;
                    497:        struct wsdisplay_curpos *curposp;
                    498: {
                    499:
                    500:        curposp->x = curposp->y = CURSOR_MAX_SIZE;
                    501:        return (0);
                    502: }
                    503:
                    504: /*****************************************************************************/
                    505:
                    506: /*
                    507:  * Internal functions.
                    508:  */
                    509:
                    510: inline void
                    511: bt485_wr_i(data, ireg, val)
                    512:        struct bt485data *data;
                    513:        u_int8_t ireg;
                    514:        u_int8_t val;
                    515: {
                    516:        data->ramdac_wr(data->cookie, BT485_REG_PCRAM_WRADDR, ireg);
                    517:        data->ramdac_wr(data->cookie, BT485_REG_EXTENDED, val);
                    518: }
                    519:
                    520: inline u_int8_t
                    521: bt485_rd_i(data, ireg)
                    522:        struct bt485data *data;
                    523:        u_int8_t ireg;
                    524: {
                    525:        data->ramdac_wr(data->cookie, BT485_REG_PCRAM_WRADDR, ireg);
                    526:        return (data->ramdac_rd(data->cookie, BT485_REG_EXTENDED));
                    527: }
                    528:
                    529: void
                    530: bt485_update(vp)
                    531:        void *vp;
                    532: {
                    533:        struct bt485data *data = vp;
                    534:        u_int8_t regval;
                    535:        int count, i, v;
                    536:
                    537:        v = data->changed;
                    538:        data->changed = 0;
                    539:
                    540:        if (v & DATA_ENB_CHANGED) {
                    541:                regval = data->ramdac_rd(data->cookie, BT485_REG_COMMAND_2);
                    542:                if (data->curenb)
                    543:                        regval |= 0x01;
                    544:                else
                    545:                        regval &= ~0x03;
                    546:                 data->ramdac_wr(data->cookie, BT485_REG_COMMAND_2, regval);
                    547:        }
                    548:
                    549:        if (v & DATA_CURCMAP_CHANGED) {
                    550:                /* addr[9:0] assumed to be 0 */
                    551:                /* set addr[7:0] to 1 */
                    552:                 data->ramdac_wr(data->cookie, BT485_REG_COC_WRADDR, 0x01);
                    553:
                    554:                /* spit out the cursor data */
                    555:                for (i = 0; i < 2; i++) {
                    556:                        data->ramdac_wr(data->cookie, BT485_REG_COCDATA,
                    557:                            data->curcmap_r[i]);
                    558:                        data->ramdac_wr(data->cookie, BT485_REG_COCDATA,
                    559:                            data->curcmap_g[i]);
                    560:                        data->ramdac_wr(data->cookie, BT485_REG_COCDATA,
                    561:                            data->curcmap_b[i]);
                    562:                }
                    563:        }
                    564:
                    565:        if (v & DATA_CURSHAPE_CHANGED) {
                    566:                count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y;
                    567:
                    568:                /*
                    569:                 * Write the cursor image data:
                    570:                 *      set addr[9:8] to 0,
                    571:                 *      set addr[7:0] to 0,
                    572:                 *      spit it all out.
                    573:                 */
                    574:                regval = bt485_rd_i(data, BT485_IREG_COMMAND_3);
                    575:                regval &= ~0x03;
                    576:                bt485_wr_i(data, BT485_IREG_COMMAND_3, regval);
                    577:                 data->ramdac_wr(data->cookie, BT485_REG_PCRAM_WRADDR, 0);
                    578:                for (i = 0; i < count; i++)
                    579:                        data->ramdac_wr(data->cookie, BT485_REG_CURSOR_RAM,
                    580:                            data->curimage[i]);
                    581:
                    582:                /*
                    583:                 * Write the cursor mask data:
                    584:                 *      set addr[9:8] to 2,
                    585:                 *      set addr[7:0] to 0,
                    586:                 *      spit it all out.
                    587:                 */
                    588:                regval = bt485_rd_i(data, BT485_IREG_COMMAND_3);
                    589:                regval &= ~0x03; regval |= 0x02;
                    590:                bt485_wr_i(data, BT485_IREG_COMMAND_3, regval);
                    591:                 data->ramdac_wr(data->cookie, BT485_REG_PCRAM_WRADDR, 0);
                    592:                for (i = 0; i < count; i++)
                    593:                        data->ramdac_wr(data->cookie, BT485_REG_CURSOR_RAM,
                    594:                            data->curmask[i]);
                    595:
                    596:                /* set addr[9:0] back to 0 */
                    597:                regval = bt485_rd_i(data, BT485_IREG_COMMAND_3);
                    598:                regval &= ~0x03;
                    599:                bt485_wr_i(data, BT485_IREG_COMMAND_3, regval);
                    600:        }
                    601:
                    602:        if (v & DATA_CMAP_CHANGED) {
                    603:                /* addr[9:0] assumed to be 0 */
                    604:                /* set addr[7:0] to 0 */
                    605:                 data->ramdac_wr(data->cookie, BT485_REG_PCRAM_WRADDR, 0x00);
                    606:
                    607:                /* spit out the cursor data */
                    608:                for (i = 0; i < 256; i++) {
                    609:                        data->ramdac_wr(data->cookie, BT485_REG_PALETTE,
                    610:                            data->cmap_r[i]);
                    611:                        data->ramdac_wr(data->cookie, BT485_REG_PALETTE,
                    612:                            data->cmap_g[i]);
                    613:                        data->ramdac_wr(data->cookie, BT485_REG_PALETTE,
                    614:                            data->cmap_b[i]);
                    615:                }
                    616:        }
                    617: }
                    618:
                    619: void
                    620: bt485_update_curpos(data)
                    621:        struct bt485data *data;
                    622: {
                    623:        void *cookie = data->cookie;
                    624:        int s, x, y;
                    625:
                    626:        s = spltty();
                    627:
                    628:        x = data->curpos.x + CURSOR_MAX_SIZE - data->curhot.x;
                    629:        y = data->curpos.y + CURSOR_MAX_SIZE - data->curhot.y;
                    630:        data->ramdac_wr(cookie, BT485_REG_CURSOR_X_LOW, x & 0xff);
                    631:        data->ramdac_wr(cookie, BT485_REG_CURSOR_X_HIGH, (x >> 8) & 0x0f);
                    632:        data->ramdac_wr(cookie, BT485_REG_CURSOR_Y_LOW, y & 0xff);
                    633:        data->ramdac_wr(cookie, BT485_REG_CURSOR_Y_HIGH, (y >> 8) & 0x0f);
                    634:
                    635:        splx(s);
                    636: }

CVSweb