pcvt cleanup. remove the set2061 program, it is so outdated that
nobody knows anymore what a 2061 chip is (hint: ELSA Winner 100 EISA).
This commit is contained in:
parent
9ff72212a8
commit
d66fe5f35c
@ -1,6 +1,8 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
SUBDIR= keycap cursor fontedit fonts kcon loadfont scon \
|
SUBDIR= keycap cursor fontedit fonts kcon loadfont scon \
|
||||||
userkeys vttest ispcvt mcon
|
userkeys vttest ispcvt mcon
|
||||||
SUBDIR+= vgaio kbdio set2061
|
SUBDIR+= vgaio kbdio
|
||||||
SUBDIR+= demo
|
SUBDIR+= demo
|
||||||
SUBDIR+= Misc
|
SUBDIR+= Misc
|
||||||
|
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
|
|
||||||
THE USE OF THIS PROGRAM MAY DESTROY YOUR MONITOR !!!
|
|
||||||
====================================================
|
|
||||||
|
|
||||||
IF YOU DON'T KNOW WHAT YOU ARE DOING, STAY AWAY FROM IT !!!
|
|
||||||
===========================================================
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
|
|
@ -1,299 +0,0 @@
|
|||||||
/*
|
|
||||||
* This code is derived from code available from the STB bulletin board
|
|
||||||
*
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* $XFree86: mit/server/ddx/x386/common_hw/ICD2061Aalt.c,v 2.6 1994/04/15 05:10:30 dawes Exp $ */
|
|
||||||
|
|
||||||
#ifndef _KERNEL
|
|
||||||
#include "compiler.h"
|
|
||||||
#else
|
|
||||||
#define GCCUSESGAS
|
|
||||||
#define PCVT_STANDALONE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SEQREG 0x03C4
|
|
||||||
#define MISCREG 0x03C2
|
|
||||||
#define MISCREAD 0x03CC
|
|
||||||
|
|
||||||
double fref = 14.31818 * 2.0;
|
|
||||||
char ascclk[] = "VIDEO CLOCK ?";
|
|
||||||
|
|
||||||
unsigned short clknum;
|
|
||||||
unsigned short vlbus_flag;
|
|
||||||
unsigned short card;
|
|
||||||
unsigned short crtcaddr;
|
|
||||||
unsigned short clockreg;
|
|
||||||
|
|
||||||
static double range[15] = {50.0, 51.0, 53.2, 58.5, 60.7, 64.4, 66.8, 73.5,
|
|
||||||
75.6, 80.9, 83.2, 91.5, 100.0, 120.0, 120.0};
|
|
||||||
|
|
||||||
#ifdef __STDC__
|
|
||||||
static double genratio(unsigned int *p, unsigned int *q, double tgt);
|
|
||||||
static double f(unsigned int p, unsigned int q, double basefreq);
|
|
||||||
#if 0
|
|
||||||
static void prtbinary(unsigned int size, unsigned int val);
|
|
||||||
#endif
|
|
||||||
static void wait_vb();
|
|
||||||
static void wrt_clk_bit(unsigned int value);
|
|
||||||
static void init_clock(unsigned long setup, unsigned short crtcport);
|
|
||||||
#else
|
|
||||||
static double genratio();
|
|
||||||
static double f();
|
|
||||||
#if 0
|
|
||||||
static void prtbinary();
|
|
||||||
#endif
|
|
||||||
static void wait_vb();
|
|
||||||
static void wrt_clk_bit();
|
|
||||||
static void init_clock();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void AltICD2061SetClock(frequency, select)
|
|
||||||
register long frequency; /* in Hz */
|
|
||||||
int select;
|
|
||||||
{
|
|
||||||
unsigned int m, mval, ival;
|
|
||||||
int i;
|
|
||||||
long dwv;
|
|
||||||
double realval;
|
|
||||||
double freq, fvco;
|
|
||||||
double dev, devx;
|
|
||||||
double delta, deltax;
|
|
||||||
unsigned int p, q;
|
|
||||||
unsigned int bestp, bestq;
|
|
||||||
unsigned char tmp;
|
|
||||||
|
|
||||||
crtcaddr=(inb(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
|
|
||||||
|
|
||||||
|
|
||||||
outb(crtcaddr, 0x11); /* Unlock CRTC registers */
|
|
||||||
tmp = inb(crtcaddr + 1);
|
|
||||||
outb(crtcaddr + 1, tmp & ~0x80);
|
|
||||||
|
|
||||||
outw(crtcaddr, 0x4838); /* Unlock S3 register set */
|
|
||||||
outw(crtcaddr, 0xA039);
|
|
||||||
|
|
||||||
clknum = select;
|
|
||||||
|
|
||||||
freq = ((double)frequency)/1000000.0;
|
|
||||||
if (freq > range[14])
|
|
||||||
freq =range[14];
|
|
||||||
else if (freq <= 6.99)
|
|
||||||
freq = 7.0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Calculate values to load into ICD 2061A clock chip to set frequency
|
|
||||||
*/
|
|
||||||
delta = 999.0;
|
|
||||||
dev = 999.0;
|
|
||||||
ival = 99;
|
|
||||||
mval = 99;
|
|
||||||
|
|
||||||
fvco = freq / 2;
|
|
||||||
for (m = 0; m < 8; m++) {
|
|
||||||
fvco *= 2.0;
|
|
||||||
for (i = 14; i >= 0; i--)
|
|
||||||
if (fvco >= range[i])
|
|
||||||
break;
|
|
||||||
if (i < 0)
|
|
||||||
continue;
|
|
||||||
if (i == 14)
|
|
||||||
break;
|
|
||||||
devx = (fvco - (range[i] + range[i+1])/2)/fvco;
|
|
||||||
if (devx < 0)
|
|
||||||
devx = -devx;
|
|
||||||
deltax = genratio(&p, &q, fvco);
|
|
||||||
if (delta < deltax)
|
|
||||||
continue;
|
|
||||||
if (deltax < delta || devx < dev) {
|
|
||||||
bestp = p;
|
|
||||||
bestq = q;
|
|
||||||
delta = deltax;
|
|
||||||
dev = devx;
|
|
||||||
ival = i;
|
|
||||||
mval = m;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fvco = fref;
|
|
||||||
for (m=0; m<mval; m++)
|
|
||||||
fvco /= 2.0;
|
|
||||||
realval = f(bestp, bestq, fvco);
|
|
||||||
dwv = ((((((long)ival << 7) | bestp) << 3) | mval) << 7) | bestq;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write ICD 2061A clock chip
|
|
||||||
*/
|
|
||||||
init_clock(((unsigned long)dwv) | (((long)clknum) << 21), crtcaddr);
|
|
||||||
|
|
||||||
wait_vb();
|
|
||||||
wait_vb();
|
|
||||||
wait_vb();
|
|
||||||
wait_vb();
|
|
||||||
wait_vb();
|
|
||||||
wait_vb();
|
|
||||||
wait_vb(); /* 0.10 second delay... */
|
|
||||||
}
|
|
||||||
|
|
||||||
static double f(p, q, base)
|
|
||||||
unsigned int p;
|
|
||||||
unsigned int q;
|
|
||||||
double base;
|
|
||||||
{
|
|
||||||
return(base * (p + 3)/(q + 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
static double genratio(p, q, tgt)
|
|
||||||
unsigned int *p;
|
|
||||||
unsigned int *q;
|
|
||||||
double tgt;
|
|
||||||
{
|
|
||||||
int k, m;
|
|
||||||
double test, mindiff;
|
|
||||||
unsigned int mmax;
|
|
||||||
|
|
||||||
mindiff = 999999999.0;
|
|
||||||
for (k = 13; k < 69; k++) { /* q={15..71}:Constraint 2 on page 14 */
|
|
||||||
m = 50.0*k/fref - 3;
|
|
||||||
if (m < 0)
|
|
||||||
m = 0;
|
|
||||||
mmax = 120*k/fref - 3; /* m..mmax is constraint 3 on page 14 */
|
|
||||||
if (mmax > 128)
|
|
||||||
mmax = 128;
|
|
||||||
while (m < mmax) {
|
|
||||||
test = f(m, k, fref) - tgt;
|
|
||||||
if (test < 0) test = -test;
|
|
||||||
if (mindiff > test) {
|
|
||||||
mindiff = test;
|
|
||||||
*p = m;
|
|
||||||
*q = k;
|
|
||||||
}
|
|
||||||
m++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (mindiff);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void prtbinary(size, val)
|
|
||||||
unsigned int size;
|
|
||||||
unsigned int val;
|
|
||||||
{
|
|
||||||
unsigned int mask;
|
|
||||||
int k;
|
|
||||||
|
|
||||||
mask = 1;
|
|
||||||
|
|
||||||
for (k=size; --k > 0 || mask <= val/2;)
|
|
||||||
mask <<= 1;
|
|
||||||
|
|
||||||
while (mask) {
|
|
||||||
fputc((mask&val)? '1': '0' , stderr);
|
|
||||||
mask >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void wait_vb()
|
|
||||||
{
|
|
||||||
while ((inb(crtcaddr+6) & 0x08) == 0)
|
|
||||||
;
|
|
||||||
while (inb(crtcaddr+6) & 0x08)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __STDC__
|
|
||||||
static void init_clock(unsigned long setup, unsigned short crtcport)
|
|
||||||
#else
|
|
||||||
static void init_clock(setup, crtcport)
|
|
||||||
unsigned long setup;
|
|
||||||
unsigned short crtcport;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
unsigned char nclk[2], clk[2];
|
|
||||||
unsigned short restore42;
|
|
||||||
unsigned short oldclk;
|
|
||||||
unsigned short bitval;
|
|
||||||
int i;
|
|
||||||
unsigned char c;
|
|
||||||
|
|
||||||
#ifndef PCVT_STANDALONE
|
|
||||||
(void)xf86DisableInterrupts();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
oldclk = inb(0x3CC);
|
|
||||||
|
|
||||||
outb(crtcport, 0x42);
|
|
||||||
restore42 = inb(crtcport+1);
|
|
||||||
|
|
||||||
outw(0x3C4, 0x0100);
|
|
||||||
|
|
||||||
outb(0x3C4, 1);
|
|
||||||
c = inb(0x3C5);
|
|
||||||
outb(0x3C5, 0x20 | c);
|
|
||||||
|
|
||||||
outb(crtcport, 0x42);
|
|
||||||
outb(crtcport+1, 0x03);
|
|
||||||
|
|
||||||
outw(0x3C4, 0x0300);
|
|
||||||
|
|
||||||
nclk[0] = oldclk & 0xF3;
|
|
||||||
nclk[1] = nclk[0] | 0x08;
|
|
||||||
clk[0] = nclk[0] | 0x04;
|
|
||||||
clk[1] = nclk[0] | 0x0C;
|
|
||||||
|
|
||||||
outb(crtcport, 0x42);
|
|
||||||
i = inw(crtcport);
|
|
||||||
|
|
||||||
outw(0x3C4, 0x0100);
|
|
||||||
|
|
||||||
wrt_clk_bit(oldclk | 0x08);
|
|
||||||
wrt_clk_bit(oldclk | 0x0C);
|
|
||||||
for (i=0; i<5; i++) {
|
|
||||||
wrt_clk_bit(nclk[1]);
|
|
||||||
wrt_clk_bit(clk[1]);
|
|
||||||
}
|
|
||||||
wrt_clk_bit(nclk[1]);
|
|
||||||
wrt_clk_bit(nclk[0]);
|
|
||||||
wrt_clk_bit(clk[0]);
|
|
||||||
wrt_clk_bit(nclk[0]);
|
|
||||||
wrt_clk_bit(clk[0]);
|
|
||||||
for (i=0; i<24; i++) {
|
|
||||||
bitval = setup & 0x01;
|
|
||||||
setup >>= 1;
|
|
||||||
wrt_clk_bit(clk[1-bitval]);
|
|
||||||
wrt_clk_bit(nclk[1-bitval]);
|
|
||||||
wrt_clk_bit(nclk[bitval]);
|
|
||||||
wrt_clk_bit(clk[bitval]);
|
|
||||||
}
|
|
||||||
wrt_clk_bit(clk[1]);
|
|
||||||
wrt_clk_bit(nclk[1]);
|
|
||||||
wrt_clk_bit(clk[1]);
|
|
||||||
|
|
||||||
outb(0x3C4, 1);
|
|
||||||
c = inb(0x3C5);
|
|
||||||
outb(0x3C5, 0xDF & c);
|
|
||||||
|
|
||||||
outb(crtcport, 0x42);
|
|
||||||
outb(crtcport+1, restore42);
|
|
||||||
|
|
||||||
outb(0x3C2, oldclk);
|
|
||||||
|
|
||||||
outw(0x3C4, 0x0300);
|
|
||||||
|
|
||||||
#ifndef PCVT_STANDALONE
|
|
||||||
xf86EnableInterrupts();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wrt_clk_bit(value)
|
|
||||||
unsigned int value;
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
outb(0x3C2, value);
|
|
||||||
for (j=2; --j; )
|
|
||||||
inb(0x200);
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
PROG= set2061
|
|
||||||
SRCS= main.c ICD2061Aalt.c
|
|
||||||
CFLAGS+= -DGCCUSESGAS -DPCVT_STANDALONE
|
|
||||||
NOMAN=
|
|
||||||
|
|
||||||
all: $(PROG)
|
|
||||||
|
|
||||||
install:
|
|
||||||
@${ECHO} "set2061 is not installed automatically ...."
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
||||||
|
|
||||||
$(PROG): compiler.h
|
|
@ -1,22 +0,0 @@
|
|||||||
CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION CAUTION
|
|
||||||
|
|
||||||
THE USE OF THIS PROGRAM MAY DESTROY YOUR MONITOR !!!
|
|
||||||
====================================================
|
|
||||||
|
|
||||||
IF YOU DON'T KNOW WHAT YOU ARE DOING, STAY AWAY FROM IT !!!
|
|
||||||
===========================================================
|
|
||||||
|
|
||||||
Read the file "CAUTION" before proceeding !!!
|
|
||||||
|
|
||||||
The files:
|
|
||||||
|
|
||||||
ICD2061Aalt.c and
|
|
||||||
compiler.h
|
|
||||||
|
|
||||||
come from the Xfree86 2.1 distribution and have been slightly modified to
|
|
||||||
fit in a non-XFree environment.
|
|
||||||
|
|
||||||
I use it to program the clock generator ICD2061a on my S3 928 based ELSA
|
|
||||||
Winner VGA board to 40MHz for clock generator #2: set2061 -n2 -f40000000.
|
|
||||||
|
|
||||||
This enables me to use 132 columns mode on this VGA board.
|
|
@ -1,341 +0,0 @@
|
|||||||
/* $XFree86: mit/server/ddx/x386/common/compiler.h,v 2.3 1993/10/03 14:55:28 dawes Exp $ */
|
|
||||||
/*
|
|
||||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
* documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
* the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of Thomas Roell not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software without
|
|
||||||
* specific, written prior permission. Thomas Roell makes no representations
|
|
||||||
* about the suitability of this software for any purpose. It is provided
|
|
||||||
* "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
||||||
* EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _COMPILER_H
|
|
||||||
#define _COMPILER_H
|
|
||||||
|
|
||||||
#ifndef __STDC__
|
|
||||||
# ifdef signed
|
|
||||||
# undef signed
|
|
||||||
# endif
|
|
||||||
# ifdef volatile
|
|
||||||
# undef volatile
|
|
||||||
# endif
|
|
||||||
# ifdef const
|
|
||||||
# undef const
|
|
||||||
# endif
|
|
||||||
# define signed /**/
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# define volatile __volatile__
|
|
||||||
# define const __const__
|
|
||||||
# else
|
|
||||||
# define const /**/
|
|
||||||
# endif /* __GNUC__ */
|
|
||||||
#endif /* !__STDC__ */
|
|
||||||
|
|
||||||
#ifdef NO_INLINE
|
|
||||||
|
|
||||||
extern void outb();
|
|
||||||
extern void outw();
|
|
||||||
extern unsigned int inb();
|
|
||||||
extern unsigned int inw();
|
|
||||||
#if NeedFunctionPrototypes
|
|
||||||
extern unsigned char rdinx(unsigned short, unsigned char);
|
|
||||||
extern void wrinx(unsigned short, unsigned char, unsigned char);
|
|
||||||
extern void modinx(unsigned short, unsigned char, unsigned char, unsigned char);
|
|
||||||
extern int testrg(unsigned short, unsigned char);
|
|
||||||
extern int textinx2(unsigned short, unsigned char, unsigned char);
|
|
||||||
extern int textinx(unsigned short, unsigned char);
|
|
||||||
#else /* NeedFunctionProtoypes */
|
|
||||||
extern unsigned char rdinx();
|
|
||||||
extern void wrinx();
|
|
||||||
extern void modinx();
|
|
||||||
extern int testrg();
|
|
||||||
extern int textinx2();
|
|
||||||
extern int textinx();
|
|
||||||
#endif /* NeedFunctionProtoypes */
|
|
||||||
|
|
||||||
#else /* NO_INLINE */
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
|
|
||||||
#ifndef FAKEIT
|
|
||||||
#ifdef GCCUSESGAS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If gcc uses gas rather than the native assembler, the syntax of these
|
|
||||||
* inlines has to be different. DHD
|
|
||||||
*/
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outb(port, val)
|
|
||||||
short port;
|
|
||||||
char val;
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outw(port, val)
|
|
||||||
short port;
|
|
||||||
short val;
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inb(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
unsigned char ret;
|
|
||||||
__asm__ __volatile__("inb %1,%0" :
|
|
||||||
"=a" (ret) :
|
|
||||||
"d" (port));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inw(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
unsigned short ret;
|
|
||||||
__asm__ __volatile__("inw %1,%0" :
|
|
||||||
"=a" (ret) :
|
|
||||||
"d" (port));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* GCCUSESGAS */
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outb(port, val)
|
|
||||||
short port;
|
|
||||||
char val;
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port));
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outw(port, val)
|
|
||||||
short port;
|
|
||||||
short val;
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port));
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inb(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
unsigned char ret;
|
|
||||||
__asm__ __volatile__("in%B0 (%1)" :
|
|
||||||
"=a" (ret) :
|
|
||||||
"d" (port));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inw(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
unsigned short ret;
|
|
||||||
__asm__ __volatile__("in%W0 (%1)" :
|
|
||||||
"=a" (ret) :
|
|
||||||
"d" (port));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* GCCUSESGAS */
|
|
||||||
|
|
||||||
#else /* FAKEIT */
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outb(port, val)
|
|
||||||
short port;
|
|
||||||
char val;
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
outw(port, val)
|
|
||||||
short port;
|
|
||||||
short val;
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inb(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ unsigned int
|
|
||||||
inw(port)
|
|
||||||
short port;
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* FAKEIT */
|
|
||||||
|
|
||||||
#else /* __GNUC__ */
|
|
||||||
#if !defined(AMOEBA) && !defined(_MINIX)
|
|
||||||
# if defined(__STDC__) && (__STDC__ == 1)
|
|
||||||
# define asm __asm
|
|
||||||
# endif
|
|
||||||
# ifdef SVR4
|
|
||||||
# include <sys/types.h>
|
|
||||||
# ifndef __USLC__
|
|
||||||
# define __USLC__
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# include <sys/inline.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
*-----------------------------------------------------------------------
|
|
||||||
* Port manipulation convenience functions
|
|
||||||
*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#define __inline__ /**/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rdinx - read the indexed byte port 'port', index 'ind', and return its value
|
|
||||||
*/
|
|
||||||
static __inline__ unsigned char
|
|
||||||
#ifdef __STDC__
|
|
||||||
rdinx(unsigned short port, unsigned char ind)
|
|
||||||
#else
|
|
||||||
rdinx(port, ind)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char ind;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if (port == 0x3C0) /* reset attribute flip-flop */
|
|
||||||
(void) inb(0x3DA);
|
|
||||||
outb(port, ind);
|
|
||||||
return(inb(port+1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* wrinx - write 'val' to port 'port', index 'ind'
|
|
||||||
*/
|
|
||||||
static __inline__ void
|
|
||||||
#ifdef __STDC__
|
|
||||||
wrinx(unsigned short port, unsigned char ind, unsigned char val)
|
|
||||||
#else
|
|
||||||
wrinx(port, ind, val)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char ind, val;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
outb(port, ind);
|
|
||||||
outb(port+1, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* modinx - in register 'port', index 'ind', set the bits in 'mask' as in 'new';
|
|
||||||
* the other bits are unchanged.
|
|
||||||
*/
|
|
||||||
static __inline__ void
|
|
||||||
#ifdef __STDC__
|
|
||||||
modinx(unsigned short port, unsigned char ind,
|
|
||||||
unsigned char mask, unsigned char new)
|
|
||||||
#else
|
|
||||||
modinx(port, ind, mask, new)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char ind, mask, new;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
unsigned char tmp;
|
|
||||||
|
|
||||||
tmp = (rdinx(port, ind) & ~mask) | (new & mask);
|
|
||||||
wrinx(port, ind, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* tstrg - returns true iff the bits in 'mask' of register 'port' are
|
|
||||||
* readable & writable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static __inline__ int
|
|
||||||
#ifdef __STDC__
|
|
||||||
testrg(unsigned short port, unsigned char mask)
|
|
||||||
#else
|
|
||||||
tstrg(port, mask)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char mask;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
unsigned char old, new1, new2;
|
|
||||||
|
|
||||||
old = inb(port);
|
|
||||||
outb(port, old & ~mask);
|
|
||||||
new1 = inb(port) & mask;
|
|
||||||
outb(port, old | mask);
|
|
||||||
new2 = inb(port) & mask;
|
|
||||||
outb(port, old);
|
|
||||||
return((new1 == 0) && (new2 == mask));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* testinx2 - returns true iff the bits in 'mask' of register 'port', index
|
|
||||||
* 'ind' are readable & writable.
|
|
||||||
*/
|
|
||||||
static __inline__ int
|
|
||||||
#ifdef __STDC__
|
|
||||||
testinx2(unsigned short port, unsigned char ind, unsigned char mask)
|
|
||||||
#else
|
|
||||||
testinx2(port, ind, mask)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char ind, mask;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
unsigned char old, new1, new2;
|
|
||||||
|
|
||||||
old = rdinx(port, ind);
|
|
||||||
wrinx(port, ind, old & ~mask);
|
|
||||||
new1 = rdinx(port, ind) & mask;
|
|
||||||
wrinx(port, ind, old | mask);
|
|
||||||
new2 = rdinx(port, ind) & mask;
|
|
||||||
wrinx(port, ind, old);
|
|
||||||
return((new1 == 0) && (new2 == mask));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* testinx - returns true iff all bits of register 'port', index 'ind' are
|
|
||||||
* readable & writable.
|
|
||||||
*/
|
|
||||||
static __inline__ int
|
|
||||||
#ifdef __STDC__
|
|
||||||
testinx(unsigned short port, unsigned char ind)
|
|
||||||
#else
|
|
||||||
testinx(port, ind, mask)
|
|
||||||
unsigned short port;
|
|
||||||
unsigned char ind;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return(testinx2(port, ind, 0xFF));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* NO_INLINE */
|
|
||||||
#endif /* _COMPILER_H */
|
|
@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1994 Hellmuth Michaelis
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by
|
|
||||||
* Hellmuth Michaelis
|
|
||||||
* 4. The name authors may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
static char *id =
|
|
||||||
"@(#)set2061.c, 1.00, Last Edit-Date: [Sun Jan 15 19:52:05 1995]";
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
*
|
|
||||||
* history:
|
|
||||||
*
|
|
||||||
* -hm start using 132 columns on my Elsa Winner
|
|
||||||
*
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <machine/pcvt_ioctl.h>
|
|
||||||
|
|
||||||
#define DEFAULTFD 0
|
|
||||||
|
|
||||||
void AltICD2061SetClock(long frequency, int select);
|
|
||||||
|
|
||||||
main(argc,argv)
|
|
||||||
int argc;
|
|
||||||
char *argv[];
|
|
||||||
{
|
|
||||||
extern int optind;
|
|
||||||
extern int opterr;
|
|
||||||
extern char *optarg;
|
|
||||||
|
|
||||||
int fd;
|
|
||||||
int c;
|
|
||||||
long freq = -1;
|
|
||||||
int no = -1;
|
|
||||||
|
|
||||||
while( (c = getopt(argc, argv, "f:n:")) != -1)
|
|
||||||
{
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
case 'f':
|
|
||||||
freq = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
no = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '?':
|
|
||||||
default:
|
|
||||||
usage();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(freq == -1 || no == -1)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
if((fd = open("/dev/console", O_RDONLY)) < 0)
|
|
||||||
fd = DEFAULTFD;
|
|
||||||
|
|
||||||
if(ioctl(fd, KDENABIO, 0) < 0)
|
|
||||||
{
|
|
||||||
perror("ioctl(KDENABIO)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AltICD2061SetClock(freq, no);
|
|
||||||
|
|
||||||
(void)ioctl(fd, KDDISABIO, 0);
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
usage()
|
|
||||||
{
|
|
||||||
fprintf(stderr,"\nset2061 - program the ICD2061 video clock chip\n");
|
|
||||||
fprintf(stderr,"usage: set2061 -f <freq> -n <no>\n");
|
|
||||||
fprintf(stderr," -f <freq> frequency in Hz\n");
|
|
||||||
fprintf(stderr," -n <no> clock generator number\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user