summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/vga/ics2494.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/ics2494.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/vga/ics2494.c')
-rwxr-xr-xsys/src/cmd/aux/vga/ics2494.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/vga/ics2494.c b/sys/src/cmd/aux/vga/ics2494.c
new file mode 100755
index 000000000..d9c149d12
--- /dev/null
+++ b/sys/src/cmd/aux/vga/ics2494.c
@@ -0,0 +1,95 @@
+/*
+ * Integrated Circuit Systems, Inc.
+ * ICS2494[A] Dual Video/Memory Clock Generator.
+ */
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#include "pci.h"
+#include "vga.h"
+
+typedef struct {
+ char* name[2];
+ ulong frequency[16];
+} Pattern;
+
+static Pattern patterns[] = {
+ { "237", "304",
+ 50350000, 56644000, 65000000, 72000000, 80000000, 89800000, 63000000, 75000000,
+ 25175000, 28322000, 31500000, 36000000, 40000000, 44900000, 50000000, 65000000,
+ },
+
+ { "324", 0,
+ 50350000, 56644000, 65000000, 72000000, 80000000, 89800000, 63000000, 75000000,
+ 83078000, 93463000, 100000000, 104000000, 108000000, 120000000, 130000000, 134700000,
+ },
+
+ { 0,
+ },
+};
+
+static void
+init(Vga* vga, Ctlr* ctlr)
+{
+ Pattern *pattern;
+ char *p;
+ int f, index, divisor, maxdivisor;
+
+ if(ctlr->flag & Finit)
+ return;
+
+ if(vga->f[0] == 0)
+ vga->f[0] = vga->mode->frequency;
+
+ if((p = strchr(ctlr->name, '-')) == 0)
+ error("%s: unknown pattern\n", ctlr->name);
+ p++;
+
+ for(pattern = patterns; pattern->name[0]; pattern++){
+ if(strcmp(pattern->name[0], p) == 0)
+ break;
+ if(pattern->name[1] && strcmp(pattern->name[1], p) == 0)
+ break;
+ }
+ if(pattern->name[0] == 0)
+ error("%s: unknown pattern\n", ctlr->name);
+
+ maxdivisor = 1;
+ if(vga->ctlr && (vga->ctlr->flag & Hclkdiv))
+ maxdivisor = 8;
+ for(index = 0; index < 16; index++){
+ for(divisor = 1; divisor <= maxdivisor; divisor <<= 1){
+ f = vga->f[0] - pattern->frequency[index]/divisor;
+ if(f < 0)
+ f = -f;
+ if(f < 1000000){
+ /*vga->f = pattern->frequency[index];*/
+ vga->d[0] = divisor;
+ vga->i[0] = index;
+
+ ctlr->flag |= Finit;
+ return;
+ }
+ }
+ }
+ error("%s: can't find frequency %ld\n", ctlr->name, vga->f[0]);
+}
+
+Ctlr ics2494 = {
+ "ics2494", /* name */
+ 0, /* snarf */
+ 0, /* options */
+ init, /* init */
+ 0, /* load */
+ 0, /* dump */
+};
+
+Ctlr ics2494a = {
+ "ics2494a", /* name */
+ 0, /* snarf */
+ 0, /* options */
+ init, /* init */
+ 0, /* load */
+ 0, /* dump */
+};