Чтение секторов SATA HDD

Тема в разделе "WASM.ASSEMBLER", создана пользователем dess, 14 окт 2008.

  1. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Косяк был на многопроцессорных тачках и в наивном предположении винды, что только она может работать с винтом через порты. Решилось торможением всех процессоров кроме текущего.


    Есть бага с командой IDENTIFY DEVICE. Например у меня на канале на Мaster - cdrom, на Slave - hard. Сканирую каналы на предмет наличия хардов, отправляю IDENTIFY DEVICE мастеру, потом слейву. Cdrom ожидаемо отваливается со статусом 0x51 и сигнатурой 0x01 0x01 0x14 0xEB. Далее посылаю запрос слейву и получаю на ожидании канала тотже 0x51, т.е. какая-то хрень происходит. Следующие каналы корректно отрабатывают. Если сделать наоборот, т.е. master - hard, slave - cdrom, то все ОК. Что за фигня?
     
  2. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Rodin
    Далее посылаю запрос слейву и получаю на ожидании канала тотже 0x51, т.е. какая-то хрень происходит - на всякий случай спрошу, именно слэйв (B0h/F0h) выбираете, не ошибаетесь ? Проверьте, как включен джампер на сидираме и правильно ли привод сидит на шлейфе - для мастера должен быть на краю. Но если все правильно, причина в оптоприводе - не освобождает линии канала (при ошибке), когда его просят убраться. Желательно проверить джамп и ПАТА-харда. На сигнатуру АТАПИ можно и не обращать внимание - он не знает команды EC.
     
  3. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Не понял что значит B0h/F0h. Выбираю мастер/слейв установкой 4-го бита регистра устройства (+6 от базы).

    На моем сdrom нет джамперов и интерфейс саташный. Сидит на мастере. Винт саташный и с ним вроде все ок.

    Кстати проблема не только при ошибке уст-ва. Если послать EXECUTE DEVICE DIAGNOSTIC, то cdrom на мастере отрабатывает корректно, сигнатуру возвращает, а потом на слейве в регистре статуса постоянно 0. Соответственно я отваливаюсь по таймауту готовности к приему команды.

    Эти проблемы воспроизводится и на реальной тачке (SATA hard + Dvdrom) и на VMware (IDE hard + Cdrom).

    Мануал ATA8-ACS говорит иное

    "IDENTIFY DEVICE - ECh, PIO Data-in
    This command is mandatory for all devices.

    In response to this command, devices that implement the PACKET feature set shall post command aborted and place the PACKET feature set signature in the appropriate fields"

    Что вобщем-то и происходит
     
  4. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Rodin
    Не понял что значит B0h/F0h. Выбираю мастер/слейв установкой 4-го бита регистра устройства (+6 от базы) - ну и что не понятно.
    1. в моих числах требуемый бит установлен для выбора слэйва ?
    2. может для выбора сидирамы значения должны быть A0/E0 ? Проверяйте.

    Короче - пробуйте в порт писать B0/F0 для выбора слэйва и A0/E0 для оптики (мастер).
     
  5. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Черт натупил :). Вообще так и делаю - для мастера 0xA0, для слейва 0xB0. Если сделать 0xE0/0xF0 - тоже самое
     
  6. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Rodin
    Так может Ваши САТА АТА и АТАПИ устройства оба мастера и сидят не на одном канале, а на разных ?
     
  7. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Нет тут все четко.
     
  8. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Такая же ерунда была с любой некорректной командой, отправленной харду или сидюку - девайс занимал весь канал на длительное время.

    Раньше последовательность для посылки команды была
    Ожидание канала -> выбор уст-ва -> ожидание уст-ва -> команда -> ожидание
    выполнения команды
    И это давало описанный косяк

    Теперь такое
    Выбор уст-ва -> ожидание уст-ва -> команда -> ожидание выполнения команды
    И все вроде работает корректно.

    Кстати непонятно зачем Pavia в http://wiki.osdev.ru/index.php/Работа_с_жесткими_дисками_и_их_контроллерами так жестко определял хард/сидюк, если достаточно IDENTIFY DEVICE
     
  9. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Он привел общий случай, по стандарту. И потом, зависит, чего ищешь - АТА или АТАПИ. Можно найти алгоритмы попроще/красивше, без всяких сбросов и выжиданий.