diff options
author | marha <marha@users.sourceforge.net> | 2009-06-28 22:07:26 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-06-28 22:07:26 +0000 |
commit | 3562e78743202e43aec8727005182a2558117eca (patch) | |
tree | 8f9113a77d12470c5c851a2a8e4cb02e89df7d43 /xorg-server/hw/xfree86/utils/ioport/ioport.c | |
download | vcxsrv-3562e78743202e43aec8727005182a2558117eca.tar.gz vcxsrv-3562e78743202e43aec8727005182a2558117eca.tar.bz2 vcxsrv-3562e78743202e43aec8727005182a2558117eca.zip |
Checked in the following released items:
xkeyboard-config-1.4.tar.gz
ttf-bitstream-vera-1.10.tar.gz
font-alias-1.0.1.tar.gz
font-sun-misc-1.0.0.tar.gz
font-sun-misc-1.0.0.tar.gz
font-sony-misc-1.0.0.tar.gz
font-schumacher-misc-1.0.0.tar.gz
font-mutt-misc-1.0.0.tar.gz
font-misc-misc-1.0.0.tar.gz
font-misc-meltho-1.0.0.tar.gz
font-micro-misc-1.0.0.tar.gz
font-jis-misc-1.0.0.tar.gz
font-isas-misc-1.0.0.tar.gz
font-dec-misc-1.0.0.tar.gz
font-daewoo-misc-1.0.0.tar.gz
font-cursor-misc-1.0.0.tar.gz
font-arabic-misc-1.0.0.tar.gz
font-winitzki-cyrillic-1.0.0.tar.gz
font-misc-cyrillic-1.0.0.tar.gz
font-cronyx-cyrillic-1.0.0.tar.gz
font-screen-cyrillic-1.0.1.tar.gz
font-xfree86-type1-1.0.1.tar.gz
font-adobe-utopia-type1-1.0.1.tar.gz
font-ibm-type1-1.0.0.tar.gz
font-bitstream-type1-1.0.0.tar.gz
font-bitstream-speedo-1.0.0.tar.gz
font-bh-ttf-1.0.0.tar.gz
font-bh-type1-1.0.0.tar.gz
font-bitstream-100dpi-1.0.0.tar.gz
font-bh-lucidatypewriter-100dpi-1.0.0.tar.gz
font-bh-100dpi-1.0.0.tar.gz
font-adobe-utopia-100dpi-1.0.1.tar.gz
font-adobe-100dpi-1.0.0.tar.gz
font-util-1.0.1.tar.gz
font-bitstream-75dpi-1.0.0.tar.gz
font-bh-lucidatypewriter-75dpi-1.0.0.tar.gz
font-adobe-utopia-75dpi-1.0.1.tar.gz
font-bh-75dpi-1.0.0.tar.gz
bdftopcf-1.0.1.tar.gz
font-adobe-75dpi-1.0.0.tar.gz
mkfontscale-1.0.6.tar.gz
openssl-0.9.8k.tar.gz
bigreqsproto-1.0.2.tar.gz
xtrans-1.2.2.tar.gz
resourceproto-1.0.2.tar.gz
inputproto-1.4.4.tar.gz
compositeproto-0.4.tar.gz
damageproto-1.1.0.tar.gz
zlib-1.2.3.tar.gz
xkbcomp-1.0.5.tar.gz
freetype-2.3.9.tar.gz
pthreads-w32-2-8-0-release.tar.gz
pixman-0.12.0.tar.gz
kbproto-1.0.3.tar.gz
evieext-1.0.2.tar.gz
fixesproto-4.0.tar.gz
recordproto-1.13.2.tar.gz
randrproto-1.2.2.tar.gz
scrnsaverproto-1.1.0.tar.gz
renderproto-0.9.3.tar.gz
xcmiscproto-1.1.2.tar.gz
fontsproto-2.0.2.tar.gz
xextproto-7.0.3.tar.gz
xproto-7.0.14.tar.gz
libXdmcp-1.0.2.tar.gz
libxkbfile-1.0.5.tar.gz
libfontenc-1.0.4.tar.gz
libXfont-1.3.4.tar.gz
libX11-1.1.5.tar.gz
libXau-1.0.4.tar.gz
libxcb-1.1.tar.gz
xorg-server-1.5.3.tar.gz
Diffstat (limited to 'xorg-server/hw/xfree86/utils/ioport/ioport.c')
-rw-r--r-- | xorg-server/hw/xfree86/utils/ioport/ioport.c | 491 |
1 files changed, 491 insertions, 0 deletions
diff --git a/xorg-server/hw/xfree86/utils/ioport/ioport.c b/xorg-server/hw/xfree86/utils/ioport/ioport.c new file mode 100644 index 000000000..737043462 --- /dev/null +++ b/xorg-server/hw/xfree86/utils/ioport/ioport.c @@ -0,0 +1,491 @@ +/* + * Copyright 2002 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * + * 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 Marc Aurele La France not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Marc Aurele La France makes no representations + * about the suitability of this software for any purpose. It is provided + * "as-is" without express or implied warranty. + * + * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL MARC AURELE LA FRANCE 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. + */ + +#include "compiler.h" +#include "xf86_OSproc.h" + +#include <errno.h> + +static char *MyName; +static int Port = -1, Index = -1; +static unsigned int Value; + +static void +inb_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "inb [-i <index>] <port>\n"); +} + +static void +inw_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "inw [-i <index>] <port>\n"); +} + +static void +inl_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "inl [-i <index>] <port>\n"); +} + + +static void +outb_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "outb [-i <index>] <port> <value>\n"); +} + +static void +outw_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "outw [-i <index>] <port> <value>\n"); +} + +static void +outl_usage +( +#ifdef __STDC__ + void +#endif +) +{ + fprintf(stderr, "outl [-i <index>] <port> <value>\n"); +} + +static int +#ifdef __STDC__ +parse_number +( + const char *String, + void (* Usage)(void), + unsigned int Maximum) +#else +parse_number(String, Usage, Maximum) + const char *String; + void (* Usage)(); + unsigned int Maximum; +#endif +{ + char *BadString = (char *)0; + unsigned int Number = strtoul(String, &BadString, 0); + if ((Number > Maximum) || errno || + (BadString && *BadString)) + { + (*Usage)(); + exit(1); + } + + return (Number); +} + +static void +#ifdef __STDC__ +input_parse +( + int argc, + char **argv, + void (* Usage)(void)) +#else +input_parse(argc, argv, Usage) + int argc; + char **argv; + void (* Usage)(); +#endif +{ + if ((argc < 2) || (argc > 4)) + { + (*Usage)(); + exit(1); + } + + for(; (++argv, --argc); ) + { + if ((Index < 0) && + (argv[0][0] == '-') && + (argv[0][1] == 'i')) + { + if ((++argv[0], *(++argv[0])) || (++argv, --argc)) + Index = parse_number(argv[0], Usage, 0xFFU); + else + { + (*Usage)(); + exit(1); + } + } + else if (Port < 0) + { + Port = parse_number(argv[0], Usage, 0xFFFFU); + } + else + { + (*Usage)(); + exit(1); + } + } +} + +static void +#ifdef __STDC__ +output_parse +( + int argc, + char **argv, + void (* Usage)(void), + unsigned int Maximum +) +#else +output_parse(argc, argv, Usage, Maximum) + int argc; + char **argv; + void (* Usage)(); + unsigned int Maximum; +#endif +{ + char ValueSpecified = 0; + + if ((argc < 3) || (argc > 5)) + { + (*Usage)(); + exit(1); + } + + for (; (++argv, --argc); ) + { + if ((Index < 0) && + (argv[0][0] == '-') && + (argv[0][1] == 'i')) + { + if ((++argv[0], *(++argv[0])) || (++argv, --argc)) + Index = parse_number(argv[0], Usage, 0xFFU); + else + { + (*Usage)(); + exit(1); + } + } + else if (Port < 0) + { + Port = parse_number(argv[0], Usage, 0xFFFFU); + } + else if (!ValueSpecified) + { + Value = parse_number(argv[0], Usage, Maximum); + ValueSpecified = 1; + } + else + { + (*Usage)(); + exit(1); + } + } + + if (!ValueSpecified) + { + (*Usage)(); + exit(1); + } +} + +static void +#ifdef __STDC__ +do_inb +( + int argc, + char **argv +) +#else +do_inb(argc, argv) + int argc; + char **argv; +#endif +{ + input_parse(argc, argv, inb_usage); + + xf86EnableIO(); + + if (Index >= 0) + { + if (Port == 0x03C0U) + { /* Attribute Controller is different */ + unsigned short gens1; + + gens1 = ((inb(0x03CCU) & 0x01U) << 5) + 0x03BA; + (void) inb(gens1); + Index = (Index & 0x1FU) | 0x20U; + } + outb(Port, Index); + Port++; + } + Value = inb(Port); + + xf86DisableIO(); + + printf("0x%02X\n", Value); +} + +static void +#ifdef __STDC__ +do_inw +( + int argc, + char **argv +) +#else +do_inw(argc, argv) + int argc; + char **argv; +#endif +{ + input_parse(argc, argv, inw_usage); + + xf86EnableIO(); + + if (Index >= 0) + { + outb(Port, Index); + Port++; + } + Value = inw(Port); + + xf86DisableIO(); + + printf("0x%04X\n", Value); +} + +static void +#ifdef __STDC__ +do_inl +( + int argc, + char **argv +) +#else +do_inl(argc, argv) + int argc; + char **argv; +#endif +{ + input_parse(argc, argv, inl_usage); + + xf86EnableIO(); + + if (Index >= 0) + { + outb(Port, Index); + Port++; + } + Value = inl(Port); + + xf86DisableIO(); + + printf("0x%08X\n", Value); +} + +static void +#ifdef __STDC__ +do_outb +( + int argc, + char **argv +) +#else +do_outb(argc, argv) + int argc; + char **argv; +#endif +{ + output_parse(argc, argv, outb_usage, 0xFFU); + + xf86EnableIO(); + + if (Index >= 0) + { + if (Port == 0x03C0U) + { /* Attribute controller is different */ + unsigned short gens1; + + gens1 = ((inb(0x03CCU) & 0x01U) << 5) + 0x03BA; + (void) inb(gens1); + outb(0x03C0U, (Index & 0x1FU) | 0x20U); + } + else + { + outb(Port, Index); + Port++; + } + } + outb(Port, Value); + + xf86DisableIO(); + +} + +static void +#ifdef __STDC__ +do_outw +( + int argc, + char **argv +) +#else +do_outw(argc, argv) + int argc; + char **argv; +#endif +{ + output_parse(argc, argv, outw_usage, 0xFFFFU); + + xf86EnableIO(); + + if (Index >= 0) + { + outb(Port, Index); + Port++; + } + outw(Port, Value); + + xf86DisableIO(); + +} + +static void +#ifdef __STDC__ +do_outl +( + int argc, + char **argv +) +#else +do_outl(argc, argv) + int argc; + char **argv; +#endif +{ + output_parse(argc, argv, outl_usage, 0xFFFFFFFFU); + + xf86EnableIO(); + + if (Index >= 0) + { + outb(Port, Index); + Port++; + } + outl(Port, Value); + + xf86DisableIO(); + +} + +static void +usage +( +#ifdef __STDC__ + void +#endif +) +{ + inb_usage(); + inw_usage(); + inl_usage(); + outb_usage(); + outw_usage(); + outl_usage(); + exit(1); +} + +int +#ifdef __STDC__ +main +( + int argc, + char **argv +) +#else +main(argc, argv) + int argc; + char **argv; +#endif +{ + struct + { + char *Name; +#ifdef __STDC__ + void (* Function)(int, char **); +#else + void (* Function)(); +#endif + } + *Function_Entry, Function_Table[] = + { + {"inb", do_inb}, + {"inw", do_inw}, + {"inl", do_inl}, + {"outb", do_outb}, + {"outw", do_outw}, + {"outl", do_outl}, +#ifdef __STDC__ + {(char *)0, (void (*)(int, char **))usage} +#else + {(char *)0, usage} +#endif + }; + + /* Get name by which we were invoked */ + for (MyName = argv[0]; argv[0][0]; ) + if (*(argv[0]++) == '/') + MyName = argv[0]; + + /* Look up name in table and call corresponding function */ + for (Function_Entry = Function_Table; + Function_Entry->Name && + strcmp(MyName, Function_Entry->Name); + Function_Entry++); + (*Function_Entry->Function)(argc, argv); + + return (0); +} + |