Инициализация COM порта в BIOS и DOS
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Может кто-то сталкивался, как BIOS и MS-DOS находят Com-порт и назначают ему прерывание (Irq)?
Адрес порта находит сам биос, и показывает его при загрузке.
А вот с назначением прерывания вообще не понятно. Делает ли это биос, или уже ДОС? И как это делается?
Покопался в доступных исходниках биосов и MS-DOS. Вообще не нашел там похожих участков кода.
Вопрос возник в связи с тем, что сейчас работаю над ISA картой, которая должна "притворятся" Com-портом.
К сожалению, полностью скопировать порт не получится из-за аппаратных ограничений. Сейчас стоит Altera EPM3064.
Можно заменить на EPM3128, но потребуется переразводка и новая плата. Хотелось бы этого избежать.
Адрес порта находит сам биос, и показывает его при загрузке.
А вот с назначением прерывания вообще не понятно. Делает ли это биос, или уже ДОС? И как это делается?
Покопался в доступных исходниках биосов и MS-DOS. Вообще не нашел там похожих участков кода.
Вопрос возник в связи с тем, что сейчас работаю над ISA картой, которая должна "притворятся" Com-портом.
К сожалению, полностью скопировать порт не получится из-за аппаратных ограничений. Сейчас стоит Altera EPM3064.
Можно заменить на EPM3128, но потребуется переразводка и новая плата. Хотелось бы этого избежать.
Электронка: копия
-
- Advanced Member
- Сообщения: 4455
- Зарегистрирован: 13.03.2015,14:23
- Откуда: Химки, М.О.
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
DOS вообще ничего не находит, потому что не ищет Он считывает адреса портов из bios data area, что вы туда запихнёте, то и будет считаться com1-4, lpt1-3.
Про bios надо уточнить, но няп, там просто захардкожены несколько стандартных адресов/номеров прерываний и идёт проверка, есть ли что-то на этих адресах (считывается с адреса число и сравнивается с тем, что туда ранее пытались записать).
Int 11h - определение конфигурации оборудования, надо его исходники смотреть.
Про bios надо уточнить, но няп, там просто захардкожены несколько стандартных адресов/номеров прерываний и идёт проверка, есть ли что-то на этих адресах (считывается с адреса число и сравнивается с тем, что туда ранее пытались записать).
Int 11h - определение конфигурации оборудования, надо его исходники смотреть.
Записью битов в регистр IER (base+1). Делает это тот, кто хочет это использовать, т.е. ВАША программа. Биос и дос штатно прерывания для COM-портов НЕ используют.А вот с назначением прерывания вообще не понятно. Делает ли это биос, или уже ДОС? И как это делается?
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Есть программы диагностики, такие, как CheckIt, SysCheck и подобные, которые показывают, какие Irq заняты.
Когда подключена мультикарта, с настоящим Com-портом, то Irq4 занято за Com1, Irq3 за Com2, как и должно быть.
Те же Irq они показывают в свойствах Com порта.
Когда стоит моя самоделка, эти Irq свободны. В свойствах Com порта напротив Irq стоит "?".
Так что инициализация Irq за ком-портом имеет место быть.
До того, как программа начинает использовать Irq порты, там видимо стоит какая-то заглушка.
Но без неё и программа не может использовать Irq. Устройство не работает, как надо.
Электронка: копия
-
- Advanced Member
- Сообщения: 4383
- Зарегистрирован: 30.01.2015,17:06
- Откуда: г. Баку, Азербайджан
-
Конкурсы
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Занятость прерывания можно попробовать определить, смотря, куда указывает вектор,
соответствующий аппаратному прерыванию.
А вот код заглушки из исходников 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
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
i8088, узнать бы, как и кто определяет Irq.
Самый простой способ - в контроллере 8250 включается прерывание по опустошению буфера передатчика.
Т.к. буфер пустой, то 8250 сразу "дергает" прерывание. Этот способ применен здесь
Но, к сожалению, этот способ не помог. Irq не находится.
Есть и другие варианты. Но их довольно много, чтобы перепробовать все. И неизвестно, какие ещё проверки делает софт инициализации.
Самый простой способ - в контроллере 8250 включается прерывание по опустошению буфера передатчика.
Т.к. буфер пустой, то 8250 сразу "дергает" прерывание. Этот способ применен здесь
Но, к сожалению, этот способ не помог. Irq не находится.
Есть и другие варианты. Но их довольно много, чтобы перепробовать все. И неизвестно, какие ещё проверки делает софт инициализации.
Электронка: копия
- uav1606
- Advanced Member
- Сообщения: 5969
- Зарегистрирован: 16.01.2008,22:04
- Откуда: Енакиево
- Контактная информация:
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Если говорить о старых материнках с мультикартами, то там IRQ вообще не назначается, оно задано аппаратно на мультикарте.Может кто-то сталкивался, как BIOS и MS-DOS находят Com-порт и назначают ему прерывание (Irq)?
Не находится чем? Насколько я понимаю, единственный способ узнать, какое прерывание использует 8250 - это "слушать" стандартные прерывания (IRQ 3 - INT 0Bh и IRQ 4 - INT 0Ch), делая что-то с 8250, как в том примере, что Вы привели. Соответственно, если Вы хотите изображать COM-порт, то Ваша плата должна делать то же самое - вызывать прерывание в тех же случаях, когда это делает 8250, плюс то же самое выдавать на порты. Ну или, если речь идёт о конкретном софте, тогда уже ориентироваться именно на него - потому что способов поиска нужного прерывания может быть море.Но, к сожалению, этот способ не помог. Irq не находится.
Т.е. если эта Ваша плата должна изображать COM-порт для какого-то специфического софта, его нужно дизассемблировать и посмотреть, как он там ищет COM-порты.
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Ещё раз. С самого начала.
Com порты точно ищет БИОС.
Ищет и находит. При загрузке показывает, что нашел, и адрес найденного Com-порта.
Так и пишет "Serial port(s) 3F8" или "Serial port(s) 3F8,2F8".
Номер IRQ не показывает. Поэтому не понятно, кто его находит и назначает.
Но программы диагностики, запущенные из под DOS, показывают, что IRQ4 назначен за Com1 (когда стоит настоящая мультикарта).
Либо показывают "?" и свободное прерывание IRQ4 (когда стоит моя самоделка).
Программы диагностики сами прерывание Com порту не назначают.
Это делает либо Bios, либо DOS.
Вот и хочу выяснить, Bios это делает или DOS. И как именно.
Это решение "в лоб". Контроллер Com-порта 8250 имеет около десятка событий, которые могут вызвать прерывание.
Уместить все варианты в примененную EPM3064 невозможно. Нужно брать более сложную CPLD - EPM3128 и изготавливать новую плату.
Но крайне маловероятно, что процедура, определяющая Irq Com-порта проверяет все возможные варианты возникновения прерывания.
P.S. Если Вы не знаете ответа на вопрос, или где его можно найти - не парьтесь. Я уже 3 дня не могу это сделать.
Даже просто узнать, Bios назначает Irq или DOS.
Электронка: копия
-
- Advanced Member
- Сообщения: 4383
- Зарегистрирован: 30.01.2015,17:06
- Откуда: г. Баку, Азербайджан
-
Конкурсы
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
Вы можете посмотреть, какой вектор INT 0x1C 0x0C с/без мультикарты (и дизассемблировать процедуры). А Вы как то меняли вектор INT 0x1C 0x0C?
Если нет, то там универсальная заглушка (и заменять ее некому, тк устройство нестандартное). Я думаю, DOS диагностические программы
не делают вообще ничего аппаратного-зависимого, возможно лишь за исключением хорошо известных стандартных устройств (это невозможно
в принципе для разнообразных карт). Надо только правильно определить стоит заглушка или полноценный обработчик.
Последний раз редактировалось i8088 01.05.2019,14:14, всего редактировалось 1 раз.
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
i8088, я это всё могу проделать. Но чем это поможет??
INT 0x1C я не менял. Это делает софт. Он стандартный и не мною написанный.
INT 0x1C я не менял. Это делает софт. Он стандартный и не мною написанный.
Электронка: копия
- uav1606
- Advanced Member
- Сообщения: 5969
- Зарегистрирован: 16.01.2008,22:04
- Откуда: Енакиево
- Контактная информация:
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
i8088, а что за 1Ch?
Rio444, я не совсем понимаю, что Вы подразумеваете под словом "назначает". Прерывания для COM на не-PnP системах не назначается, оно определяется физически тем, какая линия с мультикарты заведена на контроллер прерываний через шину ISA.
CheckIt, вполне возможно, просто вешается на стандартные для COM1/2 прерывания и слушает их, делая что-то с портами, чтобы вызвать это самое прерывание.
Во всяком случае, при выборе в нём Interrupts из меню срабатывает ловушка IRQ 4 в эмуляторе SPC/XT.
Rio444, я не совсем понимаю, что Вы подразумеваете под словом "назначает". Прерывания для COM на не-PnP системах не назначается, оно определяется физически тем, какая линия с мультикарты заведена на контроллер прерываний через шину ISA.
CheckIt, вполне возможно, просто вешается на стандартные для COM1/2 прерывания и слушает их, делая что-то с портами, чтобы вызвать это самое прерывание.
Во всяком случае, при выборе в нём Interrupts из меню срабатывает ловушка IRQ 4 в эмуляторе SPC/XT.
- Rio444
- Почётный пользователь
- Сообщения: 26861
- Зарегистрирован: 14.09.2014,19:11
- Откуда: Ростов-на-Дону
-
Вклад в сообщество
Инициализация COM порта в BIOS и DOS
uav1606, я не совсем точно выразился.
Да, естественно, аппаратное прерывание (Irq4) не зависит от софта. Само устройство "дергает" его.
Под назначением прерывания, я имел в виду назначение программного обработчика аппаратного прерывания.
По адресу 0x1C 0Ch он и находится для Irq4.
Дополнительно это аппаратное прерывание должно быть размаскировано в PIC-контроллере.
Чтобы выполнить вышеуказанные действия, система тестирует COM-порт, искусственно вызывая аппаратное прерывание.
Если прерывание не получено (или что-то не сходится), то прерывание не размаскировывается в PIC-контроллере.
Сейчас именно так и происходит.
Либо используется другой способ идентификации аппаратного прерывания (не по опустошению передающего буфера),
либо я где-то ошибся. И моё устройство неправильно реагирует. Либо выполняются ещё какие-то проверки.
Можно 100% имитировать COM-порт. Но имеющееся аппаратное обеспечение это не позволяет. Только упрощенная имитация.
Вот и нужно понять, что нужно обязательно, а что можно упростить.
Я уже заказал EPM3128.
Но с учетом времени на пересыл, плюс разработка и заказ новой печатной платы - месяц-полтора.
Да, естественно, аппаратное прерывание (Irq4) не зависит от софта. Само устройство "дергает" его.
Под назначением прерывания, я имел в виду назначение программного обработчика аппаратного прерывания.
По адресу 0x1C 0Ch он и находится для Irq4.
Дополнительно это аппаратное прерывание должно быть размаскировано в PIC-контроллере.
Чтобы выполнить вышеуказанные действия, система тестирует COM-порт, искусственно вызывая аппаратное прерывание.
Если прерывание не получено (или что-то не сходится), то прерывание не размаскировывается в PIC-контроллере.
Сейчас именно так и происходит.
Либо используется другой способ идентификации аппаратного прерывания (не по опустошению передающего буфера),
либо я где-то ошибся. И моё устройство неправильно реагирует. Либо выполняются ещё какие-то проверки.
Можно 100% имитировать COM-порт. Но имеющееся аппаратное обеспечение это не позволяет. Только упрощенная имитация.
Вот и нужно понять, что нужно обязательно, а что можно упростить.
Я уже заказал EPM3128.
Но с учетом времени на пересыл, плюс разработка и заказ новой печатной платы - месяц-полтора.
Электронка: копия