Pavia YESSS !!! Получилось ! Да, действительно, проблема была в неправильной проверке битов статуса. После посыла команды я ожидал её выполнения проверяя BSY=0 и DRDY=0, а потом ожидал готовность данных проверяя DRQ=1. В этом и был подвох. На самом деле после посыла команды нужно ожидать готовность данных проверяя BSY=0 и DRQ=1. И всё заработало !!! Сектор прочитан ! И в родном режиме и в устаревшем. ВСЕМ АГРОМНАЕ СПАСИБА !!! Теперь буду разбираться с FAT32 и с поиском заданного файла. ))
Pavia Да, видимо у ATA и SATA действительно немного разные поведения, поскольку прекрасно работавшая на ATA проверка статуса, для SATA оказалась некорректной.
Возник новый вопрос ! SATA поддерживает LBA48 адресацию. Вопрос в том, как этой возможностью воспользоваться. Wiki гласит: "...Резонный вопрос: как работать с LBA48, если все регистры имеют разрядность 8 бит? При адресации через LBA48 запись адреса идет в те же регистры, но более хитрым способом. Сначала записывается старшая часть адреса и число секторов, а затем (во второй раз) в те же самые регистры записывается младшая часть...". Тоесть, как я понял, никаким особым образом режим LBA48 включать ненадо, просто нужно адрес записать дважды подряд ? Тоесть последовательно пишем значения в порты: BasePort...+1,+2,+3,+4,+5,+3,+4,+5,+команда, и контроллер адресуется по LBA48 ???
dess Включать не нужно. Для LBA48 используются свои команды. Нужно только проверить поддержку (тут эмуляторы выдают ложную информацию). Тоесть последовательно пишем значения в порты: BasePort...+2,+3,+4,+5,+2,+3,+4,+5,+7(команда) Sector Count тоже подрос и стал 16битным +1 это Features он зарезервирован, незачем в него писать.
Pavia Отлично, спасибо ! Сейчас проверю. А - "Для LBA48 используются свои команды" - означает, что для чтения сектора используется не 020h код, а какой-то другой ?
Возникнут ли проблемы, если читать/писать на ATA диск через порты из под винды? Например я что-нить занес в порты, но команды не произвел. Тут меня прервал драйвер диска, выполняя запрос какого-нить потока, перезатер мои данные, выполнил свою команду. Вернул мне управление, я выполняю свою команду и получаю непредсказуемые результаты. Возможно стоит работать с портами только из кернела и с предварительно поднятым приоритетом? Но тогда до какого IRQL?
Rodin Теоретически возможно, но вероятность мола. Да работать из кернела. А приоритеты тут причем? Это жадность? Совет почитать про то, как работает планировщик процессов и для чего нужны приоритеты.
1. Через порты I/O, естественно. У стандартного ИДЕ свои адреса, у внешних контроллеров - свои. 2. Читать в каком режиме - ПИО или УДМА. Для каждого режима свои команды. 3. Читать в режиме ЛБА28/ЛБА48/ЦХС - опять свои АТА-команды. Сначала определитесь и формулируйте конкретно.
Memphis ... Контроллер встроенный на материнской плате, поддерживает работу в родном и устаревшем режимах (не имеет значения), чтение сектора происходит в режиме PIO, LBA48.
Я ж и допытываюсь - куда включен хард (Primary/Secondary/Master/Slave) ? Вот ниже пример чтения одного сектора (МБР, нулевой ЛБА) для Secondary/Slave в режиме ЛБА28/ПИО по адресу ОЗУ 6000h:1000h: mov al,0 mov dx,171h out dx,al inc ax inc dx out dx,al dec ax inc dx out dx,al inc dx out dx,al inc dx out dx,al mov al,0F0h inc dx out dx,al mov al,20h inc dx out dx,al lab0: in al,dx test al,80h jnz lab0 cmp al,58h jnz error mov cx,100h push 6000h pop es mov di,1000h cld sub dx,7 rep insw
Memphis Таже ошибка что и у dess. Прочитай посты #20 и #21. Контроллер может снять BSY до того как сможет передать данные DRQ. Это позволяет в такии промяжутки отпровлять следующую команду, чем можно ускорить работу контроллера. Таким оброзом можно спаривать только определенные команды. Нужно проверять еще и 3 бит DRQ
Pavia На самом деле после посыла команды нужно ожидать готовность данных проверяя BSY=0 и DRQ=1. - это из 21-го поста. А вот у меня - test al,80h jnz lab0 cmp al,58h jnz error то шо, слепой, брат ? А твой пост №20 к первоначальной постановке задачи (теме) вообще не имеет отношения.
Memphis Я то не слепой. Только у тебя тут логика ломается. У тебя если BSY=0 и DRQ=1 перейдет к ошибке. Еще раз повторяю BSY и DRQ устанавливаются не одновременно. Какраз таки имеет. У SATA эта особенность выплывает на ружу. У ATA это не так заметно.
Memphis В БИОСе в режиме Compatible Mode хард видится как Primary IDE Master, а в режиме Enhanced Mode вообще как Third IDE Master...
Memphis Я неделю безрезультатно парился с проверкой бит статуса на SATA используя код от ATA. И вот, что получается: на SATA после посыла команды чтения сектора достаточно ожидать данных от HDD (DRQ=1) и освобождения канала (BSY=0), после чего можно просто забрать считанные данные.
Pavia У тебя если BSY=0 и DRQ=1 перейдет к ошибке. - ошибаешься, перейдет, к примеру с кодом 59 (что, никогда не видел такого ?) И не ломается логика. Если код не равен 58, я не имею права проводить трансфер (значит надо анализировать ошибки). Поэтому, перейдя к ошибке (error-метка), я начну разбираться, в чем дело и это будет примерно так: error: test al,1 jnz exit ; (команда завершилась с ошибкой, дергаться бесполезно - может я наткнулся на ATAPI или с параметрами сплаховал ?) test al,8 jz exit ; готовность есть, трансфера нет - ужас. Нереально, но готовы и к этому. Можно протестировать биты #10 & #40 - но уже легче от этого не станет. Таже ошибка что и у dess. Прочитай посты #20 и #21. - мне не понравилось эта высокомерная фраза, ибо в моем фрагменте (соглашусь, неполном) ошибок нет. И не важно, с чем имеешь дело - ПАТА или САТА - алгоритмы одинаковы, не раз пройдены под отладчиком. И еще - я не читал всю ветку и Ваши ответы (лень, только первый пост-вопрос и сразу мой ответ) - надеюсь, это не преступление ?
dess хард видится как Primary IDE Master - во, это другое дело. Я это к тому, чтоб манипулировать реальными адресами для Вашей системы (т.е. можно прогонять фрагменты кода под отладчиком). Хотелось еще от Вас базу Bus Master - контроллера вытянуть, для полного счастья (или уже УДМА не интересует ?) на SATA после посыла команды чтения сектора достаточно ожидать данных от HDD (DRQ=1) и освобождения канала (BSY=0), после чего можно просто забрать считанные данные. - да нет, уважаемый. Надо проверять сначала бит #1 (команда завершилась успешно или с ошибкой ?), а затем только Ваши любимые #80 & #8. Хотя этого мало - надо проверять все биты на корректность - то бишь 58h в моем конкретном примере.