Инициализация COM порта в BIOS и DOS

Мониторы, принтеры, клавиатуры, колонки и другие устройства
Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 30.04.2019,17:41

Может кто-то сталкивался, как BIOS и MS-DOS находят Com-порт и назначают ему прерывание (Irq)?
Адрес порта находит сам биос, и показывает его при загрузке.
А вот с назначением прерывания вообще не понятно. Делает ли это биос, или уже ДОС? И как это делается?
Покопался в доступных исходниках биосов и MS-DOS. Вообще не нашел там похожих участков кода.

Вопрос возник в связи с тем, что сейчас работаю над ISA картой, которая должна "притворятся" Com-портом.
К сожалению, полностью скопировать порт не получится из-за аппаратных ограничений. Сейчас стоит Altera EPM3064.
Можно заменить на EPM3128, но потребуется переразводка и новая плата. Хотелось бы этого избежать.
Электронка: Изображение копия Изображение

pahan
Advanced Member
Сообщения: 4455
Зарегистрирован: 13.03.2015,14:23
Откуда: Химки, М.О.

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение pahan » 30.04.2019,18:15

DOS вообще ничего не находит, потому что не ищет ;) Он считывает адреса портов из bios data area, что вы туда запихнёте, то и будет считаться com1-4, lpt1-3.
Про bios надо уточнить, но няп, там просто захардкожены несколько стандартных адресов/номеров прерываний и идёт проверка, есть ли что-то на этих адресах (считывается с адреса число и сравнивается с тем, что туда ранее пытались записать).
Int 11h - определение конфигурации оборудования, надо его исходники смотреть.
А вот с назначением прерывания вообще не понятно. Делает ли это биос, или уже ДОС? И как это делается?
Записью битов в регистр IER (base+1). Делает это тот, кто хочет это использовать, т.е. ВАША программа. Биос и дос штатно прерывания для COM-портов НЕ используют.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 30.04.2019,19:32

pahan писал(а): 30.04.2019,18:15 Записью битов в регистр IER (base+1). Делает это тот, кто хочет это использовать, т.е. ВАША программа. Биос и дос штатно прерывания для COM-портов НЕ используют.
Есть программы диагностики, такие, как CheckIt, SysCheck и подобные, которые показывают, какие Irq заняты.
Когда подключена мультикарта, с настоящим Com-портом, то Irq4 занято за Com1, Irq3 за Com2, как и должно быть.
Те же Irq они показывают в свойствах Com порта.
Когда стоит моя самоделка, эти Irq свободны. В свойствах Com порта напротив Irq стоит "?".
Так что инициализация Irq за ком-портом имеет место быть.

До того, как программа начинает использовать Irq порты, там видимо стоит какая-то заглушка.
Но без неё и программа не может использовать Irq. Устройство не работает, как надо.
Электронка: Изображение копия Изображение

i8088
Advanced Member
Сообщения: 4383
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение i8088 » 30.04.2019,20:37

Rio444 писал(а): 30.04.2019,19:32 До того, как программа начинает использовать Irq порты, там видимо стоит какая-то заглушка.
Занятость прерывания можно попробовать определить, смотря, куда указывает вектор,
соответствующий аппаратному прерыванию.
А вот код заглушки из исходников AWARD, он посылает EOI контроллеру.

Код: Выделить всё


SPURIOUS_INT_HDLR PROC	FAR

		PUSH	DS
		PUSH	AX
		PUSH	CX

		ASSUME	DS:G_RAM		; N3.03
		MOV	AX,G_RAM
		MOV	DS,AX
		MOV	AL,0BH			;read ISR of first 8259
		OUT	A8259,AL
		NEWIODELAY
		IN	AL,A8259
		Newiodelay
		MOV	AH,AL
		OR	AL,AL			;IRQ0-IRQ7 in service ?
		JZ	SHORT SOFT_INT		;no, it's soft INT.

		test	al,100b			;IRQ 2(chain to 2nd 8259) ?
		jz	short Primary_Int	;no , it's by IRQ 0-7	   

	;Check if INT came by 2nd 8259
		MOV	AL,0BH			;read ISR of second 8259
		OUT	B8259,AL
		NEWIODELAY
		IN	AL,B8259
		Newiodelay
		MOV	CL,AL
		OR	AL,AL			;IRQ8-IRQ15 in service ?
		JZ	SHORT PRIMARY_INT			

