Введение	Описание команд
Описание сигналов	Типы ПУ
Описание сообщений	Конфигурирование устройств SCSI

Описание комманд

Адресация и система команд
Форматы блоков дескрипторов команд
Байты состояния
Команды SCSI
Выполнение команд

Адресация и система команд

Как указывалось ранее, любое устройство SCSI на шине адресуется идентификатором SCSI ID, соответствующим заданному уникальному адресу. В ЦУ может быть определено до 8 ЛУ со своими номерами LUN (Logical Unit Number) в диапазоне 0-7. Понятие LUN неприменимо к ИУ, но SCSI-устройство двойного назначения может иметь ЛУ.

Система команд и сообщений позволяет адресовать как ЦУ в целом, так и любое его ЛУ. В ЦУ может быть определено до 8 целевых программ TRN (Target Routine), которые не имеют непосредственной привязки к ЛУ. Целевые программы появились в SCSI-2, их адресация также производится через сообщения.

Система команд SCSI включает общие команды, применимые для устройств всех классов, и специфические для каждого класса. Как общие, так и специфические наборы команд содержат обязательные (Mandatory), дополнительные (Optional) и фирменные (Vendor Specific) команды. Любое SCSI-устройство должно поддерживать обязательные команды общего набора и своего класса, чем обеспечивается высокий уровень совместимости. Команда передается ИУ в ЦУ через блок дескриптора команды Command Descriptor Block, посылаемый в фазе Command. Некоторые команды сопровождаются блоком параметров, следующим за блоком дескриптора в фазе Data. Форматы блоков стандартизованы, длина блока определяется кодом операции Operation Code, который всегда является первым байтом блока и может составлять 6, 10 или 12 байт. Типовой блок содержит следующие поля (табл.2.1):

•	OpCode - код операции, 1 байт (графа "Код" в табл. 1.8). Биты [7:5] определяют группу, а биты [4:0] - код команды. В группе 0 блок дескриптора имеет длину 6 байт, в группах 1 и 2 -10 байт, в группе 5 -12 байт. Группы 3 и 4 зарезервированы, группы 6 и 7 отданы на усмотрение разработчиков.

•	LUN - номер ЛУ (для совместимости со SCSI-1), всегда занимает биты [7:5] байта 1. Если для идентификации используются сообщения Identify, то это поле игнорируется (рекомендуется устанавливать LUN=0).

•	LBA - адрес логического блока, 21 бит для 6-байтных блоков и 32 бит - для 10- и 12- байтных. В ряде команд поле не используется.

•	Length - длина (количество блоков или байт) передаваемых данных Transfer Length, блока параметров Parameter List Length или блока, резервируемого ИУ под данные Allocation Length (один из трех вариантов в зависимости от команды). При однобайтном задании длины 0 соответствует значению 256, в длинных формах 0 указывает на отсутствие передач. В ряде команд поле не используется.

•	Control - байт управления. Биты [7:6] отданы на усмотрение разработчику, биты [5:2] - зарезервированы, бит 1 - Flag, бит 0 - Link (служит признаком объединения команд в цепочку). Flag определяет сообщение, передаваемое в случае успешного выполнения команд цепочки, при Flag=1 сообщение Linked Command Complete (With Flag) будет вызывать прерывания между командами цепочки

Таблица 2.1 Форматы блоков дескрипторов команд :
а - 6 байт, б - 10 байт, в - 12 байт.

			7 6 5 4 3 2 1 0		7 6 5 4 3 2 1 0
				0	OpCode
				1	LUN Резерв
		0	OpCode	2	(MSB)
		1	LUN Резерв	3
		2	(MSB)	4	---LBA---
	7 6 5 4 3 2 1 0	3		5	(LSB)
0	OpCode	4	---LBA---	6	(MSB)
1	LUN (MSB)	5	(LSB)	7
2	---LBA---	6	Резерв	8	Length
3	(LSB)	7	(MSB)Length	9	(LSB)
4	Length	8	(LSB)	10	Резерв
5	Control	9	Control	11	Control
	a		б		в
Обратим внимание на порядок байт: первыми передаются старшие байты (бит MSB - самый старший), за ними - младшие (бит LSB - самый младший). Зарезервированные поля для совместимости с будущими стандартами должны иметь нулевые значения.

