Annotation of Gnu-Mach/chips/ims332.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     File: ims332.c
                     28:  *     Author: Alessandro Forin, Carnegie Mellon University
                     29:  *     Date:   1/92
                     30:  *
                     31:  *     Routines for the Inmos IMS-G332 Colour video controller
                     32:  */
                     33: 
                     34: #include <platforms.h>
                     35: 
                     36: #include <chips/ims332.h>
                     37: #include <chips/screen.h>
                     38: 
                     39: #include <chips/xcfb_monitor.h>
                     40: 
                     41: /*
                     42:  * Generic register access
                     43:  */
                     44: typedef volatile unsigned char *ims332_padded_regmap_t;
                     45: 
                     46: #ifdef MAXINE
                     47: 
                     48: unsigned int
                     49: ims332_read_register(regs, regno)
                     50:        unsigned char   *regs;
                     51: {
                     52:        unsigned char           *rptr;
                     53:        register unsigned int   val, v1;
                     54: 
                     55:        /* spec sez: */
                     56:        rptr = regs + 0x80000 + (regno << 4);
                     57:        val = * ((volatile unsigned short *) rptr );
                     58:        v1  = * ((volatile unsigned short *) regs );
                     59: 
                     60:        return (val & 0xffff) | ((v1 & 0xff00) << 8);
                     61: }
                     62: 
                     63: ims332_write_register(regs, regno, val)
                     64:        unsigned char           *regs;
                     65:        register unsigned int   val;
                     66: {
                     67:        unsigned char           *wptr;
                     68: 
                     69:        /* spec sez: */
                     70:        wptr = regs + 0xa0000 + (regno << 4);
                     71:        * ((volatile unsigned int *)(regs))   = (val >> 8) & 0xff00;
                     72:        * ((volatile unsigned short *)(wptr)) = val;
                     73: }
                     74: 
                     75: #define        assert_ims332_reset_bit(r)      *r &= ~0x40
                     76: #define        deassert_ims332_reset_bit(r)    *r |=  0x40
                     77: 
                     78: #else  /*MAXINE*/
                     79: 
                     80: #define        ims332_read_register(p,r)                       \
                     81:                ((unsigned int *)(p)) [ (r) ]
                     82: #define        ims332_write_register(p,r,v)                    \
                     83:                ((unsigned int *)(p)) [ (r) ] = (v)
                     84: 
                     85: #endif /*MAXINE*/
                     86: 
                     87: 
                     88: /*
                     89:  * Color map
                     90:  */
                     91: ims332_load_colormap( regs, map)
                     92:        ims332_padded_regmap_t  *regs;
                     93:        color_map_t     *map;
                     94: {
                     95:        register int    i;
                     96: 
                     97:        for (i = 0; i < 256; i++, map++)
                     98:                ims332_load_colormap_entry(regs, i, map);
                     99: }
                    100: 
                    101: ims332_load_colormap_entry( regs, entry, map)
                    102:        ims332_padded_regmap_t  *regs;
                    103:        color_map_t     *map;
                    104: {
                    105:        /* ?? stop VTG */
                    106:        ims332_write_register(regs, IMS332_REG_LUT_BASE + (entry & 0xff),
                    107:                              (map->blue << 16) |
                    108:                              (map->green << 8) |
                    109:                              (map->red));
                    110: }
                    111: 
                    112: ims332_init_colormap( regs)
                    113:        ims332_padded_regmap_t  *regs;
                    114: {
                    115:        color_map_t             m;
                    116: 
                    117:        m.red = m.green = m.blue = 0;
                    118:        ims332_load_colormap_entry( regs, 0, &m);
                    119: 
                    120:        m.red = m.green = m.blue = 0xff;
                    121:        ims332_load_colormap_entry( regs, 1, &m);
                    122:        ims332_load_colormap_entry( regs, 255, &m);
                    123: 
                    124:        /* since we are at it, also fix cursor LUT */
                    125:        ims332_load_colormap_entry( regs, IMS332_REG_CURSOR_LUT_0, &m);
                    126:        ims332_load_colormap_entry( regs, IMS332_REG_CURSOR_LUT_1, &m);
                    127:        /* *we* do not use this, but the prom does */
                    128:        ims332_load_colormap_entry( regs, IMS332_REG_CURSOR_LUT_2, &m);
                    129: }
                    130: 
                    131: #if    1/*debug*/
                    132: ims332_print_colormap( regs)
                    133:        ims332_padded_regmap_t  *regs;
                    134: {
                    135:        register int    i;
                    136: 
                    137:        for (i = 0; i < 256; i++) {
                    138:                register unsigned int   color;
                    139: 
                    140:                color = ims332_read_register( regs, IMS332_REG_LUT_BASE + i);
                    141:                printf("%x->[x%x x%x x%x]\n", i,
                    142:                        (color >> 16) & 0xff,
                    143:                        (color >> 8) & 0xff,
                    144:                        color & 0xff);
                    145:        }
                    146: }
                    147: #endif
                    148: 
                    149: /*
                    150:  * Video on/off
                    151:  *
                    152:  * It is unfortunate that X11 goes backward with white@0
                    153:  * and black@1.  So we must stash away the zero-th entry
                    154:  * and fix it while screen is off.  Also must remember
                    155:  * it, sigh.
                    156:  */
                    157: struct vstate {
                    158:        ims332_padded_regmap_t  *regs;
                    159:        unsigned short  off;
                    160: };
                    161: 
                    162: ims332_video_off(vstate, up)
                    163:        struct vstate   *vstate;
                    164:        user_info_t     *up;
                    165: {
                    166:        register ims332_padded_regmap_t *regs = vstate->regs;
                    167:        register unsigned               *save, csr;
                    168: 
                    169:        if (vstate->off)
                    170:                return;
                    171: 
                    172:        /* Yes, this is awful */
                    173:        save = (unsigned *)up->dev_dep_2.gx.colormap;
                    174: 
                    175:        *save = ims332_read_register(regs, IMS332_REG_LUT_BASE);
                    176: 
                    177:        ims332_write_register(regs, IMS332_REG_LUT_BASE, 0);
                    178: 
                    179:        ims332_write_register( regs, IMS332_REG_COLOR_MASK, 0);
                    180: 
                    181:        /* cursor now */
                    182:        csr = ims332_read_register(regs, IMS332_REG_CSR_A);
                    183:        csr |= IMS332_CSR_A_DISABLE_CURSOR;
                    184:        ims332_write_register(regs, IMS332_REG_CSR_A, csr);
                    185: 
                    186:        vstate->off = 1;
                    187: }
                    188: 
                    189: ims332_video_on(vstate, up)
                    190:        struct vstate   *vstate;
                    191:        user_info_t     *up;
                    192: {
                    193:        register ims332_padded_regmap_t *regs = vstate->regs;
                    194:        register unsigned               *save, csr;
                    195: 
                    196:        if (!vstate->off)
                    197:                return;
                    198: 
                    199:        /* Like I said.. */
                    200:        save = (unsigned *)up->dev_dep_2.gx.colormap;
                    201: 
                    202:        ims332_write_register(regs, IMS332_REG_LUT_BASE, *save);
                    203: 
                    204:        ims332_write_register( regs, IMS332_REG_COLOR_MASK, 0xffffffff);
                    205: 
                    206:        /* cursor now */
                    207:        csr = ims332_read_register(regs, IMS332_REG_CSR_A);
                    208:        csr &= ~IMS332_CSR_A_DISABLE_CURSOR;
                    209:        ims332_write_register(regs, IMS332_REG_CSR_A, csr);
                    210: 
                    211:        vstate->off = 0;
                    212: }
                    213: 
                    214: /*
                    215:  * Cursor
                    216:  */
                    217: ims332_pos_cursor(regs,x,y)
                    218:        ims332_padded_regmap_t  *regs;
                    219:        register int    x,y;
                    220: {
                    221:        ims332_write_register( regs, IMS332_REG_CURSOR_LOC,
                    222:                ((x & 0xfff) << 12) | (y & 0xfff) );
                    223: }
                    224: 
                    225: 
                    226: ims332_cursor_color( regs, color)
                    227:        ims332_padded_regmap_t  *regs;
                    228:        color_map_t     *color;
                    229: {
                    230:        /* Bg is color[0], Fg is color[1] */
                    231:        ims332_write_register(regs, IMS332_REG_CURSOR_LUT_0,
                    232:                              (color->blue << 16) |
                    233:                              (color->green << 8) |
                    234:                              (color->red));
                    235:        color++;
                    236:        ims332_write_register(regs, IMS332_REG_CURSOR_LUT_1,
                    237:                              (color->blue << 16) |
                    238:                              (color->green << 8) |
                    239:                              (color->red));
                    240: }
                    241: 
                    242: ims332_cursor_sprite( regs, cursor)
                    243:        ims332_padded_regmap_t  *regs;
                    244:        unsigned short          *cursor;
                    245: {
                    246:        register int i;
                    247: 
                    248:        /* We *could* cut this down a lot... */
                    249:        for (i = 0; i < 512; i++, cursor++)
                    250:                ims332_write_register( regs,
                    251:                        IMS332_REG_CURSOR_RAM+i, *cursor);
                    252: }
                    253: 
                    254: /*
                    255:  * Initialization
                    256:  */
                    257: ims332_init(regs, reset, mon)
                    258:        ims332_padded_regmap_t  *regs;
                    259:        unsigned int            *reset;
                    260:        xcfb_monitor_type_t     mon;
                    261: {
                    262:        int shortdisplay, broadpulse, frontporch;
                    263: 
                    264:        assert_ims332_reset_bit(reset);
                    265:        delay(1);       /* specs sez 50ns.. */
                    266:        deassert_ims332_reset_bit(reset);
                    267: 
                    268:        /* CLOCKIN appears to receive a 6.25 Mhz clock --> PLL 12 for 75Mhz monitor */
                    269:        ims332_write_register(regs, IMS332_REG_BOOT, 12 | IMS332_BOOT_CLOCK_PLL);
                    270: 
                    271:        /* initialize VTG */
                    272:        ims332_write_register(regs, IMS332_REG_CSR_A,
                    273:                                IMS332_BPP_8 | IMS332_CSR_A_DISABLE_CURSOR);
                    274:        delay(50);      /* spec does not say */
                    275: 
                    276:        /* datapath registers (values taken from prom's settings) */
                    277: 
                    278:        frontporch = mon->line_time - (mon->half_sync * 2 +
                    279:                                       mon->back_porch +
                    280:                                       mon->frame_visible_width / 4);
                    281: 
                    282:        shortdisplay = mon->line_time / 2 - (mon->half_sync * 2 +
                    283:                                             mon->back_porch + frontporch);
                    284:        broadpulse = mon->line_time / 2 - frontporch;
                    285: 
                    286:        ims332_write_register( regs, IMS332_REG_HALF_SYNCH,     mon->half_sync);
                    287:        ims332_write_register( regs, IMS332_REG_BACK_PORCH,     mon->back_porch);
                    288:        ims332_write_register( regs, IMS332_REG_DISPLAY,
                    289:                              mon->frame_visible_width / 4);
                    290:        ims332_write_register( regs, IMS332_REG_SHORT_DIS,      shortdisplay);
                    291:        ims332_write_register( regs, IMS332_REG_BROAD_PULSE,    broadpulse);
                    292:        ims332_write_register( regs, IMS332_REG_V_SYNC,         mon->v_sync * 2);
                    293:        ims332_write_register( regs, IMS332_REG_V_PRE_EQUALIZE,
                    294:                              mon->v_pre_equalize);
                    295:        ims332_write_register( regs, IMS332_REG_V_POST_EQUALIZE,
                    296:                              mon->v_post_equalize);
                    297:        ims332_write_register( regs, IMS332_REG_V_BLANK,        mon->v_blank * 2);
                    298:        ims332_write_register( regs, IMS332_REG_V_DISPLAY,
                    299:                              mon->frame_visible_height * 2);
                    300:        ims332_write_register( regs, IMS332_REG_LINE_TIME,      mon->line_time);
                    301:        ims332_write_register( regs, IMS332_REG_LINE_START,     mon->line_start);
                    302:        ims332_write_register( regs, IMS332_REG_MEM_INIT,       mon->mem_init);
                    303:        ims332_write_register( regs, IMS332_REG_XFER_DELAY,     mon->xfer_delay);
                    304: 
                    305:        ims332_write_register( regs, IMS332_REG_COLOR_MASK, 0xffffff);
                    306: 
                    307:        ims332_init_colormap( regs );
                    308: 
                    309:        ims332_write_register(regs, IMS332_REG_CSR_A,
                    310:                IMS332_BPP_8 | IMS332_CSR_A_DMA_DISABLE | IMS332_CSR_A_VTG_ENABLE);
                    311: 
                    312: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.