Предложения по реализации базового набора вызовов
для обмена по интерфейсу Э1КБ-PC.
-------------------------------------------------

Обмен со стороны Э1КБ.
----------------------

Данный набор вызовов обеспечивает самый нижний, "канальный"
уровень обмена и не предназначается для непосредственного
использования какими-либо драйверами устройств ОС ДЕМОС.
Предполагается, что на его основе будет
создаваться канальный драйвер следующего, более высокого уровня,
реализующего передачу и подтверждение заявок на обмен,
очереди заявок с различными приоритетами, мультиплексирование
приходящих заявок и т.п.

Укиверсальный канал.
--------------------

В ядре ОС ДЕМОС создается структура следующего вида:

struct {
	/* элементы, доступные извне */

	void (*init) ();        /* инициализация канала */
	void (*reset) ();       /* выключение канала при фатальной ошибке */
	void (*outb) ();        /* вывод байта в канал */

	/* внутренние переменные канала */

	int channel;            /* номер используемого УК */
	void (*inb) ();         /* вызов при приеме байта из канала */
	void (*error) ();       /* вызов при фатальной ошибке канала */
	...
} uc;

uc.init (channel, inproc, errproc)
int channel;            /* номер канала, 0-3 */
void (*inproc) ();      /* функция для приема байта */
void (*errproc) ();     /* вызов при фатальной ошибке канала */

Инициализация канала. Задание номера канала channel.
Задание функций приема байта и обработки фатальных ситуаций
uc.inb = inproc, uc.error = errproc.
Разрешение прерываний от канала.

uc.outb (byte)
int byte;               /* 10-битный байт для вывода в канал */

Вывод байта (10 бит) в канал. Ожидание квитанции от PC,
при необходимости - повтор. Если после некоторого числа попыток
(например, 100) байт передать не удалось, или долгое время
(например, 30 сек) нет квитанции, вызывается uc.error.

uc.reset ()

Обнуление канала, запрещение прерываний от канала.
Вызывается из uc.error в случае фатальной ошибки.

uc.inb (byte)
int byte;               /* 10-битный байт, принятый из канала */

Вызывается драйвером в случае успешного приема байта из канала.
Заметим, что вызов происходит при закрытых прерываниях,
поэтому данная функция должна производить минимум действий
(например, занесение байта в очередь на обработку).

uc.error (errval)
int errval;             /* код ошибки */

Вызывается драйвером в случае обнаружения фатальной ошибки
канала (например, неисправность аппаратуры).
Предполагается, что uc.error будет вызывать uc.reset для выключения
канала.

Возможные коды ошибок:
1) Нет квитанции от PC. PC долгое время не подтверждает прием байта.
2) Ошибка четности при передаче. От PC постоянно приходит квитанция
с ошибкой.
3) Ошибка четности при приеме. От PC постоянно приходят байты
с ошибкой четности.

Байтовый канал.
---------------

В ядре ОС ДЕМОС создается структура следующего вида:

struct {
	/* элементы, доступные извне */

	void (*init) ();        /* инициализация канала */
	void (*reset) ();       /* выключение канала при фатальной ошибке */
	void (*send) ();        /* передача массива */
	void (*recv) ();        /* прием массива */

	/* внутренние переменные канала */

	int channel;            /* номер используемого БК */
	void (*error) ();       /* вызов при фатальной ошибке канала */
	...
} bc;

bc.init (channel, errproc)
int channel;            /* номер канала, 0-3 */
void (*errproc) ();     /* вызов при фатальной ошибке канала */

Инициализация канала. Задание номера канала channel.
Задание функции обработки фатальных ситуаций bc.error = errproc.
Разрешение прерываний от канала.

bc.send (length, physaddr)
int length;             /* длина массива данных */
int physaddr;           /* собственно массив */

Передача данных по каналу.

bc.reset ()

Обнуление канала, запрещение прерываний от канала.
Вызывается из bc.error в случае фатальной ошибки.

bc.error (errval)
int errval;             /* код ошибки */

Вызывается драйвером в случае обнаружения фатальной ошибки
канала (например, неисправность аппаратуры).
Предполагается, что bc.error будет вызывать bc.reset для выключения
канала.