Исполнение команды завершается в фазе Status передачей байта состояния Status Byte. Байт не передается, если команда завершена по сообщению Abort, Abort Tag, Bus Device Reset, Clear Queue, по условию Hard Reset или в случае неожиданного разъединения. В байте состояния используются только биты [5:1], возможные состояния приведены в табл. 1.7 (остальные зарезервированы).

Таблица 1.7 Байты состояния.

Биты  7 6 5 4 3 2 1 0	Состояние	Значение
RROOOOOR	Good	Успешное завершение команды
RROOOO1R	Check Condition	Указание на асинхронное событие
RROOO1OR	Condition Met	Запрошенная операция выполнена (команды Search Data и Pre-Fetch)
RROO1OOR	Busy	Занято (невозможен прием команды)
RRO1OOOR	Intermediate	Успешное выполнение команды в цепочке
RRO1O1OR	Intermediate Condition Met	Удовлетворение запрошенной операции в цепочке команд
RRO11OOR	Reservation Confhct	Попытка обратиться к ЛУ, зарезервированному другим ИУ
RR1OOO1R	Command Termmted	Завершение текущего процесса по сообщению Terminate I/O Process или по асинхронному событию
RR1O1OOR	Queue Full	Очередь (маркированная) заполнена, процесс в очередь не поставлен
Набор команд для устройств классов 0-9 приведен в табл. 1.8. Любое ЦУ SCSI-2 обязано поддерживать четыре команды: Inquiry, Request Sense, Send Diagnostic, Test Unit Ready. Они используются для конфигурирования системы, тестирования устройств и сообщений об ошибках и исключительных ситуаций. Команда Inquiry позволяет получить информацию о ЛУ через стандартизованный блок данных длиной 96 байт: тип подключенного ПУ, возможность смены носителя, поддержка 32- или 16-битного расширения, синхронного обмена, относительной адресации, цепочек команд, очередей и уведомления об асинхронных событиях.

Здесь же описываются уровень поддержки стандартов SCSI (ISO, ANSI, ЕСМА), идентификаторы производителя, устройства и т. п. Формат блока по усмотрению производителя может быть расширен.

В графе "Применимость" указаны номера типов ПУ, соответствующие табл. 1.8 (символ * соответствует всем типам). Команды для каждого типа устройств могут быть обязательными - номер сопровождается символом m (Mandatory) - или необязательными - номер типа сопровождается символом о (Optional). Часть команд в устройствах разных классов реализуется по-разному, что отмечено обозначением *z.

Таблица 1.8 Команды SCSI

