Лажа с программированием IDE диском через порты

Тема в разделе "WASM.ELECTRONICS", создана пользователем tylerdurden, 28 сен 2005.

  1. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Хай уважаемый алл. Кто-нить юзал сабж ? У меня под виртуальной машиной все работает (PIO с использованием прерываний). На реальном же железе приходят "левые прерывания" - к примеру если на канале 1 устройство (0, к примеру) а я выставляю DEV в 1 (выбираю 1 устройство) то 0 начинает устанавливать флаги "за 1-е" - т.е. ведет себя как буд-то 1-е устройство существует... Причем в ответ на комманду вызываеться прерывание в котором бит ошибки не установлен (зато счетчик секторов не меняеться, т.е. небыло обработано ни одного сектора), ну это я положим отлавливаю сравнивая счетчик секторов с запросом. Но, затем в "один прекрасный момент" по запросу чтения-записи кластера (32 сектора к примеру) начинают приходить прерывания одно за одним в каждом счетчик секторов уменьшаеться на 1, ну хорошо, думал я, обрабатываешь по 1 сектору ? отловим и это. Но затем после того как все сектора вроде бы "обработаны" приходит еще 1 прерывание (а может и не одно - хз)... Причем бит ошибки ни в одном из этих прерываний не установлен. WTF ? Кто-нибудь сталкивался с такими проблеммами ? Причем это появляеться на разных дисках...
     
  2. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Очень мутно....

    Мои размышления, возможно где то рядом:

    - прерывание одно, а приводов может быть несколько(разруливать надо в обработчике);

    - доп.прерывания это возможно статусные, типа по окончании операции, по окончании "заглатывания" команды... типа "я понял, начинаю исполнять"...
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    В АТА нету регистра причины прерывания - 1, прерывание приходит только по окончанию комманды, или при ошибке - 2.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    tylerdurden

    Когда ты указываешь номер головки либо старшие биты номера сектора для LBA режима, ты бит dev случайно не сбрасываешь? После чтения сектора устройство должно установить бит 3 в регистре состояния, который сигнализирует о том, что у него есть данные.
     
  5. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Не сбрасываю. То что оно устанавливает мне по боку, у меня в прерывании считываеться (при записи, ясен пень, жду DRQ)
     
  6. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Вообщем в принципе понял в чем дело:

    Если убить прирывания вообще, и ждать готовности опросом флагов, то все работает на ура (есессно), но как только включаешь прерывания от ide (которые пусты кроме сброса запроса irq в устройстве и контроллере прерываний) то после прихода прерывания, устройство (на некоторое время) перестает сбрасывать флаг занятости и у меня срабаывают таймауты... Мож что-то еще надо делать в перрывании кроме вычитывания статусного регистра ?



    П.С. Есть мысль что при записи, после подачи комманды и установки устройством DRQ флага надо передать не все сектора сразу а частями (хз, макс кол-во секторов при групповых операциях - 256, сложно чтоли буффер под 256*512 байт было сделать ?).
     
  7. ABC

    ABC New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    92
    Совет тебе работай с портами!!! Могу дать примеры



    на ASM/DELPHI/PASCAL/C++



    NikNet@yandex.ru ;)
     
  8. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Кхе, кхе... Ты зачем это написал ? :)

    Я и так через порты работаю, ясен пень.

    Короче ошибка при записи происходит, т.е. после подачи комманды, надо ждать DRQ и отослать диску сектора. Если врубить прерывания то после этой комманды устройство некоторое время держит BSY и происходят таймауты (в доках пишут что если уст-во не занято выполнением комманды то в течении 400 нс. (после завершения предидущей комманды) оно должно освободить BSY)... Думаю что сектора надо слать не сразу все, а частями... А как ? И при чем тут прерывания - хз.