информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаВсе любят медПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] com-порт/dos/обработка прерывания 30.04.03 15:33  Число просмотров: 1575
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Мало где документированная особенность. На сколько я
> понимаю - это не просто один из сигналов, которым должно
> быть можно пользоваться как хочешь, а, на самом деле
> нельзя, он управляет разрешением прерываний.

Да действительно в UART-е два метода запрещения прерываний: по маске в IER и сигналом OUT2 (иногда называют IE - interrupt enable)

> > У меня есть еще парочка вопросов:
> > - Есть какая-нибудь литература (сайт) по работе с
> > COM-портом

Вот вот собираемся запустить allserialports.com только все никак сайт нам не доделают. Сначала будет сыровато, но направленность именно такая будет.

> Я пользовался только HELPами, MANами и другими файловыми
> доками.

Я еще скачал пару спецификаций с сайтов разработчиков UART-ов. Там все очень хорошо написано. У многих разработчиков UART-ов есть расширения от стандартного 16550(A), но точно указывается что это только для данного железа и несовместимо со стандартным. Могу отмылить только скажи куда.

> У последовательных портов типа 16550А, именно А, есть
> очередь. То есть если байт не успели вытащить из регистра
> приемника, а по линии уже передан следующий, то при приеме
> нового, ни старый не забьется новым в регистре приемнике,
> ни новый не пропадет (встанет в очередь, попадет в регистр
> приемник и вызовет прерывание, как только будет завершена
> обработка предыдущего). Очередь до 16 событий по передаче и
> приему. Используется для повышения скорости и надежности
> связи. Информации о том как с очередью работать у меня нет.

Настроить FCR а потом прерывание придет только после того как FIFO заполнится до уровня выставленного в FCR: 1 - отключен, 4, 8 и 14 байт кажется. Ну и как обычно читать RBR до тех пор пока не сбросится флаг DR (Data Ready) в LSR. Названия регистров стандартные (найди любую доку - и возьми их смещения).

> > - Если под W2k писать драйвер - то с точки зрения
> > программирования аппаратной части разница есть
> > какая-нибудь.
Под 2к лучше не писать дривер с нуля, а взять DDK-шный сэмпл. Там очень хорошо все закомментировано и архитектура позволяет легко вносить изменения. Кроме того, реальный код, работающий с железом (особенно с хорошими комментариями) - лучшая дока по этому железу.

> > - Если тебе доводилось видеть комп с 10 COM портами (4
> > COM-порта на одном векторе прерывания), то проблем
> никаких
> > у тебя с ними не было ?

И кстати в сэмпле момент с мультипортовыми платами и расшаренными прерываниями тоже хорошо просматривается.
<programming>
[C++] com-порт/dos/обработка прерывания 19.04.03 13:59  
Автор: com10 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1. Хочу сделать обработку прерывания для COM порта,
чтобы, загрузившись с "голой" DOS дискеты, можно было юзать com-канал
(с учетом того, что может быть до 10 com портов на машине, т.е. требуется именно обработка прерываний, а
не простой анализ регистров порта)
Для инициализации порта делаю следующее (пишу на Borland C++ 3.0)

#define COM_1_INTERR 0x0C
#define COM_1_BASREG 0x3f8
#define init_com1_0_del 0x30
#define init_com1_1_del 0x00
#define init_com1_1_upr 0x0f
#define init_com1_3_nor 0x03
#define init_com1_3_inv 0x83
int old_seg_com1, old_ofs_com1;

// Мое прерывание для com порта
void interrupt COM_1 () {
cprintf ("\n\r Сработало прерывание"); // Используется для определения простого факта страбатывания прерывания
_asm {
mov al, 0x20
out 0x20, al
//out 0xa0, al
}
}