ifndef		DONT_MASK_IRQ_FOR_SPURIOS	;R139
		IN	AL,B8259+1
		NEWIODELAY
		OR	AL,CL			;mask noise interrupt of
		OUT	B8259+1,AL		;2nd 8259
		NEWIODELAY
endif;		DONT_MASK_IRQ_FOR_SPURIOS	;R139

		MOV	AL,END_OF_INT		;send EOI
		OUT	B8259,AL
		JMP	SHORT SEND_PRIMARY_EOI

PRIMARY_INT:
		IN	AL,A8259+1
ifndef		DONT_MASK_IRQ_FOR_SPURIOS	;R139
		OR	AL,AH			;mask noise interrupt of
endif;		DONT_MASK_IRQ_FOR_SPURIOS	;R139
		NEWIODELAY			;1st 8259
		and	al,0FBh			;enable IRQ2 for slave 8259
		OUT	A8259+1,AL
SEND_PRIMARY_EOI:
		MOV	AL,20H			;send EOI
		NEWIODELAY
		OUT	A8259,AL
		JMP	SHORT SPUR_DONE

SOFT_INT:
		MOV	AH,0FFH

SPUR_DONE:
		MOV	INT_OCCUR_FLG,AH
		POP	CX
		POP	AX
		POP	DS

		IRET
SPURIOUS_INT_HDLR ENDP
Если обработчик вызвать программно, соответсствующим INT, то обработчик вернет 0FFh в AH.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 30.04.2019,21:46

i8088, узнать бы, как и кто определяет Irq.
Самый простой способ - в контроллере 8250 включается прерывание по опустошению буфера передатчика.
Т.к. буфер пустой, то 8250 сразу "дергает" прерывание. Этот способ применен здесь
Но, к сожалению, этот способ не помог. Irq не находится.
Есть и другие варианты. Но их довольно много, чтобы перепробовать все. И неизвестно, какие ещё проверки делает софт инициализации.
Электронка: Изображение копия Изображение

Аватара пользователя
uav1606
Advanced Member
Сообщения: 5969
Зарегистрирован: 16.01.2008,22:04
Откуда: Енакиево
Контактная информация:

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение uav1606 » 30.04.2019,23:57

Может кто-то сталкивался, как BIOS и MS-DOS находят Com-порт и назначают ему прерывание (Irq)?
Если говорить о старых материнках с мультикартами, то там IRQ вообще не назначается, оно задано аппаратно на мультикарте.
Но, к сожалению, этот способ не помог. Irq не находится.
Не находится чем? Насколько я понимаю, единственный способ узнать, какое прерывание использует 8250 - это "слушать" стандартные прерывания (IRQ 3 - INT 0Bh и IRQ 4 - INT 0Ch), делая что-то с 8250, как в том примере, что Вы привели. Соответственно, если Вы хотите изображать COM-порт, то Ваша плата должна делать то же самое - вызывать прерывание в тех же случаях, когда это делает 8250, плюс то же самое выдавать на порты. Ну или, если речь идёт о конкретном софте, тогда уже ориентироваться именно на него - потому что способов поиска нужного прерывания может быть море.
Т.е. если эта Ваша плата должна изображать COM-порт для какого-то специфического софта, его нужно дизассемблировать и посмотреть, как он там ищет COM-порты.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 01.05.2019,10:25

uav1606 писал(а): 30.04.2019,23:57 Т.е. если эта Ваша плата должна изображать COM-порт для какого-то специфического софта, его нужно дизассемблировать и посмотреть, как он там ищет COM-порты.
Ещё раз. С самого начала.
Com порты точно ищет БИОС.
Ищет и находит. При загрузке показывает, что нашел, и адрес найденного Com-порта.
Так и пишет "Serial port(s) 3F8" или "Serial port(s) 3F8,2F8".
Номер IRQ не показывает. Поэтому не понятно, кто его находит и назначает.
Но программы диагностики, запущенные из под DOS, показывают, что IRQ4 назначен за Com1 (когда стоит настоящая мультикарта).
Либо показывают "?" и свободное прерывание IRQ4 (когда стоит моя самоделка).
Программы диагностики сами прерывание Com порту не назначают.
Это делает либо Bios, либо DOS.
Вот и хочу выяснить, Bios это делает или DOS. И как именно.
uav1606 писал(а): 30.04.2019,23:57 Соответственно, если Вы хотите изображать COM-порт, то Ваша плата должна делать то же самое - вызывать прерывание в тех же случаях, когда это делает 8250, плюс то же самое выдавать на порты.
Это решение "в лоб". Контроллер Com-порта 8250 имеет около десятка событий, которые могут вызвать прерывание.
Уместить все варианты в примененную EPM3064 невозможно. Нужно брать более сложную CPLD - EPM3128 и изготавливать новую плату.
Но крайне маловероятно, что процедура, определяющая Irq Com-порта проверяет все возможные варианты возникновения прерывания.

