// COM_INIT.C

/**
*.Name         com_init
*.Title        Инициализация асинхронного адаптера
*
*.Descr        Эта функция инициализирует асинхронные
*              адаптеры, задавая протокол обмена данными
*              и скорость обмена данными.
*
*.Proto        int com_init(AUX_MODE *mode, int port, int imask);
*
*.Params       AUX_MODE mode - структура, описывающая
*              протокол и режим работы порта;
*
*              int port - базовый адрес асинхронного адаптера:
*
*              int imask - значение для регистра маски
*                          прерываний
*
*.Return       0 - инициализация выполнена успешно;
*              1 - ошибки в параметрах инициализации.
*
*.Sample       aux_test.c
**/

#include <stdio.h>
#include <conio.h>
#include "sysp.h"
#include "uart_reg.h"


int com_init(AUX_MODE *mode, int port_adr, int imask) {

	unsigned div;
	char ctl;

// Вычисляем значение для делителя

	switch (mode->baud) {
		case 110: div = 1040; break;
		case 150: div = 768; break;
		case 300: div = 384; break;
		case 600: div = 192; break;
		case 1200: div = 96; break;
		case 2400: div = 48; break;
		case 4800: div = 24; break;
		case 9600: div = 12; break;
		case 19200: div = 6; break;
		case 38400: div = 3; break;
		case 57600: div = 2; break;
		case 115200: div =1; break;
		default: return(-1); break;
	}

// Записываем значение делителя частоты

	ctl = inp(port_adr+LCR_N);
	outp(port_adr+LCR_N, ctl | 0x80);

	outp(port_adr+ICR_N, (div >> 8) & 0x00ff);
	outp(port_adr, div & 0x00ff);

// Записываем новое управляющее слово

	outp(port_adr+LCR_N, mode->ctl_aux.ctl & 0x7f);

// Устанавливаем регистр управления прерыванием

	outp(port_adr+ICR_N, imask);

	return(0);
}