Команда	Код	Применимость	Назначение
Change Definition	40h	*o	Модификация определений операций для ЛУ
Compare	39h	*o	Побайтное сравнение данных двух ЛУ *
Copy	18h	*o	Копирование данных с одного ЛУ на другое *
Copy And Verify	3Ah	*o	Копирование данных с одного ЛУ на другое с верификацией *
Erase	19h	1m	Стирание (участка или до конца носителя)
Erase (10)	2Ch	7o	То же с 10-байтным блоком дескриптора
Erase (12)	ACh	7o	То же с 12-байтным блоком дескриптора
Exchange Medium	A6h	8o	Обмен носителями между двумя элементами устройства
Format	04h	2o	Выбор шрифтов и форм
Format Unit	04h	0m 7o	Форматирование устройства
Get Data Buffer Status	34h	6o	Опрос состояния буфера данных
Get Message	08h	9o	Прием пакета из коммуникационного устройства
Get Message (10)	28h	9o	То же с 10-байтным блоком-дескриптора
Get Message (12)	A8h	9o	То же с 12-байтпым блоком дескриптора
Get Window	25h	6o	Получение информации о предварительно определенном окне
Initialize Element Status	07h	8o	Инициализация состояния элемента
Inquiry	12h	*m	Опрос типа устройства, уровня стандарта, идентификатора производителя, модели  и т.п.
Load Unload	1Bh	1o	Загрузка/разгрузка носителя
Locate	2Bh	1o	Позиционирование на заданный логический блок
Lock-Unlock Cache	36h	0o4o5o7o	Фиксация заданных логических блоков в кэше устройства и ее отмена
Log Select	4Ch	*o	Запись статистической информации, обработка которой поддерживается устройством, в ЦУ или ЛУ
Log Sense	4Dh	*o	Считывание статистической информации с ЦУ или ЛУ
Medium Scan	38h	4o7o	Сканирование - поиск непрерывной области чистых или записанных блоков
Mode Select (6)	15h	*z	Запись параметров носителя, ЦУ или ЛУ  (с 6-байтным блоком дескриптора)
Mode Select (10)	55h	*z	То же с 10-байтным блоком дескриптора
Mode Sense (6)	lAh	*z	Считывание параметров носителя, ЦУ или ЛУ (с 6-байтиым блоком дескриптора)
Mode Sense (10)	5Ah	*z	То же с 10-байтным блоком дескриптора
Move Medium	A5h	8m	Передача носителя
Object Position	31h	6o	Позиционирование (загрузка/выгрузка) сканируемого объекта
Pause/Resume	4Bh	5o	Пауза/продолжение воспроизведения аудио
Play Audio (10)	45h	5o	Аудиовоспроизведение указанных логических блоков
Play Audio (12)	A5h	5o	То же с 12-байтным блоком дескриптора
Play Audio MSF	47h	5o	Аудиовоспроизведение с адресацией MSF
Play Audio Track/Index	48h	5o	Аудиовоспроизведение с указанием треков и индексов
Play Track Relative (10)	49h	5o	Аудиовоспроизведение с адресацией относительно трека
Play Track Relative (12)	A9h	5o	То же с 12-байтным блоком дескриптора
Position To Bement	2Bh	8o	Позиционирование транспортного элемента к указанному элементу
Prefetch	34h	0o4o5o7o	Считывание блоков данных в кэш (без передачи ИУ)
Prevent Allow Medium Removal	1Eh	0o1o4o5o7o8o	Запрет/разрешение смены носителя в ЛУ
Print	0Ah	2m	Печать блока данных
Read(6)	08h	0m 1m 4o 5o 7o	Чтение данных (с 6-байтным блоком дескриптора)
Read (10)	28h	0m 4m 5m 6m 7m	То же с 10-байтным блоком дескриптора
Read (12)	A8h	4o 5o 7o	То же с 12-байтным блоком дескриптора
Read Block Limits	05h	1m	Запрос ограничений на длину блока (минимальная и максимальная длины)
Read Buffer	3Ch	*o	Чтение буфера
Read Capacity	25h	0m 4m 7m	Определение емкости ЛУ
Read Cd-Rom Capacity	25h	5m	Определение емкости CD-ROM (возможно быстрое определение с погрешностью) .
Read Defect Data	37h	0o7o	Чтение списков дефектных блоков (Plist - исходный список от изготовителя, Glist - список, заполняемый при эксплуатации)
Read Defect Data (12)	B7h	7o	То же с 12-байтным блоком дескриптора
Read Element Status	B8h	8o	Чтение состояния элементов
Read Generation	29h	7o	Чтение максимально возможного поколения для указанного логического блока
Read Header	44h	5o	Чтение заголовка логического блока CD-ROM
Read Long	3Eh	0o4o5o7o	"Длинное" чтение - данные блока и поля ЕСС
Read Position	34h	1o	Запрос позиции данных, находящихся в буфере (адрес начала и конца, количество блоков и байт)
Read Reverse	0Fh	1o	Чтение блоков с текущей позиции в обратном направлении
Read Sub-Channel	42h	5o	Чтение данных субканала CD-ROM
Read Toc	43h	5o	Чтение таблицы содержимого CD-ROM
Read Updated Block	2Dh	7o	Чтение определенного поколения обновленного логического блока
Reassign Blocks	07h	0o 4o 7o	Переназначение дефектных блоков
Receive	08h	3o	Прием пакета
Receive Diagnostic Results	1Ch	*o	Получение результатов диагностики
Recover Buffered Data	14h	1o2o	Восстановление данных, посланных в буфер, но не записанных (не напечатанных) из-за ошибки
Release	17h	0m 2m 4m 5m 6m 7m 8o	Освобождение зарезервированного ЛУ, экстента или элемента
Request Sense	03h	*m	Опрос уточненного состояния
Request Volume Element Address	B5h	8o	Передача результатов команды SEND VOLUME TAG
Reserve	16h	0m 1m 2m 4m 5m 6m 7m 80	Предотвращение использования ЛУ (его экстента или элемента) другим ИУ
Rewind	0lh	1m	Перемотка носителя к началу раздела
Rezero Unit	0lh	0o4o5o7o8o	Приведение ЛУ в определенное состояние
Scan	1Bh	6o	Сканирование данных в определенном окне
Search Data Equal	31h	0o4o5o7o	Поиск данных, (не) совпадающих с эталоном *
Search Data Equal (12)	Blh	4o 5o 7o	То же с 12-байтным блоком дескриптора *
Search Data High	30h	0o4o5o7o	Поиск данных, (не) больших эталона *
Search Data High (12)	B0h	4o 5o 7o	То же с 12-байтным блоком дескриптора *
Search Data Low	32h	0o5o7o	Поиск данных, (не) меньших эталона *
Search Data Low (12)	B2h	4o 5o 7o	То же с 12-байтным блоком дескриптора *
Seek(6)	0Bh	0o4o5o7o	Позиционирование (с 6-байт-ным блоком дескриптора) *
Seek(10)	2Bh	0o4o5o7o	Позиционирование - поиск логического адреса (с 10-байтным блоком дескриптора ) *
Send	0Ah	3m	Посылка пакета
Send(10)	2Ah	6o	Посылка данных в устройство
Send Diagnostic	1Dh	*m	Запуск теста ЦУ. Ответом будет состояние Good, если тест прошел успешно, или Check Conditum в случае ошибки
Send Message	0Ah	9m	Посылка пакета в коммуникационное устройство
Send Message (10)	2Ah	9o	То же с 10-байтным блоком дескриптора
Send Message (12)	AAh	9o	То же с 1.2-байтным блоком дескриптора
Send Volume Tag	B6h	8o	Посылка тега тома (шаблона) для поиска его в элементах или создания нового тега
Set Limits	33h	0o4o5o7o	Определение области логических адресов, над которыми могут выполняться операции цепочки команд
Set Limits (12)	B3h	4o5o7o	То же с 12-байтным блоком дескриптора
Set Window	24h	6m	Определение окна сканирования
Slew And Print	0Bh	2o	Прогон бумаги и печать
Space	11h	1m	Относительное позиционирование (вперед и назад) на заданное число блоков, файлов, маркеров и т. п.
Start Stop Unit	1Bh	0o4o5o7o	Разрешение/запрет операций с носителем, извлечение носителя *
Stop Print	1Bh	2o	Останов печати с очисткой буфера или без нее
Synchronize Buffer	10h	2o	Синхронизация буфера - печать всего содержимого, при невозможности - сообщение об ошибке
Synchronize Cache	35h	0o4o5o7o	Синхронизация кэша - запись несохраненных данных заданного диапазона адресов на носитель
Test Unit Ready	00h	*m	Опрос готовности ЛУ
Update Block	3Dh	7o	Обновление логического блока
Verify	2Fh	0o5o7o	Верификация - проверка возможности безошибочного считывания блоков данных с носителя
Verify	13h	1o	Тоже
Verify(10)	2Fh	4o5o7o	То же или проверка чистоты блоков (с 10-байтным блоком дескриптора)
Verify (12)	AFh	4o 5o 7o	То же с 12-байтным блоком дескриптора
Write (6)	OAh	0o 1m 4o 7o	Запись блоков данных, переданных ИУ (с 6-байтным блоком дескриптора)
Write (10)	2Ah	0o4m 7m	Запись блоков данных, переданных ИУ (с 10-байтным блоком дескриптора)
Write (12)	AAh	4o7o	То же с 10-байтным блоком дескриптора
Write And Verify	2Eh	0o4o7o	Запись блоков данных, переданных ИУ, с верификацией записи
Write And Verify (12)	AEh	7o4o	То же с 12-байтным блоком дескриптора
Write Buffer	3Bh	*o	Запись в буфер (но не на носитель) или загрузка микрокода
Write Filemarks	10h	1m	Запись маркера файлов
Write Long	3Fh	0o4o7o	"Длинная" запись - блока данных и поля ЕСС
Write Same	41h	0o	Запись блока данных, переданных ИУ, в группу смежных блоков или до конца носителя *
Выполнение команд