P.S. Если Вы не знаете ответа на вопрос, или где его можно найти - не парьтесь. Я уже 3 дня не могу это сделать.
Даже просто узнать, Bios назначает Irq или DOS.
Электронка: Изображение копия Изображение

i8088
Advanced Member
Сообщения: 4383
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение i8088 » 01.05.2019,10:57

Rio444 писал(а): 01.05.2019,10:25 Но программы диагностики, запущенные из под DOS, показывают, что IRQ4 назначен за Com1 (когда стоит настоящая мультикарта).
Либо показывают "?" и свободное прерывание IRQ4 (когда стоит моя самоделка).
Вы можете посмотреть, какой вектор INT 0x1C 0x0C с/без мультикарты (и дизассемблировать процедуры). А Вы как то меняли вектор INT 0x1C 0x0C?
Если нет, то там универсальная заглушка (и заменять ее некому, тк устройство нестандартное). Я думаю, DOS диагностические программы
не делают вообще ничего аппаратного-зависимого, возможно лишь за исключением хорошо известных стандартных устройств (это невозможно
в принципе для разнообразных карт). Надо только правильно определить стоит заглушка или полноценный обработчик.
Последний раз редактировалось i8088 01.05.2019,14:14, всего редактировалось 1 раз.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 01.05.2019,11:07

i8088, я это всё могу проделать. Но чем это поможет??

INT 0x1C я не менял. Это делает софт. Он стандартный и не мною написанный.
Электронка: Изображение копия Изображение

Аватара пользователя
uav1606
Advanced Member
Сообщения: 5969
Зарегистрирован: 16.01.2008,22:04
Откуда: Енакиево
Контактная информация:

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение uav1606 » 01.05.2019,12:14

i8088, а что за 1Ch?
Rio444, я не совсем понимаю, что Вы подразумеваете под словом "назначает". Прерывания для COM на не-PnP системах не назначается, оно определяется физически тем, какая линия с мультикарты заведена на контроллер прерываний через шину ISA.
CheckIt, вполне возможно, просто вешается на стандартные для COM1/2 прерывания и слушает их, делая что-то с портами, чтобы вызвать это самое прерывание.
Во всяком случае, при выборе в нём Interrupts из меню срабатывает ловушка IRQ 4 в эмуляторе SPC/XT.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 26861
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону

Вклад в сообщество

Инициализация COM порта в BIOS и DOS

Сообщение Rio444 » 01.05.2019,12:25

uav1606, я не совсем точно выразился.
Да, естественно, аппаратное прерывание (Irq4) не зависит от софта. Само устройство "дергает" его.
Под назначением прерывания, я имел в виду назначение программного обработчика аппаратного прерывания.
По адресу 0x1C 0Ch он и находится для Irq4.
Дополнительно это аппаратное прерывание должно быть размаскировано в PIC-контроллере.
Чтобы выполнить вышеуказанные действия, система тестирует COM-порт, искусственно вызывая аппаратное прерывание.
Если прерывание не получено (или что-то не сходится), то прерывание не размаскировывается в PIC-контроллере.
Сейчас именно так и происходит.
Либо используется другой способ идентификации аппаратного прерывания (не по опустошению передающего буфера),
либо я где-то ошибся. И моё устройство неправильно реагирует. Либо выполняются ещё какие-то проверки.
Можно 100% имитировать COM-порт. Но имеющееся аппаратное обеспечение это не позволяет. Только упрощенная имитация.
Вот и нужно понять, что нужно обязательно, а что можно упростить.
Я уже заказал EPM3128.
Но с учетом времени на пересыл, плюс разработка и заказ новой печатной платы - месяц-полтора.
Электронка: Изображение копия Изображение

Ответить