Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с мультипортовой картой  (Прочитано 8896 раз)
0 Пользователей и 1 Гость смотрят эту тему.
hov
Гость
« : 13-11-2004 15:39 » new

Есть программа под DOS (исходников нет), которая может работать с портами COM1-COM4. Причем она требует, чтобы адреса их были строго 3F8h, 2F8h, 3E8h, 2E8h и соотв. им прерывания IRQ4, IRQ3, IRQ9, IRQ5.
Раньше когда импользовалась шина ISA все было в порядке. Но с переходом на PCI появилась следующая проблема.Со встроенные com1 и com2 все осталось по старому, а  при добавлении мультипортовой карты,  com3 и com4 назначается одно и тоже прерывание IRQ5 или IRQ9 (адреса остаются те же).
Как добится того, чтобы имели 4 сom порта с указанными выше прерываниями и адресами?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-11-2004 19:58 » 

Я не могу авторитетно сказать, но по моему личному опыту: PCI карта использует только одно прерывание и, похоже, оно не может пересекаться с ISA.
Попробуй сделать так: встроенные порты установи как COM1 (3F8) и COM3 (2F8) c общим прерыванием irq3, а на PCI карту назначть COM2 (3E8) и COM4 (2E8) с прерыванием irq4. Если прерывание не удастся указать в драйвере, то выставь в биосе на тот PCI слот, в котором стоит карта, iqr4.

Попробуй так. напиши о результате.

Т.к. к ассемьлеру тема не относится, то я переношу ее в железо.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
hov
Гость
« Ответ #2 : 14-11-2004 12:31 » 

Нужно чтобы порты COM3 и СОМ4, которые на мультикарте, использовали разные прерывания: СОМ3 - IRQ9, COM4 - IRQ5, а встроенные COM1 и COM2 - IRQ4 и IRQ3 соответсвенно. Именно так зашито в программе, по-другому она не понимает. Как это сделать?
Есть вариант написать программку на asm, которая при загрузке подменит в BIOS обработчик прерывания  и будет проверять, с какого именно порта пришло прерывание - с СОМ3 или СОМ4, и если что будет генерировать новое прерывание. Вопрос в том, будет ли это работать.
или еще вариант. может поискать мультикарты, в которых порты садятся на разные прерывания. Да кстати, когда вставляю в комп еще одну мультикарту, портам назначаются разные прерывания - IRQ5 и IRQ9 (если оба разрешены в BIOS), но базовые адреса у них другие. А программа трубет, чтобы COM3 имел адрес 3E8h, COM4 - 2E8h, а эти адреса как раз у портов первой мультикарты. Вот такая ситуация.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-11-2004 13:25 » 

Перехватить одни прерывание и съиммитировать другие можно.
Таблица прерываний в досе находится по адресу 0000:0000 в виде массива дальних адресов segment:offset. Контроллер прерываний обычно настроен так:
INT 08h..0Fh - irq 0..7
INT 70h..77h - irq 8..15
.
Тебе надо написать программку, которая установит свои обработчики на реальные INT, а затем провести ряд действий: освободить всю ненужную память и вызвать INT 27h.
При срабатывании прерывания тебе нужно определить какое именно устройство вызвало его и вызвать соотв. INT для той программы (проще это делать через jmp far).
Сложность может быть в том, что прерывания требуют подтверждения обработки. Это выполняется записью 20h в порт управления. Если контроллер у реального и иммитируемого прерывания один, то это прокатит. Если разные - могут быть проблемы. Тут ты уж сам почитай о работе контроллера.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #4 : 14-11-2004 22:24 » 

Цитата

но по моему личному опыту: PCI карта использует только одно прерывание

RXL, ты не прав. PCI карты могут использовать до 4 линий прерываний.
Только вот плата должна быть сделана под это.
Записан

Megabyte be with you!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 15-11-2004 06:44 » 

Lex, по тому так уклончивои писал, что точно не знаю. Помню только, что чипсеты типа 440 поддерживали всего 4 прерывания на PCI, - оттуда и выводы сделал.

hov, хотелось бы еще добавить, что если та программа работает в защищенном режиме, или определяет INT-вектор чтением непоследственно контроллера прерываний, то подмена не удастся. Может проще будет саму программу посмотреть? Если, конечно, знаешь что делать.
Что за программа то?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-11-2004 07:47 » 

RXL, конечно нужно посмотреть программульку. А потом внести нужные изменения Жаль. Найти инициализацию, out port - imho, должно заработать Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines