пpямое пpогpаммиpование поpтов вода-вывода в FreeBSD (io raw example device)
Ключевые слова: io, raw, example, device, (найти похожие документы)
From : Valentin Davydov 2:5020/400 03 Mar 01 18:56:14
Subj : пpямое пpогpаммиpование поpтов вода-вывода в FreeBSD
-------------------------------------------------------------------------------
* Forwarded from area 'RU.UNIX.BSD'
>Столкнyлся с пpоблемой пpямого пpогpаммиpования поpтов вода-вывода в FreeBSD.
>Почитав этy эхy нашел что юто делается чеpе /dev/io, но ни написааное в эхе,
>ни написанное в man, ничего pезyльтатов непpинесло. Максимyм сего добился, так
>это чтобы пpогpамма не выпадала в коpy. Покажите на конкpетном пpимеpе как это
>делается. Hе дайте погибнyть.
Вот что у меня сейчас работает на лаптопе:
/* T P D U A L S C A N . C
Author: Michael Steiner
<steiner@acm.org> <sti@zurich.ibm.com>
http://www.zurich.ibm.com/pub/sti/www/info.html
Ported to FreeBSD: Valentin Davydov
<val@sqdp.trc-net.co.jp>
This program allows you to set videoram for IBM ThinkPads with dualscan
LCD screen (at least for the 750Cs and 5538-VWD but probably also for
others) to allow running XFree86 without patching it (normally you got
all twice if the upper 512K of videoram are not disabled).
Usage:
a) you run on the built-in monitor:
(1) run 'tpdualscan -d' as root
(2) start X (e.g with startx)
b) you run on an external monitor:
(1) run 'tpdualscan -e' as root
(2) start X (e.g with startx)
*/
void main (int argc, char *argv[]) {
unsigned long vgaIOBase;
int colorEmulation, dualScan, devIOHandle;
enum {enable, disable, status} mode = status;
unsigned char registr;
/* parse command line */
if ((argc > 2) || ((argc == 2) && (argv[1][0] != '-'))){
fprintf(stderr, "%sn", usage); exit(1);
}
if (argc == 2) {
switch (argv[1][1]) {
case 'h':
printf("%sndisable/enable upper 512K of VRAM for dual-scan
thinkpadsn", usage); exit(0);
case 'd': /* disable */
mode = disable; break;
case 'e': /* enable */
mode = enable; break;
case 's': /* status */
mode = status; break;
default:
fprintf(stderr, "invalid option %cn%sn", argv[1][1], usage);
exit(1);
}
}
/* enable direct ports I/O */
devIOHandle = open("/dev/io", O_RDONLY);
if (devIOHandle == -1){
fprintf(stderr, "%s: Can not get IO permission (%s)",
PROGNAME, strerror(errno));
exit(1);};
/* set vga IO base depend from color mode */
colorEmulation = inb(0x3CC) & 0x01;
if (!colorEmulation) {
fprintf(stderr, "you are not running a dual scan thinkpad n");
exit(1);
}
vgaIOBase = (colorEmulation) ? 0x3D0 : 0x3B0;
/* check if we have a dual-scan LCD */
outb(vgaIOBase + 4, 0x31);
dualScan = ((inb(vgaIOBase + 5) & 0xB) == 0); /* dual scan ==
(PR18[bit:3,1,0] = 0) */
if (!dualScan) {
fprintf(stderr, "you are not running a dual scan thinkpad n");
exit(1);
}
/* clear bit 6 to disable upper 512k The remaining 512Kbytes
of video memory are not disabled by clearing the bit, but it
is actually used as a shadow of first 512Kbyte */
outb(0x3CE, 0x0B);
registr = inb(0x3CF); /* PR1 */