Хай уважаемый алл. Кто-нить юзал сабж ? У меня под виртуальной машиной все работает (PIO с использованием прерываний). На реальном же железе приходят "левые прерывания" - к примеру если на канале 1 устройство (0, к примеру) а я выставляю DEV в 1 (выбираю 1 устройство) то 0 начинает устанавливать флаги "за 1-е" - т.е. ведет себя как буд-то 1-е устройство существует... Причем в ответ на комманду вызываеться прерывание в котором бит ошибки не установлен (зато счетчик секторов не меняеться, т.е. небыло обработано ни одного сектора), ну это я положим отлавливаю сравнивая счетчик секторов с запросом. Но, затем в "один прекрасный момент" по запросу чтения-записи кластера (32 сектора к примеру) начинают приходить прерывания одно за одним в каждом счетчик секторов уменьшаеться на 1, ну хорошо, думал я, обрабатываешь по 1 сектору ? отловим и это. Но затем после того как все сектора вроде бы "обработаны" приходит еще 1 прерывание (а может и не одно - хз)... Причем бит ошибки ни в одном из этих прерываний не установлен. WTF ? Кто-нибудь сталкивался с такими проблеммами ? Причем это появляеться на разных дисках...
Очень мутно.... Мои размышления, возможно где то рядом: - прерывание одно, а приводов может быть несколько(разруливать надо в обработчике); - доп.прерывания это возможно статусные, типа по окончании операции, по окончании "заглатывания" команды... типа "я понял, начинаю исполнять"...
В АТА нету регистра причины прерывания - 1, прерывание приходит только по окончанию комманды, или при ошибке - 2.
tylerdurden Когда ты указываешь номер головки либо старшие биты номера сектора для LBA режима, ты бит dev случайно не сбрасываешь? После чтения сектора устройство должно установить бит 3 в регистре состояния, который сигнализирует о том, что у него есть данные.
Не сбрасываю. То что оно устанавливает мне по боку, у меня в прерывании считываеться (при записи, ясен пень, жду DRQ)
Вообщем в принципе понял в чем дело: Если убить прирывания вообще, и ждать готовности опросом флагов, то все работает на ура (есессно), но как только включаешь прерывания от ide (которые пусты кроме сброса запроса irq в устройстве и контроллере прерываний) то после прихода прерывания, устройство (на некоторое время) перестает сбрасывать флаг занятости и у меня срабаывают таймауты... Мож что-то еще надо делать в перрывании кроме вычитывания статусного регистра ? П.С. Есть мысль что при записи, после подачи комманды и установки устройством DRQ флага надо передать не все сектора сразу а частями (хз, макс кол-во секторов при групповых операциях - 256, сложно чтоли буффер под 256*512 байт было сделать ?).
Кхе, кхе... Ты зачем это написал ? Я и так через порты работаю, ясен пень. Короче ошибка при записи происходит, т.е. после подачи комманды, надо ждать DRQ и отослать диску сектора. Если врубить прерывания то после этой комманды устройство некоторое время держит BSY и происходят таймауты (в доках пишут что если уст-во не занято выполнением комманды то в течении 400 нс. (после завершения предидущей комманды) оно должно освободить BSY)... Думаю что сектора надо слать не сразу все, а частями... А как ? И при чем тут прерывания - хз.