Добрый день. Опробывал сегодня этот код на железке.
(сцылка на трэд: http://www.linux.org.ru/jump-message.jsp?msgid=1300647) Не работает :( Видимо в порт постоянно отсылается 0.
Почему, хрен его знает. То, что находится после:
while (EOF == (c = fgetc(stdin))) {
outb(0x0000, 0x378); }
вроде как вообще не выполняется :(
Из-за чего может быть?
#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>
#include <termios.h>
#include <fcntl.h>
#ifdef __sparc__
# error "This program can't compile or run on the Sparc platform"
#endif
#ifdef __alpha__
#include <sys/io.h> /* ioperm */
#endif
int main(int argc, char **argv)
{
int c;
struct termios tio;
tcflag_t old_lf;
long old_fl;
setuid(0);
old_fl = (long) fcntl(0, F_GETFL);
fcntl(0, F_SETFL, O_NONBLOCK);
tcgetattr(0, &tio);
old_lf = tio.c_lflag;
tio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &tio);
if (ioperm(0x378,1,1)) {printf("ioperm(): %s\n",strerror(errno)); exit(1);}
do {
while (EOF == (c = fgetc(stdin))) {
outb(0x0000, 0x378);
}
if (c==56) outb(0x0001, 0x378);
if (c==50) outb(0x0002, 0x378);
if (c==52) outb(0x0008, 0x378);
if (c==54) outb(0x0004, 0x378);
if (c==55) outb(0x0009, 0x378);
if (c==57) outb(0x0005, 0x378);
if (c==49) outb(0x0010, 0x378);
if (c==51) outb(0x0006, 0x378);
} while (c!=48);
tcgetattr(0, &tio);
tio.c_lflag = old_lf;
tcsetattr(0, TCSANOW, &tio);
fcntl(0, F_SETFL, old_fl);
return 0;
}
outb на быстром компе не каждым осциллографом увидишь.
я ж вам вчера говорил - добавляйте usleep() и если даже
что-то проверите и заработает, то дальше лучше будет
юзать parport_pc+ppdev.
А линукс и не обещает реалтайм из приложения ;)))
Критичные по времени вопросы надо разруливать в ядре
или своим драйвером или стандартными, которые я уже
назвал.