Hello, Vadim! You wrote to Dmitriy Malugin on Sun, 10 Aug 2003 12:25:58 +0400:
DM>> Бл$$$$, пардон, но я не выдержал. А КАК ты обработаешь случай, DM>> когда ISA обратилась, например, к памяти ?? Будет -IOR = 1 и -IOW DM>> = DM>> 1, твой девайс подумает, что происходит ЗАПИСЬ !!!!!
VT> Hо ситуации, когда -IOR=0 и -IOW=0, не бывает ?
Теоретически может быть во время цикла ПДП.
VT> Хорошо. Hо почему тогда периодически вместо 0x00F0 (см. схему) VT> компьютер считывает с карты 0x00FF ? Ведь отслеживаемая линия-то - VT> -IOR...
Скорее всего ты насел на чьи-то адреса и на шине данных идёт драка.
VT>>>>> но всё равно - почему, если я _только_ пишу в карту (в цикле), VT>>>>> то вводимое значение на индикаторе еле-еле мерцает. При чтении VT>>>>> порою считывается число 0x00FF ?
IT>>>> Потому что в этот регистр пишут все, кому не лень, VT>>> неправда. Только при обращении к карте.
DM>> Представь обрвщение к ПАМЯТИ по адресам 0xXX3FC-0xXX3FF. DM>> Как твой девайс отличит это от IO ?!!
VT> Опять же - моя схема при активизации -IOR выдаёт в комп. данные. VT> Почему порою считывается 0x00F0 ? От того, что я не слежу за -IOW, VT> это не зависит.
Знацит так. Шины, они разные бывают. Бывают с указателем направления DIR и одним стробом. Бывают с указателями типа цикла (ввод/вывод/передача вектора) и стробом цикла SYNC (и с стробом отклика RPLY). И т.д. В любом случае нужно разобраться: при какой комбинации сигналов что мы делаем. Или не делаем. Для 8-ми битной ISA при в/в используются следующие сигналы: A0:A9 (+A10:A15 - см.ниже) AEN IOW IOR DRQn DACKn IRQn
При совпадении адреса и сигнала AEN _или_ при наличии соответствующего DACK и _собственного_ запроса DRQ внешнее устройство имеет право обрабатывать IOR/IOW. Данные должны выставляться на шину по IOR, читаться по IOW. Чаще всего схема совпадения адреса вырабатывает сигнал разрешения для шинного формирователя, IOR заводят на его вход управления направлением передачи (в соответствующей полярности) и на вход разрешения соответствующего регистра (откуда мы собрались читать); IOW совместно с разрешением по адресу стробирует запись. Поскольку регистров обычно больше одного, то в сравнении адресов участвуют только старшие линии, младшие заводятся на дешифратор. Например: ======
+-----------+ +---o|E1 0|o---- ~OE0 | +--|E2 1|o---- ~OE1 | | | 2|o---- ~OE2 | | | 3|o---- ~OE3 A0----------(-(--|0 | A1----------(-(--|1 0|o---- ~STB0 | | | 1|o---- ~STB1 | | | 2|o---- ~STB2 ~IOW--------(-+-o|E3 3|o---- ~STB3 ~CS----+---o|E4 | ^ | +-----------+ A2----+ | .. . | A9----+ | AEN---+ | | | | +-----------+ +---o|OE | ~IOR-------------|T | | | | | | | ======
DM>> Теперь, понятно ? DM>> Твой облом в том, что ты забыл, что ISA обслуживает не только IO, а DM>> ещё и память (и DMA, IRQ)
VT> Кстати, о IRQ. Алгоритм, если я не ощибаюсь, следующий:
VT> Дёргаем нужную нам линию IRQ на шине ISA. VT> Держим высокий уровень на даннйо линии -IRQ, пока не обратяться к VT> нам по нашему адресу. VT> Так ?
Нет, не так. Держать до тех пор, пока твой девайс не сочтёт, что прерывание обработано.
VT> Hо откуда процессору при обработке прерывания знать, по какому VT> адресу доступна моя плата ? Тогда линия -IRQ будет активна, пока не VT> выключу компьютер...
А об этом драйвер должен знать, это его заботы. А потом он ещё должен сказать об этом контроллеру прерываний - дескать, всё, обработано.
VT> Объясните. Прочитал руководство с cepera.h1.ru и FAQ эхотага, но VT> вопросы остались.
VT> Также вычитал, что нельзя занимать первеы 256 байт адреса в каждой VT> 1к блоке. VT> Объясните поподробнее.
Подробнее - смотришь карту адресов из тичхелпа и выбираешь себе свободные. Кроме первого банка (те самые 256) - они должны жить на самой материнке, остальным низ-зя. Но учти: согласно стандарту в/в дешифрует только первые десять адресных линий. Т.е. всё адресное пространство в/в составляет 1к. Ты можешь занять свободный адрес в пределах этого "к" и все его "отражения" в старших блоках, но не занимай даже "отражений" уже занятых адресов. Иначе может получиться как с видеокарточкой S3 и COM3. карточка тихонько села где-то в старших адресах в/в, а COM3 говорит "не знаю я никаких A10..A15, это мои адреса". Это, кстати, тоже может быть причиной твоих неурядиц. К сожалению, задокументирован только младший блок, поэтому лучше включить в селектор адреса и старшие линии :-(.
With best regards, Alexander Derazhne.