summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/vga/stg1702.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/vga/stg1702.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/vga/stg1702.c')
-rwxr-xr-xsys/src/cmd/aux/vga/stg1702.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/vga/stg1702.c b/sys/src/cmd/aux/vga/stg1702.c
new file mode 100755
index 000000000..b02d46181
--- /dev/null
+++ b/sys/src/cmd/aux/vga/stg1702.c
@@ -0,0 +1,177 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#include "pci.h"
+#include "vga.h"
+
+/*
+ * SGS-Thompson STG1702 Enhanced True Color Palette-DAC
+ * with 16-bit Pixel Port.
+ */
+enum {
+ Command = 0x00, /* Pixel Command Register */
+ IndexLO = 0x01, /* LO-byte of 16-bit Index */
+ IndexHI = 0x02, /* HI-byte of 16-bit Index */
+ Index = 0x03, /* Indexed Register */
+
+ CompanyID = 0x00, /* Company ID = 0x44 */
+ DeviceID = 0x01, /* Device ID = 0x02 */
+ Pmode = 0x03, /* Primary Pixel Mode Select */
+ Smode = 0x04, /* Secondary Pixel Mode Select */
+ Pipeline = 0x05, /* Pipeline Timing Control */
+ Sreset = 0x06, /* Soft Reset */
+ Power = 0x07, /* Power Management */
+
+ Nindex = 0x08,
+};
+
+static void
+pixmask(void)
+{
+ inportb(PaddrW);
+}
+
+static void
+commandrw(void)
+{
+ int i;
+
+ pixmask();
+ for(i = 0; i < 4; i++)
+ inportb(Pixmask);
+}
+
+static uchar
+commandr(void)
+{
+ uchar command;
+
+ commandrw();
+ command = inportb(Pixmask);
+ pixmask();
+
+ return command;
+}
+
+static void
+commandw(uchar command)
+{
+ commandrw();
+ outportb(Pixmask, command);
+ pixmask();
+}
+
+static void
+indexrw(uchar index)
+{
+ uchar command;
+
+ command = commandr();
+ commandw(command|0x10);
+
+ commandrw();
+ inportb(Pixmask);
+ outportb(Pixmask, index & 0xFF);
+ outportb(Pixmask, (index>>8) & 0xFF);
+}
+
+static void
+options(Vga*, Ctlr* ctlr)
+{
+ ctlr->flag |= Hpclk2x8|Foptions;
+}
+
+static void
+init(Vga* vga, Ctlr* ctlr)
+{
+ ulong pclk;
+
+ /*
+ * Part comes in -135MHz speed-grade.
+ * In 8-bit mode the max. PCLK is 110MHz. In 2x8-bit mode
+ * the max. PCLK is the speed-grade, using the 2x doubler.
+ * We can use mode 2 (2x8-bit, internal clock doubler)
+ * if connected to a suitable graphics chip, e.g. the
+ * ET4000-w32p.
+ */
+ if(vga->ctlr && ((vga->ctlr->flag & Hpclk2x8) && vga->mode->z == 8))
+ pclk = 135000000;
+ else
+ pclk = 110000000;
+
+ /*
+ * If we don't already have a desired pclk,
+ * take it from the mode.
+ * Check it's within range.
+ */
+ if(vga->f[0] == 0)
+ vga->f[0] = vga->mode->frequency;
+ if(vga->f[0] < 16000000 || vga->f[0] > pclk)
+ error("%s: invalid pclk - %ld\n", ctlr->name, vga->f[0]);
+
+ /*
+ * Determine whether to use 2x8-bit mode or not.
+ * If yes and the clock has already been initialised,
+ * initialise it again.
+ */
+ if(vga->ctlr && (vga->ctlr->flag & Hpclk2x8) && vga->mode->z == 8 && vga->f[0] >= 110000000){
+ vga->f[0] /= 2;
+ resyncinit(vga, ctlr, Upclk2x8, 0);
+ }
+
+ ctlr->flag |= Finit;
+}
+
+static void
+load(Vga* vga, Ctlr* ctlr)
+{
+ uchar command, mode, pipeline;
+
+ command = 0x00;
+ mode = 0x00;
+ pipeline = 0x02;
+ if(ctlr->flag & Upclk2x8){
+ command = 0x08;
+ mode = 0x05;
+ pipeline = 0x02;
+ if(vga->f[0] < 16000000)
+ pipeline = 0x00;
+ else if(vga->f[0] < 32000000)
+ pipeline = 0x01;
+ }
+
+ indexrw(Pmode);
+ outportb(Pixmask, mode);
+ outportb(Pixmask, mode);
+ outportb(Pixmask, pipeline);
+ sleep(1);
+ commandw(command);
+
+ ctlr->flag |= Fload;
+}
+
+static void
+dump(Vga*, Ctlr* ctlr)
+{
+ int i;
+
+ printitem(ctlr->name, "command");
+ printreg(commandr());
+
+ printitem(ctlr->name, "index");
+ indexrw(CompanyID);
+ for(i = 0; i < Nindex; i++)
+ printreg(inportb(Pixmask));
+
+ pixmask();
+}
+
+Ctlr stg1702 = {
+ "stg1702", /* name */
+ 0, /* snarf */
+ options, /* options */
+ init, /* init */
+ load, /* load */
+ dump, /* dump */
+};