Порт 1F0h(170h) является единственным 16-битным портом контроллера, из него принимаются и в него записываются данные при работе с винчестером.
Порт ошибок, он же порт 1F1h содержит коды ошибок после выполнения команды, если там все нули значит "все хорошо".
Регистр 1F2h используется в групповых операциях (читается или записывается группа секторов за один раз), он выступает в роли счетчика секторов, его содержимое уменьшается на единицу после обработки каждого сектора из группы.
Следующие регистры 1F3h-1F6h хранят адрес. Тут все понятно надеюсь.
- описание регистров портов
Регистр порта 1F6h:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | AM | 1 | DEV | LBA27 | LBA26 | LBA25 | LBA24 |
С разрядами [0:3] все понятно - туда пишем соответствующую часть LBA адреса. Биты 5 и 7 зарезервированы, там всегда должно быть 1.
Бит AM (Addressing Mode) определяет режим адресации - 0-CHS, 1-LBA. Наконец, добрались до главного - бит DEV определяет устройство на канале (Master/Slave) к которому относится все то что пишешь в остальные порты: 0-Master, 1- Slave.
Регистр порта 1F7h (регистр состояния):
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
BSY | DRSY | DF | DSC | DRQ | CORR | IDX | ERR |
BSY - устройство занято выполнением команды.
DRDY - устройство готово к приему команды.
DF - устройство неисправно.
DSC - поиск завершен.
DRQ - устройство готово к обмену данными.
CORR - была ошибка, но данные были скорректированы.
IDX - в разных источниках написано по разному, этот бит зависит от производителя, и самое верное решение - просто его игнорировать.
ERR - в процессе выполнения команды, были обнаружены ошибки, какие именно - указывает 1F1h.
Наконец, порт 3F6h - в нем используются только биты 1 и 2.
1 - прерывания от устройства запрещены, 0 - разрешены.
2 - программный сброс всех подключенных к каналу устройств (при установке его в 1).
- Основной протокол обмена PIO
Протокол PIO (Programmable Input/Output) заключается в следующих основных положениях (при работе без прерываний):
Дождаться готовности устройства (BSY=0)
Записать в DEV номер устройства на канале.
Дождаться BSY=0, DRDY=1 считывая 1F7h или 3F6h (для первого канала).
Записать в регистры остальные параметры.
Записать в регистр команды код операции.
Читать регистр статуса пока устройство не установит BSY=0.
Дождаться готовности обмена данными (DRQ=1)
Принять данные (или передать).
Пока BSY установлен в 1, ничего делать нельзя, надо подождать, пока винчестер разберется со своими проблемами и будет готов заняться твоими, причем BSY=1 указывает на занятость канала, а не устройства. В этом кроется причина невозможности параллельной работы двух устройств на одном канале - прежде чем обращаться к какому-либо устройству, нужно, чтобы оба подключенных к каналу устройства освободились, так как они разделяют бит BSY между собой.
DRDY=1 показывает, что диск готов к приёму команд, поскольку согласно протоколу анализ этого бита должен происходить после выбора устройства на канале: он показывает занятость именно конкретного выбранного устройства. DRQ=1 говорит, что диск готов к обмену данными. Важно понимать разницу между DRDY и DRQ. После посылки команды в порт, устройство установит DRDY=0, что указывает на занятость устройства выполнением команды, и только после того, как данные будут считаны во внутренний буфер, устройство установит DRQ=1, при этом в протоколе не оговаривается, что устройство сразу же должно быть готово к приему следующей команды.
- Команды ATA на примере чтения сектора и остановки винчестера
Теперь рассмотрим собственно команды ATA. Вообще ATA команд очень много, даже стандаритизированных около 20, но реально из них используются только штук 10.
Мы рассмотрим команды чтения\записи одного сектора, идентификации накопителя, а также команду остановки винчестера (она вообще-то в стандарт не входит, но поддерживается абсолютным большинством винчестеров), которая юзается всеми ОС при переводе компа в режим пониженного энергопотребления. Все примеры относятся к Master устройству первого канала, при желании их можно легко адаптировать к любой конфигкрации.
Чтение секторов с винчестера выглядит следующим образом:
Запретить прерывания записью в 3F6h
Дождаться готовности канала читая бит BSY в порту 1F7h
Выбрать устройство на канале записью в 1F6h
Дождаться DRDY=1 и BSY=0
Загрузить LBA адрес.
Послать команду чтения (20h)
Дождаться BSY=0
Дождаться готовности обмена данными (DRQ=1)
Принять данные от устройства через 1F0h строковой операцией ввода из порта.
Разрешить прерывания от устройства.
В случае остановки винчестера необходимо послать команду E6h, при этом данные отправлять не надо и следовательно остальные пункты для данной операции не требуются. Для того, чтобы восстановить работу винчестера, необходимо установить второй бит в регистр порта 3F6h.
Материал подготовлен с использованием следующих источников
1. В. Морозов, А. Тарахтелюк «Диагностика и ремонт НЖДМ типа Винчестер» Москва, АО «Звезды и С», 1993 г.
2. , «Дисковая подсистема IBM-совместимых персональных компьютеров», МП. «Бином», 1993 г.
3. С. Гореликов « IMB PC. Дисковая система: контроллеры, накопители и иъ обслуживание», Москва, АО «Звезды и С», 1992 г.
4. Журнал "Компьютер Днепропетровска" N 19 (1998), электронная версия по адресу: http://zeus. sai. msu. ru:7000/pp/pc03.shtml
5. Цикл статей «Анатомия HDD”: http://hdd. /list. php? c=anatomy
6. Сайт посвященный аппаратному программированию: http://wasm. ru
7. Статья журнала Техно-Collection «Винчестер снаружи и изнутри»: № 11, 1997
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


