Мы создаем простое приложение, которое открывает наш модуль и начинает бинарный отчет на штырьках с DO до D7.
Этот код компилируется с помощью дсс арр. с. По умолчанию программа собира¬ется в а. out.
арр. с
ООО //Приложение,
использующее драйвер параллельного порта
#include finclude 004 #include "parll.h"
main() {
int fptr;
int i,retval,parm =0; printf("\nopening driver now"); 012 if((fptr = open("/dev/parll",0_WR0NLY))<0) {
printf ("\nopen failed, returned=?%d", fptr); exit(l);
}
018 {
020 021 022
024
for(i=0;i<0xff ;i++)
system!"sleep .2");
retval=ioctl(fptr,DATA_OUT,parm);
retval=ioctl(fptr,GET_STATUS,parm) ,
if(!(retval & 0x80)) printf("\nBusy signal count=%x",parm); if(retval & 0x40)
027 printf("\nAck signal count=%x",parm);
028 // if(retval & 0x20)
// printf("\nPaper end signal count=%x",parm); // if(retval & 0x10)
// printf("\nSelect signal count=%x",parm); // if(retval & 0x08)
033 // printf("\nError signal count=%x",parm); parm++;
}
038 close(fptr); }
Строка 4
Общий для приложения и драйвера заголовочный файл, содержащий главные макросы IOCTL для проверки типов.
Строка 12
Открытие драйвера для получения файлового описателя нашего модуля.
Строка 18
Вход в цикл.
Строка 20
Замедление цикла, чтобы мы могли увидеть огоньки и отсчет. Строка 21
Используя файловый указатель, посылаем команду DATA_OUT в модуль, который, в свою очередь, использует outb () для записи последних значащих 8 бит параметров для порта данных.
Строка 22
Чтение байта состояния с помощью ioctl с команды GET_STATUS. Строки 24-27
Смотрим интересующие нас биты. Обратите внимание, что Busy - это низкий ак¬тивный сигнал, поэтому, когда ввода-вывода нет, мы читаем его как true.
Строки 28-33
Эти строки вы сможете раскомментировать, когда захотите усовершенствовать ди¬зайн.
Строка 38
Закрытие модуля
Если вы собрали разъем, как показано на рис. 5.5, сигналы busy и аск посылаются, когда два значащих бита счетчика включены. Код приложения считывает эти биты и производит соответствующий вывод.
Мы осветили только основные элементы драйвера символьного устройства. Зная эти функции, легко проследить работу кода или создать собственный драйвер.