Перейти к содержимому

Фото
- - - - -

[c++] программирование IEEE1284 в стандарте posix


  • Вы не можете создать новую тему
  • Please log in to reply
5 ответов в этой теме

#1 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 13 Октябрь 2004 - 16:01

Вот такая проблемма
что послать строб на канал паралельного порта , надо было его открыть open (dev, O_RDWR), и если результат положительный то можно работать ( кстати а что такое O_RDWR ?, чето не нашел нигде)
потом надо ioctl (fd, PPWDATA, &bitpat ) ( как выясноилось PPWDATA запиывает на data0-data7, а bitpat числа 1 2 4 8 16 32 64 128 )( а fd это резельтат функции open)
теперь вопрос, а как считать например сигнал кончилась бумага, или ошибка печати , как считывать эти данные?
pprdata это считываение данных с тех же data0-data7 , но это для bidirection lpt. как быть ? есть какая-то функция PPRCONTROL, вроде то, но там сказано что bitpat определен в include/linux/parport.h а где это? хз
а еще PPRSTATUS , может кто знает что за что отвечает?

Сообщение изменено: libricon (13 Октябрь 2004 - 16:04 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#2 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 13 Октябрь 2004 - 16:16

так O_RDWR это открывает устройство как для чтения так и для записи, наверно вернее будет O_RDONLY !
странно что в man 2 ioctl_list нет ни слова про PPDEV ( linux/ppdev )
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#3 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 13 Октябрь 2004 - 16:54

Вот такая проблемма
что  послать строб на канал паралельного порта , надо было его открыть open (dev, O_RDWR), и если результат положительный то можно работать ( кстати а что такое O_RDWR ?, чето не нашел нигде)
потом надо ioctl (fd, PPWDATA, &bitpat ) ( как выясноилось PPWDATA запиывает на data0-data7, а bitpat числа 1 2 4 8 16 32 64 128 )( а fd это резельтат функции open)
теперь вопрос, а как считать например сигнал кончилась бумага, или ошибка печати , как считывать эти данные?
pprdata это считываение данных с тех же data0-data7 , но это для bidirection lpt. как быть ? есть какая-то функция PPRCONTROL, вроде то, но там сказано что bitpat определен  в include/linux/parport.h а где это? хз
а еще PPRSTATUS , может кто знает что за что отвечает?

Просмотреть сообщение


include/linux/parport.h -- это /usr/include/linux/parport.h

PPWDATA -- это "Parallel Port Write Data"
PPRCONTROL -- это "Parallel Port Read Control"
PPRSTATUS -- это "Parallel Port Read Status", соответственно, можно предположить, что она скорее всего выдает статус последней команды чтения из параллельного порта...
  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#4 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 13 Октябрь 2004 - 21:46

аха, спасибо за полнй путь, будем рыть в этом направлении, если не нарою, дам знать ;)
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#5 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 14 Октябрь 2004 - 23:52

гугл гордо молчит, все маны перерыл ничерта нет =(
не ясно какие именно эти bitpatы надо давать ему в аргумент функции для получения данных о статусе ( очевидно PPRSATUS это функция считывания данных с каалов статуса, нет бумаги, ошибка, принтер не готов и тд.)

хоть кто-нибуть помогите, если есть инфа дайте, или кто значом с программирование дров ол линукс, очень надо, сам я уже не могу ничего сделать, метод тыка не очень хочется применять, тк придется на каждый из потоков подовать 5 вольт
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#6 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 17 Октябрь 2004 - 16:54

ват нашел другой способ http://www.linux.org...rogramming.html
только не ясно, вот если часть кода будет использовать функцию ioctl , а часть кода будет через ioperm и функции ioput output, будет ли конфликт между ними?

а вот это вполне красноречиво
ssize_t write_printer (int fd, const void *ptr, size_t count)
{
ssize_t wrote = 0;

while (wrote < count) {
unsigned char status, control, data;
unsigned char mask = (PARPORT_STATUS_ERROR
| PARPORT_STATUS_BUSY);
unsigned char val = (PARPORT_STATUS_ERROR
| PARPORT_STATUS_BUSY);
struct ppdev_frob_struct frob;
struct timespec ts;

/* Wait for printer to be ready */
for (;;) {
ioctl (fd, PPRSTATUS, &status);

if ((status & mask) == val)
break;

ioctl (fd, PPRELEASE);
sleep (1);
ioctl (fd, PPCLAIM);
}

/* Set the data lines */
data = * ((char *) ptr)++;
ioctl (fd, PPWDATA, &data);

/* Delay for a bit */
ts.tv_sec = 0;
ts.tv_nsec = 1000;
nanosleep (&ts, NULL);

/* Pulse strobe */
frob.mask = PARPORT_CONTROL_STROBE;
frob.val = PARPORT_CONTROL_STROBE;
ioctl (fd, PPFCONTROL, &frob);
nanosleep (&ts, NULL);

/* End the pulse */
frob.val = 0;
ioctl (fd, PPFCONTROL, &frob);
nanosleep (&ts, NULL);

wrote++;
}

return wrote;
}

Сообщение изменено: libricon (17 Октябрь 2004 - 17:31 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!