SCSI pointers (указатели SCSI)
SCSI-архитектура предлагает устанавливать для каждого процесса ввода/вывода сохранение в Initiator Path Control Area два набора из трех указателей, которые состоят из:
1. Указатель команды (Command Pointer) – 1 байт. Указывает на начало дескриптора блока команды (т.е. на код команды).
2. Указатель статуса (Status Pointer) – 1 байт. Указывает на начало Status Area.
3. Указатель данных (Data Pointer) – макс. 4 байта. Указывает на начало области данных (т.е. LBA).
Первый набор указателей называется Current (Active) Pointers и хранится в регистре текущих указателей (Current Pointer Register) ИУ. Текущие указатели указывают на очередной байт команды, состояния и данных, которые будут передаваться между памятью ИУ и ЦУ. Current Pointers заносятся в регистр до начала фазы шины Arbitration и хранятся там до завершения команды (прием от ИУ сообщения Good Status), либо до получения сообщения Save Data Pointer, после чего записываются в «сохранение указателей» (Saved Pointers).
Второй набор указателей называется Saved Pointers (до 15 [7] наборов для широкой [узкой] шины, по одному на каждое устройство).
Минимальная задержка на освобождение SCSI-шины (Bus Clear Delay) – 800 нс. За это время ИУ должен восстановить указатели из памяти в регистр текущих указателей.
Биты чётности (DPB0, DPB1)
Использование битов чётности – системная опция. Но устройство всегда проверяет биты чётности на шине и если имеет возможность, то сообщает об ошибке бита чётности хост-адаптеру. Эта возможность определяется устройством для каждого конкретного устройства отдельно.
SCSI-система может иметь такую конфигурацию, когда все подключённые к интерфейсу устройства генерируют бит чётности и регистрация чётности для всех устройств включена. Система может также иметь конфигурацию, когда регистрация чётности отсутствует, и проверка по чётности вообще не осуществляется.
Во время фазы Arbitration (см. рис. 9) чётность не используется (DPB0, DPB1 не должны устанавливаться в состояние логического нуля).
Программный интерфейс ASPI
Для ускорения и упрощения разработки управляющих программ (драйверов) под операционную систему Windows (и не только) был разработан (фирмой Adaptec) программный интерфейс ASPI (Advanced SCSCI Programming Interface — расширенный интерфейс программирования SCSI), упрощающий разработку переносимых приложений управления различными устройствами с одной платформы Win32 на другую. Интерфейс ASPI представляет собой программную оболочку (надстройку), которая объединяет в себе соглашение о вызовах функций и установленный набор команд. Этот интерфейс призван посылать и обрабатывать команды SCSI, используя любой доступный в системе контроллер SCSI, поддерживающий такую возможность. ASPI интерфейс стал промышленным стандартом программной оболочки для следующих операционных систем: DOS, Windows, OS/2, Netware.
Интерфейс ASPI состоит из нескольких уровней. На самом низком уровне находится управляющая программа ASPI (драйвер), работающая непосредственно с контроллером. Далее следует периферийный драйвер, скрывающий тонкости работы с поддерживаемым периферийным оборудованием (жестким диском, сканером и т. д.). Этот драйвер может быть универсальным для различных моделей устройств одного типа или индивидуальным, но всегда поставляется изготовителем оборудования. Управляющий драйвер ASPI имеет несколько модификаций, зависящих от версии операционной системы Windows (MS-DOS, Windows 3.1, Windows 95/98/ME/NT/2000/XP). В большинстве случаев он поставляется в составе операционной системы и состоит из нескольких файлов:
Windows 98/ME | Windows NT 4.0 | Windows 2000 | Windows XP |
Wnaspi32.dll | Wnaspi32.dll | Wnaspi2k.dll | Aspixp.sys (32 bit) |
Apix.vxd | Aspi32.sys | Aspi2k.sys | Wnaspixp.dll (32 bit) |
Winaspi.dll | Winaspi.dll | Aspi64.sys (64 bit) | |
Wnaspi64.dll (64 bit) |
Приведем примеры программ, использующих простейшие основы ASPI на Visual C++.
Пример №1. Инициализация интерфейса ASPI:
Void InitASPI ( )
{
DWORD dwASPIsupport ;
// вызываем функцию GetASPI32SupportInfo для инициализации ASPI
dwASPIsupport = GetASPI32SupportInfo( ) ;
if (HIBYTE (LOWORD (dwASPIsupport) = = SS_COMP)) // если ошибок нет
{
MessageBox (0, "ASPI успешно инициализирован !", MB_OK) ;
}
Else
{
MessageBox (0, "Ошибка инициализации ASPI !", MB_OK | MB_ICONINFORMATION) ;
}
}
Пример №2. Определение количества установленных в системе устройств:
DWORD GetCountDevice ( )
{
BYTE byCountDevice ;
DWORD dwASPI ;
// инициализируем ASPI
dwASPI = GetASPI32SupportInfo( ) ;
if (HIBYTE (LOWORD (dwASPI) = = SS_COMP)) // если ошибок нет
{
MessageBox (0, "ASPI успешно инициализирован !", MB_OK) ;
// определяем количество установленных в системе устройств
byCountDevice = LOBYTE (LOWORD (dwASPI)) ;
return (DWORD) byCountDevice ;
}
Else
{
MessageBox (0, "Ошибка инициализации ASPI !", MB_OK | MB_ICONINFORMATION) ;
return 0 ;
}
}
Пример №3. Получение информации об установленных в системе контроллерах:
Void GetAdapterInfo ( )
{
SRB_HAInquiry haInq ;
BYTE byCountDevice ;
DWORD dwASPI, dwStatus ;
// инициализируем ASPI
dwASPI = GetASPI32SupportInfo( ) ;
if (HIBYTE (LOWORD (dwASPI) = = SS_COMP)) // если ошибок нет
{
MessageBox (0, "ASPI успешно инициализирован !", MB_OK) ;
// определяем количество установленных в системе устройств
byCountDevice = LOBYTE (LOWORD (dwASPI)) ;
for (int i = 0; i < byCountDevice; i++)
{
//обнуляем структуру и заполняем данными
memset (&haInq, 0, sizeof (SRB_HA_Inquiry)) ;
haInq.SRB_Cmd = SC_HA_INQUIRY ;
haInq.SRB_HaId = i ;
haIng.SRB_Flags = 0 ;
haInq.SRB_Hdr_Rsvd = 0 ;
// выполняем команду ASPI
dwStatus = SendASPI32Command ( (LPSRB) &haInq) ;
while (!haInq.SRB_Status) { // ждем
}
// если команда завершена
if (dwStatus = = SS_COMP)
{
// заносим полученные данные куда-нибудь (например, в структуру)
// haInq.HA_SCSI_ID
// haInq.HA_ManagerId
// haInq.HA_Identifier
// haInq.HA_Unique
}
}
}
Else
{
MessageBox (0, "Ошибка инициализации ASPI !", MB_OK | MB_ICONINFORMATION) ;
return ;
}
}
Более подробную информацию по этим примерам можно получить в [5] или internet.
Система команд SCSI
Система команд SCSI включает общие команды, применимые для устройств всех классов, и специфические для каждого класса. Все команды делятся на три категории:
· обязательные (mandatory);
· дополнительные (optional);
· фирменные (vendor specific).
Любое SCSI-устройство должно поддерживать обязательные команды общего набора и своего класса, чем обеспечивается высокий уровень совместимости. Команды SCSI для устройств прямого доступа (Direct-Access Devices) приведены в табл. 7.
Таблица 6. Команды SCSI для устройств прямого доступа
№ | Команда | Код команды | Тип команды |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | CHANGE DEFINITION COMPARE COPY COPY AND VERIFY FORMAT UNIT INQUIRY LOCK-UNLOCK CACHE LOG SELECT LOG SENSE MODE SELECT (6) MODE SELECT (10) MODE SENSE (6) MODE SENSE (10) PRE-FETCH PREVENT-ALLOW MEDIUM REMOVAL READ (6) READ (10) READ BUFFER READ CAPACITY READ DEFECT DATA READ LONG REASSIGN BLOCKS RECEIVE DIAGNOSTIC RESULTS RELEASE REQUEST SENSE RESERVE REZERO UNIT SEARCH DATA EQUAL SEARCH DATA HIGH SEARCH DATA LOW SEEK (6) SEEK (10) SEND DIAGNOSTIC SET LIMITS START STOP UNIT SYNCHRONIZE CACHE TEST UNIT READY VERIFY WRITE (6) WRITE (10) WRITE AND VERIFY WRITE BUFFER WRITE LONG WRITE SAME | 40h 39h 18h 3Ah 04h 12h 36h 4Ch 4Dh 15h 55h 1Ah 5Ah 34h 1Eh 08h 28h 3Ch 25h 37h 3Eh 07h 1Ch 17h 03h 16h 01h 31h 30h 32h 0Bh 2Bh 1Dh 33h 1Bh 35h 00h 2Fh 0Ah 2Ah 2Eh 3Bh 3Fh 41h | O O O O M M O O O O O O O O O M M O M O O O O M M M O O O O O O M O O O M O O O O O O O |
Примечание: M – обязательные команды, O – опциональные команды. |
Некоторые команды сопровождаются блоком параметров, следующим за блоком дескриптора команды. Форматы блоков стандартизированы, длина блока определяется кодом операции, который всегда является первым байтом блока и может составлять 6, 10 или 12 байтов.
Любое ЦУ SCSI должно поддерживать четыре команды: Inquiry, Request Sense, Send Diagnostic, Test Unit Ready.
Порядок выполнения работы
1. При домашней подготовке изучить назначение, режимы работы и условия совместимости интерфейса SCSI.
2. Ознакомиться с основами программного интерфейса ASPI.
3. Выполнить индивидуальное задание по варианту
Содержание отчёта
1. Привести структурную схему подключения периферии к шине SCSI.
2. Привести схему, отражающую последовательности фаз шины SCSI.
3. Привести временные диаграммы для асинхронного и синхронного режима передачи данных.
4. Результаты выполнения индивидуального задания.
Контрольные вопросы:
1. Каковы особенности и назначение интерфейса SCSI?
2. Классификация SCSI. Понятия Single-Ended, Low Voltage Differential и High Voltage Differential.
3. Назначение терминаторов. Их виды.
4. Варианты подключения устройств к шине SCSI (SE, LVD и LVD/SE).
5. Перечислите основные типы применяемых в SCSI разъемов.
6. Фазы шины SCSI. Характеристика фаз и их последовательность.
7. Перечислите сигналы управления шины SCSI.
8. Приведите временные диаграммы для асинхронного и синхронного варианта обмена по шине SCSI.
9. Охарактеризуйте систему управляющих сообщений интерфейса SCSI. Приведите пример внутренней структуры управляющего сообщения.
10. Охарактеризуйте программный интерфейс ASPI и его уровни.
Список литературы:
- Гук М. Дисковая подсистема ПК. – Санкт-Петербург, 2001.
- Интерфейс малой компьютерной системы (ИМКС) / Всесоюзный центр переводов научно-технической литературы и документации (ВЦП). Северо-Кавказский филиал. – Ростов-Н/Д, 1989.
- SCSI Interface: Product Manual. Vol. 1, 2 / Seagate.
- SCSI-2 Specification.
- Несвижский В. Программирование устройств SCSI и IDE. — СПб.: БХВ – Петербург, 2003. – 592 с.
Примерные варианты заданий:
Общее для всех:
1. Определить, установлена ли в системе поддержка ASPI.
2. Проинициализировать интерфейс ASPI.
3. Определить количество установленных в системе устройств.
4. Получить информацию об установленных контроллерах.
Индивидуальные задания:
1. Получить текущую скорость чтения устройства.
2. Выполнить полную и частичную очистку диска.
3. Закрыть записанный трек или сессию.
4. Открыть и закрыть лоток устройства.
5. Определить полный размер носителя.
6. Определить максимальную поддерживаемую устройством скорость чтения.
7. Определить текущую позицию воспроизведения на диске.
8. Определить имя и номер продукта.
9. Заблокировать и разблокировать лоток устройства.
10. Приостановить и продолжить текущее воспроизведение диска.
11. Прочитать данные с диска на компьютер.
12. Прочитать заголовочную область диска.
13. Просканировать диск.
14. Установить время остановки шпинделя двигателя устройства.
15. Установить скорость чтения для устройства.
16. Проверить готовность устройства к работе.