// Инциализация com порта
_asm { cli
mov ax, 0
mov tes, es
mov es, ax

mov ax, word ptr es:[COM_1_INTERR*4]
mov old_ofs_com1, ax
mov ax, word ptr es:[COM_1_INTERR*4+2]
mov old_seg_com1, ax

mov word ptr es:[COM_1_INTERR*4], offset COM_1
mov word ptr es:[COM_1_INTERR*4+2], seg COM_1

mov al, init_com1_3_inv
mov dx, COM_1_BASREG+3
out dx, al

mov al, init_com1_0_del
mov dx, COM_1_BASREG
out dx, al

mov al, init_com1_1_del
mov dx, COM_1_BASREG+1
out dx, al

mov al, init_com1_3_nor
mov dx, COM_1_BASREG+3
out dx, al

mov al, init_com1_1_upr
mov dx, COM_1_BASREG+1
out dx, al
///////////////////

mov ax, tes
mov es, ax
sti
}




2. Затем я посылаю в порт

_asm {
mov al, 1
mov dx, COM_1_BASREG
out dx, al
}


- и ожидаю, что сработает прерывание "по передаче байта" (выход порта никуда не заведен)
- еще я модем включал (подключенный к порту) - должно ли в этом случае срабатывать какое-нибудь прерывание

3. Почему не стабатывает мой обработчик прерывания ? Нужно ли как-то настраивать контроллер прерываний ?
Я пытался посылать в него:

in al, 21h
and al, 11100111b
out 21h,al

и

mov al, 0x20
out 0x20, al
out 0xa0, al

Но реакции никакой не было.
Заранее спасибо.
[C++] com-порт/dos/обработка прерывания 21.04.03 10:27  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Чтобы прерывания от СОМ порта происходили необходимо выполнить ряд следующих действий:
Запретить аппаратные прерывания на время модификации векторов прерываний и инициализации регистров порта.
Сесть на вектор прерываний (желательно сохранив старую точка входа).
Разрешить аппаратные прерывания в контроллере прерываний.
Установить параметры порта (скорость, размер, четность и др. адрес порта+0,+1,+3,+4)
Установить маску условий прерываний (прием/передача, изменение состояний модемных линий и др. адрес порта+1)
Разрешить прерывания от порта (адрес порта+4 бит знач. 0х08)
Ну, вроде, ни чего не забыл.
Не забудте про обработчик: порт сгенерит новое прерывание после того, как будет полностью обработано текущее, т.е. если принят байт, то его нужно считать, если прерывание произошло от изменения состояние модемных линий, то нужно прочитать их новое состояние.
Самая часто встречающаяся ошибка: Если прерывание произошло, то это от СОМ порта - нет, на этом прерывании может сидеть несколько устройств, сначала определите было ли это прерывание именно от этого порта, для которого написан обработчик - прочитайте interrupt identification register младший бит, если это прерывание не от вашего порта - передайте его на старый вектор. В конце обработки выдайте подтверждение обработки контроллеру обработки прерываний. Предыдущее состояние порта, маску контроллера прерываний, вектора надо сохранить, чтобы после слезания с прерывания все восстановить.
[C++] com-порт/dos/обработка прерывания 30.04.03 00:54  
Автор: com10 Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> Разрешить прерывания от порта (адрес порта+4 бит знач. 0х08)

Я, блин, неделю почти провозился, пока случайно не нарвался на этот факт (методом научного тыка). Я, кретин, невнимательно прочитал твое сообщение и даже не обратил внимание на этот пункт. И до сих пор понять не могу, какое отношение имеет линия OUT2 к прерыванию.

У меня есть еще парочка вопросов:
- Есть какая-нибудь литература (сайт) по работе с COM-портом
( В обычных учебниках по ассемблеру что-то мало информации. Я пользовался Зубковым "Ассемблер" - (кстати, и там этот пункт одной строкой прописан - я тоже внимание не обратил ;) ) )
- Настройка регистров+2 и +3 для метода FIFO - это что такое ?
- Если под W2k писать драйвер - то с точки зрения программирования аппаратной части разница есть какая-нибудь.
- Если тебе доводилось видеть комп с 10 COM портами (4 COM-порта на одном векторе прерывания), то проблем никаких у тебя с ними не было ?
[C++] com-порт/dos/обработка прерывания 30.04.03 10:51  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 30.04.03 11:03  Количество правок: 4
<"чистая" ссылка>
Во-первых - рад, что что-то получилось.

