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/ch9294.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/vga/ch9294.c')
-rwxr-xr-x | sys/src/cmd/aux/vga/ch9294.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/vga/ch9294.c b/sys/src/cmd/aux/vga/ch9294.c new file mode 100755 index 000000000..aa206b31c --- /dev/null +++ b/sys/src/cmd/aux/vga/ch9294.c @@ -0,0 +1,91 @@ +/* + * Chrontel + * CH9294 Dual Enhanced Graphics 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[] = { + { "e", "E", /* Tseng */ + 50350000, 56644000, 65000000, 72000000, 80000000, 89800000, 63000000, 75000000, + VgaFreq0, VgaFreq1, 31500000, 36000000, 40000000, 44900000, 50000000, 65000000, + }, + { "g", "G", /* S3, IIT */ + VgaFreq0, VgaFreq1, 40000000, 72000000, 50000000, 77000000, 36000000, 44900000, + 130000000, 120000000, 80000000, 31500000, 110000000, 65000000, 75000000, 94500000, + }, + { "k", "K", /* Avance Logic */ + 50350000, 56644000, 89800000, 72000000, 75000000, 65000000, 63000000, 80000000, + 57272000, 85000000, 94000000, 96000000, 100000000, 108000000, 110000000, 77000000, + }, + + { 0, + }, +}; + +static void +init(Vga* vga, Ctlr* ctlr) +{ + Pattern *pattern; + char *p; + int f, fmin, 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; + fmin = vga->f[0]; + 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 < fmin){ + /*vga->f = pattern->frequency[index];*/ + fmin = f; + vga->d[0] = divisor; + vga->i[0] = index; + } + } + } + + if(fmin > (vga->f[0]*5)/100) + error("%s: can't find frequency %ld\n", ctlr->name, vga->f[0]); + ctlr->flag |= Finit; +} + +Ctlr ch9294 = { + "ch9294", /* name */ + 0, /* snarf */ + 0, /* options */ + init, /* init */ + 0, /* load */ + 0, /* dump */ +}; |