|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Контроллер НГМД i8272Описание работы контроллера и системы команд. i8272
|
RQM
|
DIO
|
NDM
|
CB
|
D3B
|
D2B
|
D1B
|
D0B
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
Описание разрядов регистра состояния:
RQM - Request For Master
информирует процессор о готовности к обмену данными по шине данных.
RQM = 1 - контроллер к обмену готов.
DIO - Data Input/Output
информирует процессор об ожидаемом направлении пересылки данных:
DIO = 1 - направление пересылки - в процессор (Read),
DIO = 0 - направление пересылки - из процессора (Write).
NDM - Non DMA Mode
В режиме НЕ-ПДП бит NDM = 0 показывает, что закончена фаза исполнения
команды.
CB - FDC Busy
Если бит CB = 1, это означает, что контроллер в данный момент занят
- выполняется операция чтения/записи.
DB3..DB0 - Drive n Busy
Эти биты показывают состояние каждого из 4-х накопителей. Если содержимое
бита = 1, значит для соответствующего накопителя в настоящее время выполняется
команда Seek.
В систему команд контроллера 8272 входит
15 команд. Каждая команда идентифицируется многобайтной пересылкой по
шине данных в регистр данных контроллера. Результат выполнения команды
также может быть многобайтным. Каждую команду удобно представлять состоящей
из 3-х фаз:
* Фаза приказа - контроллер принимает от процессора последовательность
байт, необходимых для выполнения команды.
* Фаза исполнения - контроллер выполняет переданную ему команду.
* Фаза результата - процессор считывает состояние контроллера после
выполнения команды и другую информацию.
На фазах приказа и результата перед передачей
каждого байта из/в регистр данных контроллера, процессор должен считывать
содержимое регистра состояния контроллера. Биты RQM и DIO регистра состояния
должны быть установлены в 1 и 0 соответственно перед тем, как очередной
байт будет передан в контроллер. Многие команды являются многобайтовыми,
поэтому для них необходимо считывать и проверять регистр состояния перед
пересылкой каждого байта в контроллер. На фазе результата биты RQM и
DIO должны быть установлены в 1 перед чтением каждого байта из контроллера.
Отметим, что чтение регистра состояния перед пересылкой каждого байта
необходимо только на фазах приказа и результата. На фазе исполнения
регистр состояния считывать не нужно. Если контроллер находится в режиме
NON DMA (НЕ-ПДП), появление очередного байта данных при чтении с диска
сопровождается появлением сигнала прерывания INT=1. При появлении сигнала
чтения (RD=0), сигнал прерывания сбрасывается и данные выдаются на шину
данных. Например, если процессор не может обслуживать прерывания достаточно
быстро (каждые 13 мксек. при двойной плотности), он может опрашивать
регистр состояния и бит D7 (RQM) соответствует сигналу прерывания. При
выполнении команды записи аналогично сигнал записи WR=0 сбрасывает прерывание.
Если контроллер находится в режиме DMA (ПДП),
то прерывание на фазе исполнения не генерируется. Контроллер в этом
случае выдает сигнал DRQ (запрос ПДП) когда появляется очередной байт
данных. Контроллер ПДП отвечает на этот запрос сигналом подтверждения
ПДП DACK=0 и RD=0. При появлении сигнала DACK сбрасывается сигнал DRQ.
При выполнении операции записи вместо сигнала RD генерируется сигнал
WR=0.
По окончании фазы исполнения (при появлении
сигнала ТС - конец счета) генерируется прерывание, означающее начало
фазы результата. При чтении первого байта результата сигнал прерывания
сбрасывается. Необходимо подчеркнуть, что на фазе результата все байты,
указанные в таблице команд, должны быть считаны процессором. Например,
команда чтения данных имеет 7 байт результата и все 7 байт должны быть
считаны в порядке, указанном в таблице команд, для успешного завершения
операции. Контроллер не воспримет следующую команду до тех пор, пока
не будут считаны все 7 байт результата после выполнения команды чтения.
Контроллер 8272 содержит 5 регистров состояния:
главный регистр состояния (Main Status Register) и регистры ST0-ST3.
Главный регистр состояния (или просто регистр состояния) может быть
считан процессором в любое время. Регистры ST0-ST3 доступны процессору
только на фазе результата и могут быть считаны им после завершения некоторой
команды. Конкретная команда определяет, сколько и какие регистры могут
и должны быть считаны. Байты данных, записываемые в контроллер на фазе
приказа и считываемые из него на фазе результата, должны следовать в
порядке, указанном в таблице команд. Изменение этих последовательностей
не допускается. После получения последнего байта команды контроллер
автоматически начинает выполнять команду, переходя к фазе исполнения.
После того, как на фазе результата считывается последний байт, контроллер
считает эту команду завершенной и готов к обработке следующей команды.
Команда может быть прекращена только подачей сигнала конца счета ТС=1.
Это удобное средство для "привлечения внимания" контроллера
в критических ситуациях.
После передачи в контроллер команды Specify,
шины выбора накопителя начинают автоматически сканироваться в промежутках
между командами (а также между импульсами шага в команде Seek). Контроллер
опрашивает состояние сигнала готовности Ready всех 4-х накопителей.
Если сигнал Ready изменяет свое состояние (обычно из-за открытия дверки
накопителя), контроллер генерирует прерывание. Процессор передачей команды
Sense Interrupt Status считывает содержимое регистра ST0 и по биту NR
(Not Ready) регистра ST0 определяет состояние накопителя.
На фазе приказа перед вводом каждого байта должен опрашиваться регистр состояния 8272. При этом биты DIO (D6) и RQM (D7) должны иметь значения 0 и 1 соответственно перед записью каждого байта команды в контроллер. Начало фазы выполнения вызывает установку этих битов в 1 и 0 соответственно.
Для задания этой команды в контроллер передается
последовательность из 9 байт (см. таблицу команд). После получения этой
последовательности контроллер выдает сигнал подвода головки к поверхности
диска (если она отведена), отрабатывает паузу для подвода головки (заданную
в команде Specify) и начинает поиск адресной метки сектора, после чего
считывает поле идентификатора сектора. Когда текущий номер сектора ("R"),
хранящийся в регистре IDR совпадает с номером сектора, считанного с
диска, контроллер начинает вводить данные из поля данных сектора и последовательно,
байт за байтом, выдавать их на шину данных.
После окончания чтения сектора контроллер
инкрементирует на 1 номер сектора и начинает считывать данные из следующего
сектора. Такой обмен носит название мультисекторного. Выполнение команды
может быть прекращено подачей сигнала TC (Terminal Count - конец счета).
После принятия сигнала ТС контроллер прекращает передачи по шине данных,
однако продолжает читать данные текущего сектора вплоть до байтов CRC-контроля,
после чего операция прекращается. Количество байт, подлежащих считыванию,
зависит от значений битов MT, MFM и N, заданных в команде.
Бит МТ задает многодорожечный (multitrack) режим контроллера, позволяющий
ему считывать данные с обеих сторон (дорожек) диска. В этом случае для
указанного цилиндра будут переданы все сектора, начиная с сектора 1
стороны 0 и заканчивая последним сектором стороны 1. Заметим, что этот
режим относится только к одному цилиндру.
В случае N=0 значение DTL определяет количество
данных, которые контроллер должен трактовать как один сектор. Если DTL
меньше истинного размера сектора, то данные из сектора после передачи
DTL байт не передаются на шину данных. Контроллер же считывает сектор
полностью, вплоть до байтов CRCконтроля и, если это задано в команде,
может продолжить мультисекторное чтение. Если N > 0, то значение
DTL игнорируется и устанавливается в 0FFH. После завершения чтения контроллер
не отводит головку накопителя от поверхности диска до истечения интервала
времени, указанного в команде Specify. Поэтому между двумя последовательными
частыми обращениями головка остается прижатой к поверхности диска.
Если контроллер второй раз обнаруживает
индексный импульс, не обнаружив правильного номера сектора (заданного
R), он устанавливает флаг ND (No Data) в регистре ST1 и заканчивает
выполнение команды (в регистре ST0 также устанавливаются биты D7 и D6
в 0 и 1 соответственно).
После чтения поля идентификатора и поля
данных каждого сектора, контроллер производит CRC-контроль считанных
байтов. Если обнаружена ошибка CRC в поле идентификатора сектора, контроллер
устанавливает флаг DE (Data Error) в регистре ST1, если же ошибка обнаружена
в поле данных сектора, контроллер устанавливает флаг DD (Data error
in Data field) в регистре ST1. В обоих случаях устанавливаются биты
D7 и D6 в регистре ST0 в 0 и 1 соответственно, и выполнение команды
завершается. Если контроллер встречает адресный маркер удаленных данных
и если бит SK (Skip - бит D5 в команде) не установлен, то контроллер
устанавливает флаг CM (Control Mark) в регистре ST2 и заканчивает операцию
после чтения всех данных сектора. Если же бит SK=1, контроллер пропускает
этот сектор и начинает считывать следующий.
Во время передачи данных процессор должен
обслуживать контроллер не реже 1 раза в 27 мксек. при одинарной плотности
и 13 мксек. - при двойной. В противном случае контроллер устанавливает
флаг OR (Over Run) в регистре ST1 и заканчивает операцию. После завершения
операции чтения (это также относится и к команде записи данных) информация,
считываемая из контроллера на фазе результата (байты C-H-R-H) зависит
от значения битов МТ и байта ЕОТ команды.
Для задания этой команды в контроллер
передается последовательность из 9 байт (см. таблицу команд). После
получения последнего байта команды контроллер выдает сигнал подвода
головки к поверхности диска (если она была отведена) и отрабатывает
задержку для подвода головки, заданную в команде Specify и начинает
поиск поля идентификатора сектора. Если текущий номер сектора ("R")
хранящийся в регистре IDR, совпадает с номером сектора, считанным с
диска из поля идентификатора сектора, контроллер последовательно, байт
за байтом, запрашивает данные у процессора по шине данных и записывает
их в поле данных сектора на диск. После окончания записи данных текущий
номер сектора увеличивается на 1 и производится запись следующего поля
данных. Такую мультисекторную операцию записи контроллер продолжает
до тех пор, пока не получит сигнал ТС (конец счета). При поступлении
сигнала ТС контроллер продолжает запись данных в текущий сектор до его
заполнения. Если контроллер принимает сигнал ТС в процессе записи данных,
то оставшееся поле данных заполняется нулями.
Контроллер считывает идентификатор каждого
сектора и производит CRC-контроль считанных байт. Если он обнаруживает
ошибку CRC в одном из секторов, он устанавливает флаг DE (Data Error)
в регистре ST1 и заканчивает операцию (в регистре ST0 биты D7 и D6 устанавливаются
в 0 и 1 соответственно).
Команда записи во многом аналогична команде
чтения данных. Ниже перечислены все характеристики, аналогичные команде
чтения данных:
* Количество передаваемых данных.
* Флаг EN (ENd of cylinder).
* Флаг ND (No Data).
* Пауза до отвода головки HUT.
* Информация, считываемая на фазе результата, если процессор прерывает
выполнение команды.
* Определение DTL, когда N=0 или N>0.
В режиме записи данные от процессора или контроллера ПДП должны приходить не реже 1 раза в 31 мксек. при одинарной плотности и 15 мксек. - при двойной. В противном случае контроллер устанавливает флаг OR (Over Run) в регистре ST1 и заканчивает операцию.
Команда аналогична команде Write Data за исключением того, что вместо адресного маркера данных записывает адресный маркер удаленных данных.
Команда аналогична команде Read Data за исключением случая, когда контроллер обнаруживает адресный маркер данных в начале поля данных сектора. Если бит SK=0, контроллер считывает все данные сектора, устанавливает флаг CM в регистре ST2 и заканчивает операцию. Если бит SK=1, контроллер пропускаетэтот сектор и переходит к чтению следующего.
Команда подобна команде Read Data за исключением
того, что данные будут считываться непрерывно из каждого сектора дорожки.
Сразу же после обнаружения индексного импульса контроллер начинает считывать
все поля данных на дорожке как непрерывный блок данных. Если контроллер
обнаруживает ошибку CRC в поле идентификатора или данных, он продолжает
считывать данные с дорожки.
Контроллер сравнивает информацию из поля
идентификатора, считанную из каждого сектора, со значением в IDR и устанавливает
флаг ND в регистре ST1, если они не совпадают. Биты МТ и SK не оказывают
влияния на контроллер. Выполнение команды заканчивается, когда контроллер
считает ЕОТ секторов. Если контроллер не нашел адресного маркера поля
идентификатора до того, как второй раз принял индексный импульс, он
устанавливает флаг МА (Missing Address Mark) в регистре ST1 и заканчивает
операцию (в регистре ST0 устанавливаются биты D7 и D6 в 0 и 1 соответственно).
Эта команда используется для определения текущего положения головки записи/чтения накопителя. Контроллер запоминает информацию, считанную из первого встреченного поля идентификатора сектора. Если до прихода второго индексного импульса контроллер не встретил адресного маркера поля идентификатора, он устанавливает флаг МА в регистре ST1. Если же контроллер не нашел данных, то он устанавливает флаг ND в регистре ST1 и операция заканчивается.
Команда форматирует всю дорожку. После
обнаружения индексного импульса на диск записываются следующие данные:
GAPS, адресный маркер, поле идентификатора и поле данных, соответствующие
стандарту IBM System 34 (одинарная плотность) и IBM System 3740 (двойная
плотность). Формат задается в команде следующими программируемыми значениями:
* N - число байт в секторе.
* SC - число секторов на цилиндре.
* GPL - длина межсекторного промежутка.
* D - байт для заполнения области данных.
Эти параметры передаются в контроллер процессором
на фазе приказа. Поле данных каждого сектора будет заполнено байтами
D. Поле идентификатора для каждого сектора задается процессором на фазе
исполнения. Необходимы по 4 значения для каждого сектора:
* C - номер цилиндра
* H - номер головки (поверхности)
* R - номер сектора
* N - код длины сектора
Это значит, что диск при необходимости,
может быть отформатирован не последовательными номерами секторов. После
форматирования каждого сектора процессор должен передать новые значения
C,H,R,N для каждого сектора на дорожке. Содержимое регистра R увеличивается
на 1 после форматирования каждого сектора, и, следовательно, этот регистр
будет содержать значение R+1 при считывании на фазе результата. Этот
процесс будет продолжаться для всей дорожки, пока второй раз не будет
обнаружен индексный импульс. После этого выполнение команды завершается.
Если при записи от накопителя принимается сигнал Fault, контроллер устанавливает
флаг ЕС в регистре ST0 и заканчивает операцию (биты D7 и D6 в регистре
ST0 устанавливаются в 0 и 1 соответственно). Отсутствие сигнала Ready
с накопителя в начале фазы исполнения также прекращает выполнение команды.
В таблице приведены соотношения между N, SC, GPL для различных размеров
секторов.
SD-(MFM=0)
|
DD (MFM = 1)
|
||||||
Сектор
|
№
|
SC
|
GPL1
|
GPL2
|
SC
|
GPL1
|
GPL2
|
128
|
0
|
1A
|
07
|
1B
|
-
|
-
|
-
|
256
|
1
|
0F
|
0E
|
2A
|
1A
|
0E
|
36
|
512
|
2
|
08
|
1B
|
3A
|
0F
|
1B
|
54
|
1024
|
3
|
04
|
47
|
8A
|
08
|
3F
|
74
|
2048
|
4
|
02
|
C8
|
FF
|
04
|
99
|
FF
|
4096
|
5
|
01
|
C8
|
FF
|
02
|
C8
|
FF
|
8192
|
6
|
-
|
-
|
-
|
01
|
C8
|
FF
|
Команды сканирования позволяют считанные
с диска данные сравнить с данными, выдаваемые процессором (контроллером
ПДП). Контроллер сравнивает данные последовательно, байт за байтом и
проверяет условия:
DD = DP DD <= DP DD >= DP,
где DD - данные с диска; DP - данные от процессора.
После проверки всего сектора, если условие
не выполняется, производится инкремент номера сектора (R + STR ->
R) и операция сканирования продолжается. Операция будет продолжаться
до тех пор, пока не произойдет одно из следующих условий:
* выполнится условие сканирования (равно, больше или меньше)
* достигнут последний сектор (ЕОТ)
* принят сигнал ТС
Если условие сканирования удовлетворено,
контроллер устанавливает флаг SH (Scan Hit) в регистре ST2 и завершает
команду. Если условие не удовлетворено в промежутке между начальным
сектором (заданным R) и последним сектором цилиндра (ЕОТ), контроллер
устанавливает флаг SN (Scan Not Satisfied) в регистре ST2 и завершает
команду.
Если во время операции поступил сигнал ТС
от процессора или контроллера ПДП, контроллер прекращает сравнение на
текущем байте и завершает команду. Ниже в таблице приведены состояния
битов SH и SN после различных условий сканирования:
Сканирование
до...
|
Рег.
ST2
|
Примечание
|
|
SN
|
SH
|
||
Равно
|
0
|
1
|
DD = DP
|
1
|
0
|
DD <> DP
|
|
Меньше или равно
|
0
|
1
|
DD = DP
|
0
|
0
|
DD < DP
|
|
1
|
0
|
DD > DP
|
|
Больше или равно
|
0
|
1
|
DD = DP
|
0
|
0
|
DD < DP
|
|
1
|
0
|
DD > DP
|
Если контроллер обнаруживает адресный маркер
удаленных данных в одном из секторов и бит SK=0, он считает этот сектор
последним сектором цилиндра, устанавливает флаг CM (Control Mark) в
регистре ST2 и завершает команду. Если же бит SK=1, контроллер пропускает
этот сектор и считывает следующий. В этом случае контроллер устанавливает
флаг CM в регистре ST2, сигнализирующий о том, что был встречен удаленный
сектор.
Когда вы программируете значения STP (STP=01
для обработки последовательных секторов, STP=02 для чтения через один
сектор) или МТ (Multitrack), необходимо помнить, что последний сектор
на дорожке должен быть считан. Например, если STP = 02, МТ = 0, сектора
пронумерованы последовательно от 1 до 26, команду Scan начинаем с сектора
21, то успешно будут обработаны сектора 21, 23 и 25. Далее сектор 26
будет пропущен, а затем придет индексный импульс. Это вызовет ненормальное
завершение операции. Если бы ЕОТ равнялось 25, а сканирование бы начиналось
с сектора 20, то операция Scan завершилась бы успешно.
Аналогично командам чтения/записи, процессор
или контроллер ПДП должен обслуживать контроллер каждые 27 мксек. при
одинарной плотности и 13 мксек. при двойной. В противном случае контроллер
выставит флаг OR (Over Run) в регистре ST1 и прекратит выполнение команды.
Головка записи/чтения накопителя перемещается
с цилиндра на цилиндр по команде Seek. Контроллер сравнивает содержимое
регистра PCN (Present Cylinder Number), который хранит текущее положение
головки и содержимое NCN (New Cylinder Number) - новое положение головки,
заданное в команде и в зависимости от результата сравнения выполняет
следующие действия:
* PCN < NCN - сигнал направления для накопителя устанавливается в
"1" и выдается импульс шага.
* PCN > NCN - сигнал направления для накопителя устанавливается в
"0" и выдается импульс шага.
Скорость выдачи импульсов шага задается
в команде Specify значением SRT (Stepping Rate Time). После каждого
импульса шага вновь сравниваются значения PCN и NCN и когда PCN = NCN,
контроллер устанавливает флаг SE (Seek End) в регистре ST0 и завершает
выполнение команды.
На фазе приказа контроллер находится в состоянии
FDC Busy (занят), однако на фазе исполнения контроллер переходит в состояние
NON Busy (не занят). Когда контроллер находится в состоянии NON Busy,
ему можно задать другие операции Seek и в этом случае команда позиционирования
будет выполняться одновременно для нескольких (до 4-х) накопителей.
Если перед началом фазы исполнения или во время исполнения команды Seek
накопитель находится в состоянии Not Ready (не готов), контроллер устанавливает
флаг NR (Not Ready) в регистре ST0 и команда завершается.
Команда переустанавливает головку чтения/записи накопителя на дорожку 0. Накопитель в этом случае должен выдать сигнал TR00. Контроллер сбрасывает содержимое регистра PCN и проверяет сигнал TR00 с накопителя. Пока этот сигнал имеет низкий уровень, контроллер устанавливает в "1" сигнал направления Dir и выдает импульсы шага на накопитель. Когда сигнал TR00 становится высоким, контроллер устанавливает флаг SE (Seek End) в регистре ST0 и завершает команду. Если после выдачи 77 импульсов шага состояние сигнала не изменилось, контроллер устанавливает флаги SE (Seek End) и EC (Equipment Check) в регистр ST0 и команда завершается. Команда может производить рекалибровку одновременно всех 4-х накопителей. Реакция на исчезновение сигнала Ready с накопителя аналогична реакции в команде Seek.
Сигнал прерывания INT генерируется контроллером
в следующих случаях:
1. На фазе результата следующих команд:
* Read Data
* Read a Track
* Read ID
* Read Deleted Data
* Write Data
* Write Deleted Data
* Format a Track
* Scan Sommand
2. Изменение сигнала Ready с накопителя
3. В конце команд Seek или Recalibrate
4. На фазе выполнения в режиме NON DMA
Прерывания в случаях (1) и (4) легко распознаются
процессором, т.к. производятся во время нормального исполнения команд.
Однако прерывания в случаях (2) и (3) могут быть идентифицированы процессором
только путем выполнения команды чтения остояния прерывания. Эта команда
сбрасывает сигнал прерывания и посредством битов 5-7 регистра ST0 процессор
может определить причину прерывания.
SE
|
Int
Code
|
Причина
прерывания
|
|
бит
5
|
бит
6
|
бит7
|
|
0
|
1
|
1
|
Изменение сигнала Readu c накопителя |
1
|
0
|
0
|
Нормальное завершение команд Seek и Recalibrate |
1
|
1
|
0
|
Ошибочное завершение команд Seek и Recalibrate |
Команды Seek и Recalibrate не имеют фазы
результата, поэтому требуется
использование команды Sense Interrupt Status для их успешного завершения
и
проверки положения головки накопителя (PCN).
Команда задает значения 3 временных интервалов
- параметров накопителей:
* HUT - пауза до отвода головки. Задает время от окончания операции
чтения/записи до момента отвода головки от поверхности диска. Время
задается в единицах по 16 мсек. и лежит в пределах 16..240 мсек.
* SRT - время шага головки. Задает время задержки между двумя последовательными
импульсами шага. Время задается в единицах по 1 мсек. и лежит в пределах
1..16 мсек. Внимание! Большие числа задают меньшее время шага: 0FH -
1 мсек., 0EH - 2 мсек. и т.д.
* HLT - время подвода головки. Задает время между выдачей сигнала подвода
головки к диску и началом операции чтения/записи. Задается в единицах
по 2 мсек. и лежит в пределах 2..254 мсек. Все временные интервалы,
указанные выше, связаны с тактовой частотой контроллера (CLK, выв.19)
и приведены для случая, когда CLK = 8 МГц (203 мм. диск). Если же CLK
= 4 МГц (133 мм. диск), то все значения уменьшатся в 2
раза. Бит ND в команде осуществляет выбор режима ПДП для контроллера:
если бит ND=1, выбирается режим NON DMA (не-ПДП), если же ND=0, то выбирается
режим DMA (ПДП).
Команда может быть использована процессором, когда ему необходимо узнать состояние накопителя. Регистр ST3 содержит информацию о состоянии накопителя.
Если в контроллер передается команда, не
опознанная как одна из вышеперечисленных, контроллер завершает команду.
В этом случае прерывание не генерируется. Биты 6 и 7 в регистре состояния
(DIO и RQM) устанавливаются в 1, указывая процессору на необходимость
выполнения фазы результата - чтения регистра ST0. В регистре ST0 находится
байт 80Н, показывающий недопустимую команду.
Необходимо отметить, что после операций
Seek и Recalibrate (возникновения прерывания после окончания команды),
контроллер должен получить команду Sense Interrupt Status, иначе он
воспримет следующую команду как недопустимую.
Пользователь при необходимости может использовать
эту команду, как команду NOP (нет операции) для приведения контроллера
в известное состояниеили в состояние без операции.
Опрос |
|
Конкурсы
|
|
Реклама |
|
Web дизайн: Бурлаков Михаил
Web программирование: Бурлаков Михаил