>
> > Разрешить прерывания от порта (адрес порта+4 бит
> знач. 0х08)
>
> Я, блин, неделю почти провозился, пока случайно не нарвался
> на этот факт (методом научного тыка). Я, кретин,
> невнимательно прочитал твое сообщение и даже не обратил
> внимание на этот пункт. И до сих пор понять не могу, какое
> отношение имеет линия OUT2 к прерыванию.
>

Мало где документированная особенность. На сколько я понимаю - это не просто один из сигналов, которым должно быть можно пользоваться как хочешь, а, на самом деле нельзя, он управляет разрешением прерываний.

> У меня есть еще парочка вопросов:
> - Есть какая-нибудь литература (сайт) по работе с
> COM-портом

Я пользовался только HELPами, MANами и другими файловыми доками.
Книжка по ассемблеру была, но куда-то делась, вроде как в книжке "С для профессионалов" что-то было, но, как правило, все кривое. Во всех доках ошибки найдуться.

> ( В обычных учебниках по ассемблеру что-то мало информации.
> Я пользовался Зубковым "Ассемблер" - (кстати, и там этот
> пункт одной строкой прописан - я тоже внимание не обратил
> ;) ) )
> - Настройка регистров+2 и +3 для метода FIFO - это что
> такое ?

У последовательных портов типа 16550А, именно А, есть очередь. То есть если байт не успели вытащить из регистра приемника, а по линии уже передан следующий, то при приеме нового, ни старый не забьется новым в регистре приемнике, ни новый не пропадет (встанет в очередь, попадет в регистр приемник и вызовет прерывание, как только будет завершена обработка предыдущего). Очередь до 16 событий по передаче и приему. Используется для повышения скорости и надежности связи. Информации о том как с очередью работать у меня нет.

> - Если под W2k писать драйвер - то с точки зрения
> программирования аппаратной части разница есть
> какая-нибудь.

Под Вин2к ничего не писал, но проблем может быть не мало. Если иметь всю документацию, то написать, естественно, можно.

> - Если тебе доводилось видеть комп с 10 COM портами (4
> COM-порта на одном векторе прерывания), то проблем никаких
> у тебя с ними не было ?

Такую плату видел только "в глаза", в руках держал, но программировать под нее не программировал. Думаю ничего сложного - соответственно в 10 раз увеличивается пул адресов портов. Чуть хуже если используется мультиплексирование - т.е. значение какого-то портика используется как номер одного из десяти ком-портов, для которого отображен этот маленький диапазон портов. И крайне редкая ситуация - когда адреса приемников-передатчиков для каждого - свои, а адреса портов настройки/управления - общие. Короче нужно читать доку от платы.
Главное прерывание произошло - проверить не от одного ли это из десяти портов по мл. биту регистра идентификации прерываний, если нет - то вообще передать прерывание дальше - это в ДОСе. В виндовсе все по другому должно быть. В оригинале на одном векторе сидят СОМ1 и СОМ3 (IRQ4), на другом СОМ2 и СОМ4 (IRQ3). От того, что их 10 суть не меняется, принципы одни и те же остаются. Да и вообше, когда пишешь любой обработчик, нужно понимать, что на одном векторе несколько устройств может сидеть. Это на IBM-PC/XT только не возможно было. А то я натыкался на проблемы, когда в терминальной программе мышкой работать нельзя было (СОМ1-мышь, СОМ3 - модем), а при выходе из терминальной программы мышь умирала. Видомо терминальная программа запрещала IRQ4 в контроллере прерываний при завершении работы.
[C++] com-порт/dos/обработка прерывания 30.04.03 15:33  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Мало где документированная особенность. На сколько я
> понимаю - это не просто один из сигналов, которым должно
> быть можно пользоваться как хочешь, а, на самом деле
> нельзя, он управляет разрешением прерываний.