Рассмотрим процесс на шине SCSI на примере одиночной команды чтения Read. ИУ имеет активный набор указателей и несколько сохраненных наборов, по одному на каждый из допустимого числа одновременных конкурирующих процессов. ИУ восстанавливает указатели процесса в активный набор и, выиграв арбитраж, выбирает ЦУ. Как только ЦУ выбрано, оно берет на себя управление процессом. В фазе Selection ИУ вводит сигнал ATN#, сообщая о намерении послать сообщение Identify с указанием адресуемого ЛУ. Таким образом устанавливается связь I_T_L с данным процессом и его набором указателей. ЦУ переходит в фазу Command и принимает блок дескриптора команды Read. Интерпретировав команду, ЦУ переходит в фазу Data IN, передает данные, затем переводится в фазу Status и посылает состояние Good. Затем в фазе Message IN устройство посылает сообщение Command Complete, после чего освобождает шину (фаза Bus Free). Процесс завершен.

Рассмотрим тот же пример, но с использованием отключения от шины (Disconnect) в процессе выполнения команды. Если устройство определит, что для получения затребованных данных потребуется много времени, получив команду Read, оно освобождает шину, послав сообщение Disconnect. Как только требуемые данные готовы в ЦУ, оно, выиграв арбитраж, выберет ИУ (в фазе Reselect) и в фазе Message IN пошлет ему сообщение Identify. По определенной этим сообщением связи I_T_L ИУ восстановит соответствующий набор указателей в активный и продолжит выполнение процесса, как описано выше. Если ЦУ хочет отсоединиться, когда часть данных уже передана (например, головка дошла до конца цилиндра и требуется время на позиционирование), оно посылает сообщение Save Data Pointer, а затем Disconnect. После повторного соединения передача данных возобновится с точки, определенной последним сохраненным значением указателя. Если произошла ошибка или исключение, ЦУ может повторить обмен данными, послав сообщение Restore Pointers или отсоединившись без сообщения Save Data Pointers.

