Библиотека сайта rus-linux.net
9 Программирование портов ввода/вывода
Обычно ПК имеет как минимум 2 последовательных и 1 параллельный интерфейс. Они являются специальными устройствами и отображаются следующим образом:
- /dev/ttyS0-/dev/ttySn: RS232 последовательные устройства 0-n, где n зависит от вашего аппаратного обеспечения.
- /dev/cua0-/dev/cuan: RS232 последовательные устройства 0-n, где n зависит от вашего аппаратного обеспечения.
- /dev/lp0-/dev/lpn: параллельные устройства 0-n, где n зависит от вашего аппаратного обеспечения.
- /dev/js0-/dev/jsn: джойстики 0-n, где n 0 или 1.
Разница между /dev/ttyS* и /dev/cua* в способе вызова open(). /dev/cua* предполагают использование как устройств вывода, и, как следствие, имеют другие установки по умолчанию относительно /dev/ttyS*. /dev/ttyS* инициализируются для входящих и выходящих сигналов. По умолчанию устройства являются управляющими устройствами для процесса, их открывающего. Обычно ioctl() обрабатывает все эти специальные устройства, однако POSIX предпочитает определение новых функций для асинхронных терминалов. Эти функции жестко привязаны к структуре termios. Оба варианта требуют подключения termios.h.
- Метод ioctl:
TCSBRK, TCSBRKP, TCGETA (get attributes: получить атрибуты), TCSETA (set attributes: установить атрибуты); Запросы управления вводом/выводом терминала (terminal I/O control: TIOC): TIOCGSOFTCAR ($get soft carrier$), TIOCSSOFTCAR ($setsoftcarrier$), TIOCSCTTY (set controlling tty: установка управления tty), TIOCMGET (get modemlines), TIOCMSET, TIOCGSERIAL, TIOCSSERIAL, TIOCSERCONFIG, TIOCSERGWILD, TIOCSERGSTRUCT, TIOCMBIS, TIOCMBIC, ... - Метод POSIX:
tcgetattr(), tcsetattr(), tcsendbreak(), tcdrain(), tcflush(), tcflow(), tcgetpgrp(), tcsetpgrp() cfsetispeed(), fgetispeed(), cfgetospeed(), cfsetispeed(), cfgetispeed(), cfsetospeed(), cfgetospeed() - Другие методы:
outb, inb для нестандартных устройств, например, для использования принтерного порта не для принтера.
- 9.1 Программирование мыши
- 9.2 Программирование модема
- 9.3 Программирование принтера
- 9.4 Программирование джойстика
9.1 Программирование мыши
Мышь подключается как к последовательному порту, так и напрямую к шине. Разные типы мышек посылают разные типы данных, что немного усложняет программирование. Однако, Эндрю Хэйлет (Andrew Haylett) был так добр, что поставил общий копирайт на свою программу selection, то есть вы можете использовать его функции работы с мышью. В этом руководстве вы найдете пре-релиз selection-1.8 с пометкой COPYRIGHT. Правда, X11 уже предложили удобный API мышки, поэтому программы Эндрю следует использовать только для не-X11 приложений. Из пакета selection вам потребуются только модули mouse.h и mouse.c.
Для получения событий от мыши вам необходимы ms_init() и get_ms_event(). ms_init() требует следующих 10 аргументов.
- int acceleration
Ускоряющий множитель. Если вы передвигаете курсор более, чем на delta пикселов, то движение ускоряется в зависимости от этого коэффициента. - int baud
Скорость передачи данных мыши (обычно 1200 bps) - int delta
Число пикселов, на которые сдвинется курсор, для активизации ускорения. - char *device
Имя устройства (например, /dev/mouse). - int toggle
Выключатель DTR, RTS или и DTR и RTS каналов мыши и модема при инициализации (обычно 0). - int sample
Разрешение мыши в dpi (обычно 100). - mouse_type mouse
Идентификатор присоединенной мыши, вроде P_MSC (Mouse Systems Corp.). - int slack
Если равно -1, то курсор застопоривается на границах экрана; при slack >=0 курсор выезжает с противоположной стороны, если он зашел за пределы на slack пикселов. - int maxx
Разрешение текущего терминала по x. Символы шрифта по умолчанию имеют ширину 10 пикселов, поэтому полный режим по x равен 10*80-1. - int maxy
Разрешение текущего терминала по y. Шрифт по умолчанию имеет символы высотой 12 пикселов, поэтому полное разрешение экрана по y 12*25-1 пиксел.
get_ms_event() нуждается только в указателе на структуру ms_event. Если get_ms_event() возвращает -1, то произошла ошибка. В случае успеха возвращается 0, а ms_event содержит текущее состояние мыши.
9.2 Программирование модема
Используйте Hayes Commands для управления модемом. Для контроля порта rs232 вам потребуется termios. Смотри пример miniterm.c.
9.3 Программирование принтера
Смотрите пример checklp.c. Не используйте termios для управления принтерного порта, пользуйтесь ioctl, inb/outnb, если необходимо, команды Epson, Postscript, PCL и т.д. в linux/lp.h вызовы ioctl: LPCHAR, LPTIME, LPABORT, LPSETIRQ, LPGETIRQ, LPWAIT inb и outb определяют статус и управляют портом.
9.4 Программирование джойстика
Смотрите пример js.c в модуле для джойстика пакета ядра. linux/joistick.h вызовы ioctl: JS_SET_CAL, JS_GET_CAL, JS_SET_TIMEOUT, JS_GET_TIMEOUT, JS_SET_TIMELIMIT, JS_GET_TIMELIMIT, JS_GET_ALL, JS_SET_ALL. Операция чтения /dev/jsn возвращает структуру JS_DATA_TYPE.