Да действительно в UART-е два метода запрещения прерываний: по маске в IER и сигналом OUT2 (иногда называют IE - interrupt enable)

> > У меня есть еще парочка вопросов:
> > - Есть какая-нибудь литература (сайт) по работе с
> > COM-портом

Вот вот собираемся запустить allserialports.com только все никак сайт нам не доделают. Сначала будет сыровато, но направленность именно такая будет.

> Я пользовался только HELPами, MANами и другими файловыми
> доками.

Я еще скачал пару спецификаций с сайтов разработчиков UART-ов. Там все очень хорошо написано. У многих разработчиков UART-ов есть расширения от стандартного 16550(A), но точно указывается что это только для данного железа и несовместимо со стандартным. Могу отмылить только скажи куда.

> У последовательных портов типа 16550А, именно А, есть
> очередь. То есть если байт не успели вытащить из регистра
> приемника, а по линии уже передан следующий, то при приеме
> нового, ни старый не забьется новым в регистре приемнике,
> ни новый не пропадет (встанет в очередь, попадет в регистр
> приемник и вызовет прерывание, как только будет завершена
> обработка предыдущего). Очередь до 16 событий по передаче и
> приему. Используется для повышения скорости и надежности
> связи. Информации о том как с очередью работать у меня нет.

Настроить FCR а потом прерывание придет только после того как FIFO заполнится до уровня выставленного в FCR: 1 - отключен, 4, 8 и 14 байт кажется. Ну и как обычно читать RBR до тех пор пока не сбросится флаг DR (Data Ready) в LSR. Названия регистров стандартные (найди любую доку - и возьми их смещения).

> > - Если под W2k писать драйвер - то с точки зрения
> > программирования аппаратной части разница есть
> > какая-нибудь.
Под 2к лучше не писать дривер с нуля, а взять DDK-шный сэмпл. Там очень хорошо все закомментировано и архитектура позволяет легко вносить изменения. Кроме того, реальный код, работающий с железом (особенно с хорошими комментариями) - лучшая дока по этому железу.

> > - Если тебе доводилось видеть комп с 10 COM портами (4
> > COM-порта на одном векторе прерывания), то проблем
> никаких
> > у тебя с ними не было ?

И кстати в сэмпле момент с мультипортовыми платами и расшаренными прерываниями тоже хорошо просматривается.
[C++] Про serial.sys (семпл из DDK) 30.04.03 16:02  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
Там не все так хорошо как можно ожидать...
Сам нашел несколько глюков: залипания, ..., вплоть до "синего экрана".

Если интересно:
http://leo.yuriev.ru/SerialXP/index.htm
[C++] Да я в общем читал 30.04.03 17:21  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Там не все так хорошо как можно ожидать...
А я бы наоборот от мелкософта особой стабильности не ждал :-)))

> Сам нашел несколько глюков: залипания, ..., вплоть до
> "синего экрана".
>
> Если интересно:
> http://leo.yuriev.ru/SerialXP/index.htm
Но во первых для обучения человеку вполне достаточно будет БЕСПЛАТНОГО сэмпла из 2k DDK. А во вторых я конечно не производил полную ревизию этого сэмпла (вернее я производил ее с совершенно с другой целью). Даже больше скажу, помимо собственно мелкософтовских глюков, у меня осталось не меньше десятка спорных мест собственного сочинения, которые тоже при определенных обстоятельствах приведут к проблемам. Я их пометил TODO и занялся другими вещами.

