diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/cmd/aux/vga/ics2494.c | 95 |
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 */ +}; |