Теперь рассмотрим процесс с цепочкой связанных команд. По успешному завершению каждой команды цепочки ЦУ автоматически переходит к исполнению следующей. Все команды цепочки адресуются к одной и той же связи I_Т_х и являются частью одного процесса. Команды не являются полностью независимыми: при использовании бита относительной адресации последний блок, адресованный предыдущей командой, доступен для следующей. Так, например, можно исполнить команду Search Data, по которой на диске будет найден блок, содержащий информацию, совпадающую с эталоном поиска. Связав с ней команду чтения Read, можно прочитать этот блок или блок с указанным смещением относительно найденного. По выполнении связанных команд ЦУ посылает сообщения Linked Command Complete (возможно, с флагом), а ИУ обновляет набор сохраненных указателей так, что они указывают на очередную команду цепочки. Команды в цепочке выполняются как одиночные, но с возможностью относительной адресации.

Команды могут исполняться с использованием очередей. ЦУ могут поддерживать немаркированные и маркированные очереди. Поддержка немаркированных очередей, определенная еще в SCSI-1, позволяет любому ЛУ (LUN) или целевой программе (TRN), занятым процессом от одного ИУ, принимать команды (начинать процесс) с другими ИУ. При этом каждый процесс идентифицируется связью I_Т_х, где х - LUN или TRN.

Маркированные очереди (Tagged Queue) определены в SCSI-2 для ЛУ (LUN, но не TRN). Для каждой связи I_T_L существует своя очередь размером до 256 процессов (немаркированные очереди можно считать вырожденным случаем маркированных с одноместными очередями). Каждый процесс, использующий маркированные очереди, идентифицируется связью I_T_L_Q, где Q - однобайтный тег очереди (Queue Tag). Теги процессам назначаются ИУ, их значения на порядок выполнения операций не влияют. Повторное использование тега возможно лишь по завершении процесса с этим тегом. Постановка в очередь выполняется через механизм сообщений, при этом очередной процесс можно поставить в очередь "по-честному", а можно пропихнуть вне очереди процесс, поставленный в очередь с сообщением Head Of Queue Tag, будет выполняться сразу после завершения текущего активного процесса. Процессы, поставленные в очередь с сообщением Simple Queue Tag, исполняются ЦУ в порядке, который оно сочтет оптимальным. Процесс, поставленный в очередь с сообщением Ordered Queue Tag, будет исполняться последним. ИУ может удалить процесс из очереди, сославшись на него по тегу. Изменение порядка выполнения команд ЦУ не касается порядка команд в цепочке, поскольку цепочка принадлежит одному процессу, а в очередь ставятся именно процессы.