Да еще. Чтоб не засорять программинг, напиши мне amirul@mail.ru
Как ты уже понял, мы собираемся организовать портал по ком-портам. Если интересно можно будет и твой продукт там положить
[C++] com-порт/dos/обработка прерывания 30.04.03 21:45  
Автор: com10 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1.) В общем-то у меня прерывания, вроде, заработали. Но есть интересный "трабл": если сначала запустить на "компе-А" "левую" (не мою) прогу, которая работает "не по прерываниям", а потом запустить на этом же компе мою прогу, работающую по прерываниям, то передача байтов происходит нормально, а вот в приеме данных на стороне "компа-А" начинает происходить потеря прерываний (байты принимаются "через один" или "принимется 12 байт и прерывания по-приему останавливаются"), при этом и на стороне "компа-В" (программа в котором остается прежней) тоже начинаются "глюки" - он принимает байт 0x0A, который никто ему не передает.
Если далее перегрузить "комп-А" (не перегружая "комп-В"), то все опять начинает работать нормально.

2.) Слышал, что в стандарте "Компьютер 2000" com-портов вообще нет ,- то есть их вроде как планируется "убрать как технолгию", заменив USB-портами всю из функциональность. Это действительно так ?

3.)
> Я еще скачал пару спецификаций с сайтов разработчиков UART-ов. Там все очень
> хорошо написано. У многих разработчиков UART-ов есть расширения от
> стандартного 16550(A), но точно указывается что это только для данного железа и
> несовместимо со стандартным. Могу отмылить только скажи куда.

2 amirul - invizibl3@tamb.ru (до 500 Кб)
[c++] com-порт/dos/обработка прерывания (заключительное) 07.05.03 10:27  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 07.05.03 16:39  Количество правок: 2
<"чистая" ссылка>
Re1): Нужно что-то еще инициализировать. Может ту же FIFO. Когда я какую-то программу, работающую с СОМ портами дизасемблировал, обнаружил, что она много чего с портом при инициализации ненужного/непонятного/загадочного делает. Разбираться с этим надо, но мне это не нужно было. Я для СОМ порта всего-ничего писал: помог другу досовскую факсовую программу написать, тормозилку для некоторых ДОС игрушек и програмку измерения скорости пули. В последней без СОМ порта тяжело, поскольку нужно две линии, которые прерывания вызывают, ЛПТ не подходил, а УСБ и все остальное - хитрое не ТТЛовсеое. Зато можно хоть скорость света мерить.

Re2): СОМ порты и ЛПТ порты, а также PS/2 порты мышки и мини-дин клавиатуры, а тем более старые АТ 5-пиновые порты клавиатуры уходят в прошлое, хотя большинство производителей плат продолжают поддерживать СОМ и ЛПТ порты. Есть только отдельные модели компьютеров одной фирмы, в которых всего вышеперечисленного нет. Там только УСБ и 1394 и ДиВиАй для монитора. Кнопки, мышь, принтер и все остальное через УСБ. Да, там еще и флопика нет. Флэш-кард-ридер стоит. Сейчас мы не очень-то переживаем, что ISA-шины на современных платах нет, уж год как точно нет. А всего пару лет назад была, и платы под ису были. А жаль, для самоделкиных с паяльником все тяжелее становится. Да, скоро и ИДЕ умрет, сериал-АТА только будет.

ВСЕ! Выложил все,что знал. Продолжать не буду. Ответил на все, что смог. Извиняюсь, если что лишнее. Очень рад, если помогло решить проблему.
[C++] FIFO инициализируется записью в FCR 07.05.03 13:44  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Как инициализируется UART и на фига нужны куча хитрых вызовов опять таки рекомендую DDK-шный сэмпл. Там все хорошо прокомментировано

ЗЫ: А насчет всего остального. UART конечно не сдастся сразу. Сначала из компов уйдет. Но микруха очень хорошая. Если свой девайс ваяешь, то одно дело один корпус добавить, а другое ваять поддержку usb, firewire или bluetooth.

Но это уже не программинг. Если продолжать обсуждение то предлагаю в миске
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach