Black Crow
#03
27 июня 2000 |
|
Очумелые ручки - Всё о HDD IDE: Краткое описание портов и битов.
Краткое описание портов и битов контроллера Hard drive. (С) Slot & Со (R) Valerij KozHevnikov (500:95/462.18@ZXNet) ----------------------------------------- АМ - адресный маркер CRC,КЦК - контрольно-циклический код HOST - управляющий компьютер ЕСС - код обнаружения ошибки Конструктивно контроллер содержит два девайса: контроллер ОЗУ 512k и контроллер HDD. На той же платке есть еще контроллер ХТ клавы, но он абсолютно независим и тут не описывается. #FCAF (out) - управление конфигурацией контроллера. bit 7,1 - старшие биты, формирующие но- мер видеостраницы выводимой в режиме 640*200. bit 0 - (=1) подключение порта конфигу- рации ОЗУ 512k. bit 4 - (=1) блокировка reset-а порта конфигурации контроллера. bit 5 - (=1) блокировка записи и чтения всех портов контроллера. bit 6 - (=1) аппаратный reset HDD. #FDAF (out) - порт конфигурации ОЗУ. Полностью приводить не буду, но факти- чески можно иметь 4 независимых 128-х ма- шины. То есть в любой из трех нижних сег- ментов может подставляться одна из четы- рех страниц, а с адреса #С000 - любая из 32-х имеющихся. +---------+-------------+ | Сегмент | Страницы | +---------+-------------+ | #0000 | 0,8,16,24 | | | | | #4000 | 5,13,21,29 | | | | | #8000 | 2,10,18,26 | | | | | #С000 | любая | +---------+-------------+ Далее все про винт. Сразу скажу: злоу- потреблять програмными/аппаратными резе- тами не стоит. Винт паркует головы и дви- гатель отрабатывает останов/разгон. Жизни ему это не прибавит. Я вообще аппаратный ресет исключил: оторвал 1-й контакт от шлейфа, и все О`К. +-----+--------------------------+--------------------------+ | | IN | OUT | +=====+==========================+==========================+ |#FDAF|Регистр данных D8-D15 | пот used | |#FFAF| пот used |Регистр данных D8-D15 | |#FEAF|Регистр данных DO-D7 |Регистр данных DO-D7 | |#F6AF|Регистр ошибок |Регистр предкоипенсацuu | |#EEAF|Регистр счетчика секторов |Регистр счетчика секторов | |#E6AF|Регистр ноиера сектора |Регистр ноиера сектора | |#DEAF|Регистр ноиера цилиндра |Регистр ноиера цилиндра | | | (low) | (low) | |#D6AF|Регистр ноиера цилиндра |Регистр ноиера цилиндра | | | (high) | (high) | |#CEAF|Регистр накопителя/головки|Регистр накопителя/головки| |#C6AF|Регистр состояния |Регистр коианд | +-----+--------------------------+--------------------------+ |#CAAF|Регистр алютернатuвного |Управление состоянuеи на- | | |состояния |копителя | |#C2AF|Регистр адреса накопителя | пот used | +-----+--------------------------+--------------------------+ Регистры данных #FDAF, #FEAF, #FFAF используются при выполнении операций чте- ния/записи сектора в программном режиме ввода-вывода. Регистр #FEAF недоступен, пока не начнется операция чтения или за- писи. Передача данных осуществляется 16 - разрядными словами. При чтении из порта #FDAF считываются разряды D8-D15 регистра данных HDD. Для их корректного считывания предварительно необходимо считать разряды D0-D7 (порт #FEAF) регистра данных HDD. При записи сначала заносят D8-D15 в порт #FFAF, затем D0-D7 в порт #FEAF. При выполнении длинных операций чтени- я/записи (когда вместе с данными переда- ются байты КЦК) 4 байта ЕСС передаются байтами, перед передачей байтов ЕСС пов- торно устанавливается бит 3 "Data request" регистра состояния. * Такой способ передачи данных принят из-за того, что размер слова для HDD IDE - 16 бит, а размер шины - 8 бит. Поэтому одно слово данных передается/принимается двумя командами IN/OUT. Однако для уско- рения операций ввода-вывода, адреса пор- тов расположены таким образом, что воз- можно использование команд INI/OUTI. Например, чтение одного слова: LD HL,BUFFER LD ВС,#FEAF INI INI или запись: LD HL,BUFFER LD ВС,#OOAF OUTI OUTI * Адрес #OOAF взят из-за того, что ко- манда OUTI делает DEC В до пересылки в порт. Регистр ошибок #FбAF (in) определяет состояное HDD после выполнения операции. Состояное этого регистра действительно: - после выполнения команды, если уста- новлен бит "Еггог" в регистре состояния. - после выполнения команды "диагностика" или после выполнения внутренней диагнос- тики HDD по системному сбросу. В диагностическом режиме коды регистра ошибок определяют следующее: #01 нет ошибки #02 ошибка микроконтроллера #03 ошибка буферного ОЗУ #04 ошибка аппаратуры ЕСС #05 ошибка микропроцессора #8х готовь гроб, копай могилу нахрен (HDD неисправен). Значения битов регистра ошибок после выполнения команды: +-------+-------+------+-------+------+-------+------+------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | О | +-------+-------+------+-------+------+-------+------+------+ | BBK | UNC | О | IDNF | О | ABRT | TONF | AMNF | +-------+-------+------+-------+------+-------+------+------+ bit 0 - Data Adress Mark Not Found - ус- танавливается во время выполнения команды "чтение сектора", если адресный маркер данных сектора не найден после правильно- го нахождения идентификатора этого секто- ра. bit 1 - Track 0 Not Found - устанавлива- ется только в команде "рекалибровка", ес- ли после 2048 шагов не обнаружена дорожка 0. bit 2 - Aborted Command - устанавливает- ся при получении из HDD состояния "Write fault", "Not seek complete", "Drive пот ready" или когда была загружена не- действительная команда. Причина ошибки может быть определена из регистров состо- яния и ошибки. bit 3 - пот used (=0) bit 4 - ID Not Found - требуемые ци- линдр, головка, сектор не могут быть об- наружены или же произошла ошибка ЕСС в поле идентификатора. bit 5 - пот used (=0) bit 6 - Uncorrect Data - ошибка ЕСС в поле данных. Устанавливается в случае не- корректируемой ошибки. bit 7 - Bad Mark Block - в идентификато- ре обнаружена метка дефектного сектора. Регистр предкомпенсации #FбAF (out) использовался для указания номера ци- линдра с которого необходимо выполнить предкомпенсацию. В современных моделях предкомпенсацией управляет сам накопи- тель, поэтому данный регистр может ис- пользоваться для других целей. Регистр счетчика секторов #EEAF содер- жит количество секторов для операций чте- ния/записи. Значение этого регистра уменьшается на 1 при обработке каждого сектора. Передача 1 сектора происходит при значении 1, при значении 0 - 256 сек- торов. Если при выполнении мультисектор- ной передачи произошла ошибка записи или чтения очередного сектора, то передача прекращается, и в регистре счетчика сек- торов находится кол-во секторов, которое осталось после обнаружения ошибки. При успешном завершении команды содержит 0. Регистр номера сектора #E6AF содержит стартовый номер сектора для операций чте- ния-записи. После обработки каждого сек- тора содержимое инкрементируется. После завершения команды содержит номер послед- него обработанного сектора или номер сек- тора в котором произошла ошибка. Регистры младшего #DEAF и старшего #DбAF байтов номера цилиндра определяют цилиндр, для которого будет выполняться данная команда. Регистр накопителя/головки #CEAF (in/ out) имеет вид: +-------+-------+------+-------+------+-------+------+------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | О | +-------+-------+------+-------+------+-------+------+------+ | 1 | О | 1 | DRV | HS3 | HS2 | HS1 | HSO | +-------+-------+------+-------+------+-------+------+------+ bit 0-3 - двоичный код выбранной головки bit 4 - выбор HDD, 0 - накопитель 0 1 - накопитель 1 bit 5,6 - размер сектора: 00 резерв 01 резерв 10 512 байт/сектор. 11 резерв bit 7 - резерв Регистр состояния #C6AF (in) отобража- ет текущее состояние HDD. Значение этого регистра обновляется после выполнения каждой команды. Если установлен бит BSY этого регистра, то любые обращения к HDD запрещены, и значения остальных битов не- действительны. Чтение этого регистра сбрасывает аппаратное прерывание IRQ14 (в данной схеме это прерывание не использу- ется). Значения битов: +-------+-------+------+-------+------+-------+------+------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | О | +-------+-------+------+-------+------+-------+------+------+ | BSY | DRDY | WFT | DSC | DRQ | CORR | INЧ | ERR | +-------+-------+------+-------+------+-------+------+------+ bit 0 - Еггог - индицирует, что предыду- щая команда закончилась с ошибкой, и один или несколько битов установлены в ре- гистре ошибок. Используется для быстрой проверки успешного завершения команды. Сбрасывается, когда в регистр команд за- сылается новая команда. bit 1 - Index - устанавливается в 1 при каждом обороте пакета блинов. В современ- ных моделях не используется. bit 2 - Corrected Data - индицирует, что при чтении данных произошла ошибка, кото- рая была успешно скорректирована аппара- турой КЦК. Корректируемые ошибки не прек- ращают мультисекторную передачу. bit 3 - Data Request - этот бит показы- вает, что имеется запрос на обмен данными с буфером сектора при выполнении команд чтения-записи. По этому запросу необходи- мо прочитать/записать данные в буфер, в зависимости от выполняемой команды. (в данной схеме, бит схожий с этим (27-й контакт разъема) управляет сигналом /Wait CPU Z80). bit 4 - Drive Seek Complete - индициру- ет, что головки завершили операцию поис- ка. bit 5 - Write Fault - индицирует не- исправность в накопителе, или попытку ис- полнить команду "запись" с некорректными параметрами. bit 6 - Drive Ready - установленный в 1 означает готовность HDD к выполнению ко- манды. bit 7 - Busy - определяет состояние HDD. Устанавливается в 1 при выполнении коман- ды или диагностики после системного сбро- са. Когда этот бит установлен, никакие другие биты регистра состояния не являют- ся действительными. Бит Busy должен быть проверен перед чтением любого регистра состояния. Регистр команд #C6AF (out) использует- ся для загрузки выполняемой команды. Пе- ред записью команды необходимо подгото- вить файл задания - Task File (записать необходимые данные в порты #EEAF, #E6AF, #DEAF, #DбAF, #CEAF), когда HDD находится в состоянии "не занят" (Busy = 0). Выпол- нение команды начинается немедленно, с момента записи в регистр команд. Регистр альтернативного состояния #CAAF (in) содержит такую же информацию, что и основной. Различие в том, что чте- ние альтернативного регистра не сбрасыва- ет установленное прерывание IRQ14. (В данной схеме IRQ14 не используется). Регистр управления состоянием #CAAF (out) содержит три управляющих бита: +-------+-------+------+------+-------+-------+------+------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | О | +-------+-------+------+------+-------+-------+------+------+ | | | | | HS3EN | SRST | /IEN | | +-------+-------+------+------+-------+-------+------+------+ bit 1 - Interrupt Enable - бит разреше- ния прерывания от HDD к HOST. Когда этот бит активен и накопитель выбран, HOST прерывается. Сигнал к HOST IRQ14 должен быть разрешен через трехстабильный буфер. Когда этот бит не активен или HDD не выб- ран, сигнал HOST IRQ14 будет иметь высо- кий уровень. (В данной схеме это прерыва- ние не используется). bit 2 - Soft Reset - программный сброс. Для сброса HDD этот бит надо установить в 1 и затем сбросить в 0. bit 3 - Heads 3 Enable - используется для разрешения выбора головок с 8 по 15. Регистр адреса накопителя #С2AF (in) содержит номера головки и накопителя, выбранные предыдущей командой. +-------+-------+------+-------+------+------+------+------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | О | +-------+-------+------+-------+------+------+------+------+ | | /WTG | /HS3 | /HS2 | /HS1 | /HSO | /DS1 | /DSO | +-------+-------+------+-------+------+------+------+------+ bit 0,1 - Drive Select - биты выбора со- ответствующего накопителя 0 или 1. bit 2,3,4,5 - Head Select - двоичный код выбранной головки. bit 6 - Write Gate - бит выполнения за- писи, активен во время операции записи. ----- Краткое описание команд HDD IDE. Команды из Host записываются в регистр команд #C6AF и выполняются немедленно. Перед записью команды в регистрах #EEAF, #E6AF, #DEAF, #DбAF, #CEAF надо сформиро- вать файл задания (task file), который содержит данные, необходимые для выполне- ния команды. Коды команд приведены в таб- лице: +---------------------+------+------------------------------+ | | | Uсполюзyеиые регистры | | Kоианда | Код +-----+-----+-----+-----+------+ | | |#EEAF|#E6AF|#DEAF|#D6AF|#CEAF | +=====================+======+=====+=====+=====+=====+======+ | Внутренняя | #9О | | | | | D | | диагностика | | | | | | | | | | | | | | | | Фориатuрованuе | #5О | Y | | Y | Y | Y | | дорожки | | | | | | | | | | | | | | | | Uдентuфuкацuя | #EC | | | | | D | | HDD | | | | | | | | | | | | | | | | Uнuцuалuзацuя | #91 | Y | | | | Y | | параиетров HDD | | | | | | | | | | | | | | | | Рекалибровка | #1О | | | | | D | | | | | | | | | | Чтение буфера | #E4 | | | | | D | | | | | | | | | | Чтение сектора(ов) | #2Ч | Y | Y | Y | Y | Y | | | | | | | | | | Верификация | #41 | Y | Y | Y | Y | Y | | | | | | | | | | Позиционирование | #7О | | Y | Y | Y | Y | | | | | | | | | | Запuсю буфера | #E8 | | | | | D | | | | | | | | | | Запuсю сектора(ов) | #3Ч | Y | Y | Y | Y | Y | | | | | | | | | | Sleep (спатю) | #E6 | | | | | | | | | | | | | | +---------------------+------+-----+-----+-----+-----+------+ Y - регистр используется. D - в регистре #CEAF (выбор накопителя и головки) используется только выбор на- копителя. X - младшая тетрада команд чтения и за- писи сектора. X = %OOlr l - отвечает за режим длинной опера- ции. l=0 - нормальный режим, выполняются функции CRC или ЕСС. l=1 - режим длинной операции. Не вы- рабатываются байты CRC или ЕСС, возникно- вение ошибок в поле данных не проверяет- ся. При чтении/записи сектора, добавляют- ся 4 байта КЦК пользователя. r - режим повторения при возникнове- нии ошибки. r=0 повторение разрешено r=1 повторение запрещено Внутренняя диагностика (#90) - выпол- няется внутренняя диагностика HDD, по окончании которой в регистре ошибок фор- мируется код завершения. Если ошибок нет, код завершения #01. Форматирование дорожки (#50) - по этой команде записывается формат нижнего уров- ня на указанную дорожку HDD. У многих на- копителей IDE форматирование дорожки про- изводится при включении технологического режима. Идентификация HDD (#ЕС) - по этой ко- манде в секторный буфер считывается пас- порт диска и формируется запрос DRQ в ре- гистре состояния. Инициализация параметров HDD (#91) - по этой команде HDD настраивается на па- раметры задаваемые накопителю из Host. Данная команда должна выполняться после "сброса" HDD. Рекалибровка (#10) - по этой команде головки HDD устанавливаются на 0-й ци- линдр. Чтение буфера (#Е4) - по этой команде устанавливается запрос DRQ в регистре состояния. Host может прочитать содержи- мое буфера (256 слов) через регистры дан- ных. Чтение сектора(ов) (#2X) - по этой ко- манде заданный сектор считывается в сек- торный буфер (обычно 512 байт). и форми- руется запрос DRQ. Host может прочитать содержимое буфера (256 слов) через ре- гистры данных. В команде могут быть уста- новлены биты l и/или r. Содержимое ре- гистра #EEAF указывает на количество счи- тываемых секторов (если #EEAF = 0 то счи- тывается 256 секторов). Содержимое ре- гистра #E6AF указывает начальный сектор. Верификация (#41) - проверяется формат указанной дорожки. Позиционирование (#70) - головки HDD устанавливаются на указанный цилиндр. Запись буфера (#Е8) - устанавливается запрос DRQ в регистре состояния, после этого Host должен переслать 256 слов че- рез регистры данных. Запись сектора(ов) (#3X) - устанавли- вается запрос DRQ в регистре состояния, и Host должен переслать 256 слов через ре- гистры данных. После этого данные записы- ваются на магнитный диск. В команде могут быть установлены биты l и/или r. Содержи- мое регистра #EEAF указывает на коли- чество записываемых секторов (если #EEAF = 0 то записывается 256 секторов). Содер- жимое регистра #E6AF указывает начальный сектор. Sleep (спать) (#Е6) - парковка голо- вок, останов двигателя "блинов" и переход в режим пониженного энергопотребления. Любая другая команда прерывает команду sleep. В старых моделях не поддерживает- ся. ----- Адресация регистров HDD IDE. Для адресации регистров HDD IDE в ZX-NEXT используются сигналы: A5,A6,A7,A8,A9 - (селектирующие линии) формируют базовый адрес регистров HDD. A10,A11,A12,A13 - (соадресные линии) ис- пользуются при выборе регистров HDD. /WR - строб записи данных в регистры. /RD - строб чтения данных из регистров. Для выбора регистров: A5,A7,A9 = 1 A6,A8 = 0 Состояние других сигналов показано в таблице. +-----+-----+-----+-----+-----------------+-----------------+ | А1О | А11 | А12 | А13 | Чтение регистров| Запuсю регистров| | | | | | по сигналу /RD | по сигналу /WR | +=====+=====+=====+=====+=================+=================+ | О | О | О | О | #C2AF | - | | О | 1 | О | О | #CAAF | #CAAF | | 1 | О | О | О | #C6AF | #C6AF | | 1 | 1 | О | О | #CEAF | #CEAF | | 1 | О | 1 | О | #D6AF | #D6AF | | 1 | 1 | 1 | О | #DEAF | #DEAF | | 1 | О | О | 1 | #E6AF | #E6AF | | 1 | 1 | О | 1 | #EEAF | #EEAF | | 1 | О | 1 | 1 | #F6AF | #F6AF | | 1 | 1 | 1 | 1 | #FEAF | #FEAF | +-----+-----+-----+-----+-----------------+-----------------+ ----- Формат паспорта Hdd (512 байт). Все числа Нех. +------+--------+-------------------------------------------+ | Addr | Length | Значение | +------+--------+-------------------------------------------+ | ООО | О2 | Главное слово конфигурации | | ОО2 | О2 | Количество цилиндров | | ООЧ | О2 | Зарезервировано | | ООб | О2 | Количество головок | | ОО8 | О2 | Кол-во байт на дорожке | | ООА | О2 | Кол-во байт в секторе | | OOC | О2 | Кол-во секторов на дорожке | | OOE | О6 | Спецификация продавца | | О14 | 14 | Серийный ноиер (ASCII) | | О28 | О2 | Тип контроллера | | О2А | О2 | Eикостю буфера (кэша) деленая на #2ОО байт| | О2C | О2 | Значение кода ECC для коианд Long Rd/Wr | | О2E | О8 | Версия рабочих програии (ASCII) | | О36 | 26 | Моделю (ASCII) | +------+--------+-------------------------------------------+ Дальше каждый производитель волен впи- сывать что угодно. У меня далее одни ну- ли. Слово - два байта, младший/старший. ЕСС - Еггог Control Code. Из-за непонятных стандартов, ASCII выглядит в паспорте не совсем понятно. Модель stЗ144AT смотрится как ts1344TA. Значит, если понадобится вывести сие на экран, нужно поменять местами первый байт со вторым, третий с четвертым и т.д. до конца строки. Для понятности терминологии: Дисковод: Мой винт: 80 цилиндров 1001 цилиндр 2 головки 15 головок 16 секторов/трек 17 секторов/трек 256 байт/сектор 512 байт/сектор ----- Схема подключения HDD IDE к ZX SPECTRUM. Схема имеет огромный размер и набрана в условной графике обычным текстовым ре- дактором, поэтому здесь ее нет. Но она есть в приложении, так что ищите там. Здесь только комментарии :( Все микрухи - серии 1533. D1 ИД7 D2 ЛЕ1 D3 ЛЛ1 D4 АПб D5 ТМ9 D8 ЛП8 D9 ЛН1 D10 ЛИ1 D11,12 ИР23 D10 в принципе можно не ставить, она чисто буферизующая, но я бы не стал сое- динять напрямую шины компа и винта. D6 и D7 отвечают за управление памятью 512k и на схеме не показаны. Микрухи были вычис- лены мной по памяти со справочником в ру- ках. Диоды - любые маломощные, например КДS22. Неуказанные номиналы резисторов некритичны, подбираются на глаз, в диапа- зоне 1.5 - 10 k. Схему я распечатал, и долго сравнивал с оригиналом, глюков вро- де не нашел. Транзистор VT1 отвечает за блокировку аппаратного ресета порта #FCAF. Можно поставить любой подходящий. Сбросить винт можно аппаратно (битом 6 регистра #FCAF), либо через soft reset в регистре управления состоянием (бит 2 в #CAAF). При ресете винт паркует головы и отрабатывает останов/разгон двигателя, а это ему никакой пользы не приносит. У ме- ня винт нельзя сбросить аппаратно (ресет на шлейфе перекушен), и все рулезз. Единственный способ полностью остановить движок - команда "sleep", т.е. "спать", так что все ОК.
Другие статьи номера:
Похожие статьи:
В этот день... 5 октября