hov
Гость
|
|
« : 13-11-2004 15:39 » |
|
Есть программа под DOS (исходников нет), которая может работать с портами COM1-COM4. Причем она требует, чтобы адреса их были строго 3F8h, 2F8h, 3E8h, 2E8h и соотв. им прерывания IRQ4, IRQ3, IRQ9, IRQ5. Раньше когда импользовалась шина ISA все было в порядке. Но с переходом на PCI появилась следующая проблема.Со встроенные com1 и com2 все осталось по старому, а при добавлении мультипортовой карты, com3 и com4 назначается одно и тоже прерывание IRQ5 или IRQ9 (адреса остаются те же). Как добится того, чтобы имели 4 сom порта с указанными выше прерываниями и адресами?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #4 : 14-11-2004 22:24 » |
|
но по моему личному опыту: PCI карта использует только одно прерывание
RXL, ты не прав. PCI карты могут использовать до 4 линий прерываний. Только вот плата должна быть сделана под это.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
RXL
|
|
« Ответ #5 : 15-11-2004 06:44 » |
|
Lex, по тому так уклончивои писал, что точно не знаю. Помню только, что чипсеты типа 440 поддерживали всего 4 прерывания на PCI, - оттуда и выводы сделал.
hov, хотелось бы еще добавить, что если та программа работает в защищенном режиме, или определяет INT-вектор чтением непоследственно контроллера прерываний, то подмена не удастся. Может проще будет саму программу посмотреть? Если, конечно, знаешь что делать. Что за программа то?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #6 : 15-11-2004 07:47 » |
|
RXL, конечно нужно посмотреть программульку. А потом внести нужные изменения . Найти инициализацию, out port - imho, должно заработать
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|