Регистры АТА контроллера
Каждое устройство АТА (жесткий диск с интерфейсом АТА) имеет стандартный набор регистров, адресуемых сигналами от хост-адаптера (средства сопряжения интерфейса АТА с системной шиной). Набор регистров состоит из двух блоков - блока командных регистров и блока управляющих регистров.
Блок командных регистров служит для посылки команд устройству и передачи информации о его состоянии. Состав блока командных регистров:
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 /* регистр состояния/команд */