Файловая система EXT2

Регистры АТА контроллера


Каждое устройство АТА (жесткий диск с интерфейсом АТА) имеет стандартный набор регистров, адресуемых сигналами от хост-адаптера (средства сопряжения интерфейса АТА с системной шиной). Набор регистров состоит из двух блоков - блока командных регистров и блока управляющих регистров.

Блок командных регистров служит для посылки команд устройству и передачи информации о его состоянии. Состав блока командных регистров:

1. Регистр состояния/команд - в режиме чтения отражает текущее состояние устройства в процессе выполнения команды. Чтение регистра состояния разрешает дальнейшее изменение его бит и сбрасывает запрос аппаратного прерывания. В режиме записи принимает коды команд для выполнения.

Назначение бит регистра состояния:

Бит 7 - BSY (Busy) указывает на занятость устройства. При единичном значении устройство игнорирует попытки записи в блок командных регистров. При нулевом значении этого бита регистры командного блока доступны. Бит устанавливается под действием аппаратного или программного сброса, а также при получении команды.

Бит 6 - DRDY (Device Ready) указывает на готовность устройства к восприятию любых кодов команд.

Бит 5 - DF (Device Fault) - индикатор отказа устройства.

Бит 4 - DSC (Device Seek Complite) - индикатор завершения поиска трека.

Бит 3 - DRQ (Data Request) - индикатор готовности к обмену словом или байтом данных.

Бит 2 - CORR (Correct Data) - индикатор исправленной ошибки данных.

Бит 1 - IDX (Index) - индекс, трактуется специфично для каждого производителя.

Бит 0 - ERR (Error) - индикатор ошибки выполнения предыдущей операции. Дополнительная информация содержится в регистре ошибок.

2. Регистр номера цилиндра (старшего и младшего байта) и номера сектора имеют двоякое назначение в зависимости от выбранной системы адресации (CHS или LBA). Они инициализируются хост-адаптером, а в случае возникновения ошибки при операции устройство поместит в них адрес, по которому встретилась ошибка.



3. Регистр номера устройства и головки кроме хранения части адресной информации служит для выбора ведущего или ведомого устройства (Device-0 и Device-1 согласно спецификации ATA) и метода адресации.


Биты 7 и 5 - зарезервированы.

Бит 6 - единичным значением указывает на применение режима адресации LBA. При нулевом значении бита используется режим CHS.

Бит 4 - DEV (Device) - выбор устройства. При DEV=0 выбрано устройство-0 (Master), при DEV=1 - устройство-1 (Slave).

Биты 3-0 имеют двоякое назначение в зависимости от выбранной системы адресации. В режиме CHS они содержат номер головки, в режиме LBA - старшие биты логического адреса.

4. Регистр данных может использоваться как 8-битный и 16-битный в зависимости от типа данных, передаваемых в текущей команде.

5. Регистр ошибок хранит состояние выполнения последней операции или диагностический код.

6. Регистр свойств (Features Register) - используется в зависимости от команды.

7. Регистр счетчика секторов содержит число секторов, участвующих в обмене. Нулевое значение соответствует 256 секторам.

Блок управляющих регистров используется для управления устройством и получения байта его состояния.

В состав блока входят альтернативный регистр состояния и регистр управления устройством.

Альтернативный регистр состояния имеет те же биты, что и основной, но его чтение не приводит ни к каким изменениям состояния устройства.

В регистре управления устройством биты 7-3 зарезервированы, бит 0 всегда нулевой, используются только два бита:

Бит 2 - SRST (Software Reset) - программный сброс, действует все время, пока бит не будет сброшен. Оба устройства шины воспринимают программный сброс одновременно.

Бит 1 - IEN# (Interrupt Enable) - инверсный бит разрешения прерывания.

Адреса регистров контроллера устройства-0 определены в файле <linux/hdreg.h>:

#define HD_DATA 0x1f0 /* регистр данных */ #define HD_ERROR 0x1f1 /* регистр ошибок */ #define HD_NSECTOR 0x1f2 /* регистр счетчика секторов */ #define HD_SECTOR 0x1f3 /* регистр стартового сектора */ #define HD_LCYL 0x1f4 /* регистр младшего байта номера цилиндра */ #define HD_HCY 0x1f5 /* регистр старшего байта номера цилиндра */ #define HD_CURRENT 0x1f6 /* 101dhhhh , d=устройство, hhhh=головка */ #define HD_STATUS 0x1f7 /* регистр состояния/команд */


Содержание раздела