Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>

#include "pci.h"
#include "vga.h"

/*
 * Tvp3025 Viewpoint Video Interface Pallette.
 * Assumes hooked up to an S3 Vision964.
 * The #9GXE64pro uses bit 5 of Crt5C as RS4,
 * giving access to the Bt485 emulation mode registers.
 */
static void
options(Vga* vga, Ctlr* ctlr)
{
        tvp3020.options(vga, ctlr);
}

static void
init(Vga* vga, Ctlr* ctlr)
{
        /*
         * Although the Tvp3025 has a higher default
         * speed-grade (135MHz), just use the 3020 code.
         */
        tvp3020.init(vga, ctlr);
}

static void
load(Vga* vga, Ctlr* ctlr)
{
        uchar crt5c, x;

        crt5c = vgaxi(Crtx, 0x5C) & ~0x20;
        vgaxo(Crtx, 0x5C, crt5c);
        x = tvp3020xi(0x06) & ~0x80;
        tvp3020xo(0x06, x);
        tvp3020xo(0x0E, 0x00);

        (tvp3020.load)(vga, ctlr);
        if(ctlr->flag & Uenhanced)
                tvp3020xo(0x29, 0x01);

        ctlr->flag |= Fload;
}

static ulong
dumpclock(ulong d, ulong n, ulong p)
{
        ulong f;

        f = RefFreq*((n+2)*8);
        f /= (d+2);
        f >>= p;

        return f;
}

static void
dump(Vga* vga, Ctlr* ctlr)
{
        uchar crt5c;
        int i;
        ulong clock[4];

        crt5c = vgaxi(Crtx, 0x5C);
        vgaxo(Crtx, 0x5C, crt5c & ~0x20);
        tvp3020.dump(vga, ctlr);

        printitem(ctlr->name, "PCLK");
        for(i = 0; i < 4; i++){
                tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
                printreg(clock[i] = tvp3020xi(0x2D));
        }
        Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));

        printitem(ctlr->name, "MCLK");
        for(i = 0; i < 4; i++){
                tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
                printreg(clock[i] = tvp3020xi(0x2E));
        }
        Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));

        printitem(ctlr->name, "RCLK");
        for(i = 0; i < 4; i++){
                tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
                printreg(clock[i] = tvp3020xi(0x2F));
        }
        Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));

        vgaxo(Crtx, 0x5C, crt5c);
}

Ctlr tvp3025 = {
        "tvp3025",                      /* name */
        0,                              /* snarf */
        options,                        /* options */
        init,                           /* init */
        load,                           /* load */
        dump,                           /* dump */
};