Структура для устройства tty
#include <sys/io-char.h>
typedef struct ttydev_entry {
iofunc_attr_t attr;
iofunc_mount_t mount;
TTYPOWER power;
TTYWAIT *waiting_read;
TTYWAIT *waiting_write;
TTYWAIT *waiting_drain;
TTYWAIT *waiting_devctl;
int c_cflag;
int c_iflag;
int c_lflag;
int c_oflag;
volatile unsigned flags;
volatile unsigned xflags;
volatile unsigned eflags;
volatile unsigned lflags;
unsigned int bcnt;
unsigned int fwdcnt;
struct ttydev_entry *timer;
int timeout;
int timeout_reset;
union {
uint64_t tmrs;
struct {
char drn_tmr;
char tx_tmr;
char brk_tmr;
char dtr_tmr;
char spare_tmr;
char rsvd1;
char rsvd2;
char rsvd3;
} s;
} un;
pid_t brkpgrp;
pid_t huppid;
cc_t c_cc[NCCS];
unsigned char fifo;
unsigned char fwd;
unsigned char prefix_cnt;
unsigned char oband_data;
int highwater;
int baud;
struct winsize winsize;
TTYBUF obuf;
TTYBUF ibuf;
TTYBUF cbuf;
iofunc_notify_t notify[3];
struct ttydev_entry *extra;
TTYWAIT *waiting_open;
int linkid;
void *reserved2;
int (*io_devctlext)(resmgr_context_t *ctp, io_devctl_t *msg, iofunc_ocb_t *ocb);
char name[TTY_NAME_MAX];
} TTYDEV;
libio-char
Структура TTYDEV используется для обработки устройств, общих между драйвером и библиотекой io-char. Поля структуры включают:
- attr
- Атрибут менеджера ресурсов.
- mount
- Связано с информацией о менеджере ресурсов.
- power
- Атрибут управления питанием TTYPOWER.
- waiting_read
- Очередь TTYWAIT для хранения заблокированных клиентов, ожидающих чтения.
- waiting_write
- Очередь TTYWAIT для хранения заблокированных клиентов, ожидающих записи.
- waiting_drain
- Очередь TTYWAIT для хранения заблокированных клиентов, ожидающих опустошения.
- c_cflag
- Флаг termios, описывающий аппаратное управление терминалом.
- c_iflag
- Флаг termios, описывающий основные управляющие флаги ввода терминала.
- c_lflag
- Флаг termios, используемый для управления различными функциями терминала.
- c_oflag
- Флаг termios, описывающий основные управляющие флаги вывода терминала.
- flags
- В настоящее время определены следующие флаги:
- OHW_PAGED
- аппаратное управление потоком вывода (устанавливается io-char и используется драйвером).
- IHW_PAGED
- аппаратное управление потоком ввода включено; уровень заполнения буфера устройства достигнут, и устройство не хочет больше получать данные. Этот флаг также подает сигнал на линию RTS.
- OSW_PAGED
- программное управление потоком вывода включено; устройство не должно передавать данные (устанавливается io-char и используется драйвером).
- ISW_PAGED
- программное управление потоком ввода; уровень заполнения буфера устройства достигнут, и устройство не хочет больше принимать данные. Этот флаг также передает
VSTOP
. - EDIT_INSERT
- для режима редактирования. Режим вставки или набора зачеркнутого текста.
- EDIT_PREFIX
- для режима редактирования. Ищит клавиши редактирования, которые начинаются с фиксированного префикса
- OBAND_DATA
- указывает на доступность данных вне основного канала.
- LOSES_TX_INTR
- сообщает библиотеке символьных устройств (io-char), что устройство иногда не генерирует прерывания TX. Зная о недостатках аппаратуры, библиотека io-char будет принимать дополнительные меры предосторожности при передаче данных, используя внутренний таймер обратного отсчета для отслеживания времени между прерываниями TX. Если таймер истекает до того, как поступит следующее прерывание TX, библиотека io-char предполагает, что аппаратное обеспечение не смогло сгенерировать прерывание, и пытается передать больше данных, вызывая tto(). Если данные больше не передаются, таймер обратного отсчета не перезапускается.
- TIMER_ACTIVE
- используется io-char.
- TIMER_KEEP
- используется io-char.
- NOTTY
- используется PTY.
- NL_INSERT
- используется для уведомления приложения, если
\n
был заменен на \r
. - ISAPTY
- используется PTY.
- PTY_MASTER_ONLY
- используется PTY.
- LITERAL
- используется io-char.
- FIRST_TIME_ALONE
- используется io-char.
Флаги указывают, какое событие произошло. Затем драйвер отправляет событие в io-char.
В настоящее время определены следующие события: - EVENT_QUEUED
- присутствует событие, поставленное в очередь.
- EVENT_SIGINT
- был получен символ прерывания или событие "break".
- EVENT_SIGHUP
- управление задачами POSIX,
TTI_HANGUP
. - EVENT_SIGBRK
- управление задачами POSIX для
SIGBRK
отправляет SIGINT
. Это событие вызывается TTI_BREAK
, поэтому драйвер, вероятно, не нуждается в его обработке. - EVENT_TTO
- используется для вызова функции tto() в контексте потока для передачи данных. Обработчик прерываний может вернуть это событие вместо прямого вызова tto().
- EVENT_READ
- используется io-char.
- EVENT_WRITE
- вызывается драйвером. Разблокирует приложение, ожидающее записи, когда в выходном буфере есть место для приема символов.
- EVENT_DRAIN
- вызывается драйвером. Выходной буфер опустошён (разблокирует того, кто ожидает освобождения буфера устройства).
- EVENT_TIMEOUT
- используется io-char.
- EVENT_NOTIFY_INPUT
- уведомление о вводе (используется io-char). См. notify в TTYDEV.
- EVENT_NOTIFY_OUTPUT
- уведомление о выводе (используется io-char). См. notify в TTYDEV.
- EVENT_NOTIFY_OBAND
- драйвер уведомляет io-char, если доступны данные вне основного канала.
- EVENT_CARRIER
- генерируется
TTI_CARRIER
. - EVENT_SIGQUIT
- управление заданием, генерируется
TTI_QUIT
, чтобы уведомить о получении символа QUIT
. - EVENT_SIGSUP
- управление заданием, генерируемое
TTI_SUSP
, чтобы уведомить о получении символа SUSP
.
- xflags
-
- OSW_PAGED_OVERRIDE
- переопределяет
OSW_PAGED
, чтобы разрешить передачу управляемых символов в состоянии приостановки программного управления потоком. Этот флаг устанавливается функцией io-char, используется и очищается драйвером.
- eflags
- Флаг событий, расширение для флагов из переменной flags.
- lflags
- Флаг логирования.
- bcnt
- Внутренняя переменная io-char, используемая для определения количества байтов, необходимых для уведомления клиента о чтении.
- fwdcnt
- Внутренняя переменная io-char, используемая для определения количества "перенаправлений" (forward counts).
- timer
- timeout
- timeout_reset
- Используется io-char.
- tmrs
- Один из доступных таймеров, которые могут использоваться io-char.
- drn_tmr
- Таймер опустошения (drain timer).
- tx_tmr
- Таймер потери прерываний передачи. Включается с помощью
LOSES_TX_INTR
. Этот таймер вызывает tto(), чтобы обойти проблему с оборудованием, которое теряет прерывания передачи. - brk_tmr
- Break таймер. Используется только io-char для отправки "break"; вызывает tto(TTO_CTRL, dtrchg).
- dtr_tmr
- Таймер линии DTR. Используется io-char для установки линии DTR, т.е. генерирует
SIGHUP
и вызывает tto(TTO_CTRL, dtrchg). - spare_tmr
- Резервный таймер для использования только драйвером.
- dsr_tmr
- Таймер для драйвера на стороне устройства, где DSR является выходом.
- dcd_tmr
- Таймер для драйвера на стороне устройства, где DCD является выходом.
- rsvd3
- Зарезервировано для добавления дополнительных таймеров.
- brkpgrp
- huppid
- Используется io-char.
- c_cc
- Специальные управляющие символы POSIX.
- fifo
- Используется только драйвером.
- fwd
- Перенаправляющий символ, используемый io-char. Применяется с fwdcnt для реализации перенаправления, описанного в readcond().
- prefix_cnt
- Используется только io-char.
- oband_data
- Данные вне основного канала, устанавливаемые драйвером в intr.c. Приложение получает их из io-char через devctl().
- highwater
- Устанавливается драйвером и используется io-char для определения момента, когда нужно включить управление потоком. (Убедитесь, что это значение меньше размера входного буфера).
- baud
- Скорость передачи данных устройства (baud rate).
- winsize
- Используется только io-char.
- obuf
- Выходной буфер.
- ibuf
- Входной буфер.
- cbuf
- Канонический буфер.
- notify
- Массив из трех структур iofunc_notify_t, которые представляют (по порядку) список уведомлений для ввода, вывода и данные вне основного канала.
- notify[0] - уведомление для ввода, используемого io-char
- notify[1] - уведомления для вывода данных драйверу, используются в tto.c.
- notify[2] - уведомления для данных вне основного канала для драйвера, используются в intr.c.
- extra
- Используется для PTY.
- waiting_open
- Очередь TTYWAIT для заблокированных клиентов, ожидающих открытия.
- linkid
- Идентификатор, возвращаемый функцией resmgr_attach().
- reserved2
- Зарезервировано для использования io-char.
- io_devctlext
- Пользовательская команда devctl().
- name
- Имя устройства, например,
/dev/ser1
.
ЗОСРВ «Нейтрино»
TTYCTRL, TTI_*
Предыдущий раздел: Библиотека разработки драйверов символьных устройсв