Бытовой ретро-компьютер своими руками http://forum.pk-fpga.ru/ |
|
АРХИТЕКТУРА КОНТРОЛЛЕРА IDE ВИНЧЕСТЕРА ДЛЯ БК http://forum.pk-fpga.ru/viewtopic.php?f=39&t=5401 |
Страница 1 из 1 |
Автор: | Voland [ 02 июн 2013, 10:20 ] | |||||||||
Заголовок сообщения: | АРХИТЕКТУРА КОНТРОЛЛЕРА IDE ВИНЧЕСТЕРА ДЛЯ БК | |||||||||
<Не для распространения. Версия 1.21 от 27.01.95> КОНТРОЛЛЕР IDE ВИНЧЕСТЕРА ДЛЯ БК Плата контроллера выполняет функции формирователя интерфейсных сигналов, дешифратора адресов для регистров НЖМД, имеет свое ПЗУ (160000-167777) со слегка модифицированной 326-прошивкой и базовым драйвером НЖМД и статическое ОЗУ (170000-176777). ДЛЯ ГУРМАНОВ: драйвер расширенной арифметики в 326-ой прошивке оставлен, но, в целях экономии места, заменен на более короткий (старая длина - 2400, новая - 776 байт, но без поддержки FIS). Существует возможность подключения пользовательского драйвера арифметики, например, поддерживающего FIS или более оптимального по быстродействию. Существующая идеология позволяет подключать любые IDE-накопители емкостью до 2 ГБайт (63. сектора, 16. головок, 4095. дорожек). Накопитель может быть разбит не более, чем на 124. логических диска произвольного об'ема (от 5 кБ до 32 МБ каждый). РЕГИСТРЫ НЖМД Адрес регистра Назначение ЗАМЕЧАНИЯ: 1. 177741 не старший байт 177740, а самостоятельный регистр, расположенный по нечетному адресу (аналогично и 177743). 2. Ввиду того, что у НЖМД и БК разные понятия 0 и 1 на шине (единице на шине БК соответствует низкий уровень напряжения, а на шине НЖМД - высокий), под фразой "бит установлен" следует понимать его отсутствие, т.е. все данные представлены в инверсном коде. 3. Все коды ошибок, команды и константы, относящиеся к регистрам НЖМД, даны в восьмеричном коде и проинвертированы (т.е. "готовы для употребления"). 4. ДЛЯ ПРОГРАММИСТОВ: Байтовые команды записи в ОЗУ платы контроллера НЕ РАБОТАЮТ. Регистр данных (177756) используется для обмена данными с НЖМД. Передача данных осуществляется словами. При выполнении длинных операций байты ЕСС передаются байтами. Регистр ошибок (177754) определяет состояние НЖМД после выполнения операции. Состояние этого регистра действительно: 1) после выполнения команд, если установлен бит ERR регистра состояния; 2) после выполнения внутренней диагностики НЖМД при включении питания. В диагностическом режиме и после выполнения команды "Внутренняя диагностика" содержимое регистра ошибок указывает на следующее:
Остальные коды говорят о полной неисправности накопителя. Значения битов регистра ошибок после выполнения других команд:
Регистр счетчика секторов (177752) содержит количество секторов, требующееся для операции. Передача одного сектора происходит при значении 376, двух - при значении 375 и т.д.. Если при выполнении передачи произошла ошибка записи или чтения очередного сектора, то передача прекращается и в регистре находится количество не переданных секторов, оставшееся после обнаружения ошибки. При успешном завершении команды содержимое этого регистра равно 377. Регистр номера сектора (177750) содержит стартовый номер сектора. После обработки каждого сектора содержимое этого регистра корректируется. После выполнения команды в данном регистре находится номер последнего обработанного сектора или номер сектора, в котором произошла ошибка. Нумерация секторов производится, начиная с 1 (т.е. 376 - 1-й сектор, 375 - 2-й и т.д.). Максимальный номер стартового сектора (а также максимальный номер головки) определяется при конфигурации НЖМД. Регистр младшего (177746) и старшего (177744) байтов номера дорожки определяют номер начальной дорожки для которой будет выполняться команда. Регистр выбора НЖМД/номера головки (177742) имеет следующий вид:
Например: 377 - головка 0, привод 0; 376 - головка 1, привод 0 и т.д.. ПРИМЕЧАНИЕ: Базовый драйвер, размещенный в ПЗУ платы контроллера поддерживает только один привод. Для двух накопителей, а также для других нужд существует возможность размещения в ОЗУ платы контроллера драйвера пользователя. Регистр состояния (177740 по чтению) отображает текущее состояние НЖМД. Значение этого регистра обновляется после выполнения каждой команды. Если установлен бит BSY этого регистра, то любые обращения к НЖМД запрещены и значения остальных битов недействительны. Значения битов регистра состояния:
Регистр команд (177740 по записи) используется для загрузки кода выполняемой команды. Перед записью кода команды необходимо поместить нужные данные в регистры 177742-177752, когда НЖМД находится в состоянии не занято (BSY сброшен). Команда начинает выполняться сразу же после записи кода в регистр. Регистр альтернативного состояния (177743 по чтению) содержит такую же информацию, как и регистр состояния. Различие заключается в том, что чтение этого регистра не сбрасывает установленное прерывание IRQ14 от НЖМД (в БК не используется). Регистр сброса (177743 по записи) содержит следующие управляющие биты:
Регистр адреса накопителя (177741 по чтению) содержит номер головки и НЖМД, выбранные в предыдущей операции.
КОМАНДЫ НЖМД Команды записываются в регистр команд. Если биты DRDY и BSY регистра состояния указывают, что НЖМД готов для приема следующей команды, то вначале должны быть правильно установлены все необходимые параметры в регистрах 177742-177754. Команда начинает выполняться сразу же после ее записи в регистр. После выполнения начальной фазы команды бит BSY сбрасывается, и DRQ-бит указывает на необходимость приема/передачи данных. При установленном DRQ программа принимает 256. слов из буфера сектора через регистр данных или передает их туда. НЖМД сбрасывает DRQ-бит и продолжает выполнение команды, до тех пор, пока значение счетчика секторов не уменьшится до 0. Коды команд (восьмеричные, даны уже в инверсном виде): Рекалибровка 357
СТРУКТУРА ПАСПОРТА НЖМД Смещение Назначение ЗАМЕЧАНИЕ: При обработке полей 24-47, 56-65 и 66-135 следует делать операцию SWAB. Не забывайте также об инверсии. Помимо этих команд существуют и другие: например, выключающие двигатель НЖМД для уменьшения потребляемой мощности (так называемые "Power Save" команды), блокирующие внутренний кэш-буфер накопителя, читающие список дефектных блоков, читающие несколько секторов как один блок и др.. Но у фирм-изготовителей НЖМД нет единого стандарта на эти команды, поэтому здесь приведен только общий набор команд, выполняемых ЛЮБЫМИ IDE накопителями. ЗАПРОСЫ К ДРАЙВЕРУ НЖМД БЛОК ПАРАМЕТРОВ Структура блока параметров драйвера НЖМД полностью идентична структуре блока параметров драйвера дисковода. Соответствующими остаются и точки входа для чтения/записи. Под номером привода теперь следует понимать: 0-1 - дисководы (A:, B:), остальное - логические диски НЖМД (C:, D:, ...). НЖМД может быть разбит не более чем на 124 логических диска произвольного об'ема. Записи о логических дисках находятся в таблице разделов, к которой предусмотрен программный доступ (см. ниже). Нумерация логических дисков производится, начиная с нуля (устройству C: соответствует логический диск с номером 0 и т.д.). Не рекомендуется разбивать накопитель на слишком большое количество логических дисков, потому, что в этом случае затрудняется доступ к ним из операционных систем (не хватает букв), немного замедляется доступ при поблочном чтении через 160004 (т.к. каждый раз пересчитывается CRC таблицы разделов и области конфигурации), да и разобраться в таком обилии информации довольно тяжело. ЗАМЕЧАНИЕ: Здесь и далее не следует путать логические диски операционных систем (RT11, MKDOS и др.) с логическими дисками НЖМД. ТОЧКИ ВХОДА В ДРАЙВЕР 160000 Автоматическая загрузка Если номер начального блока находится вне пределов логического диска, то драйвером генерится ошибка 5 и обмен данными с системой не производится. Если при чтении/записи пересекается граница логического диска, также выдается ошибка 5, но передается максимально возможное количество данных. Если логический диск не определен, выдается ошибка 3. Если НЖМД не подключен или не выдает сигнал готовности в течение определенного промежутка времени, выдается ошибка 6. При каждом новом обращении к НЖМД производится подсчет CRC таблицы разделов и области конфигурации (простое сложение без учета переноса) и сравнение ее с эталоном, находящимся в области служебной информации. В случае несовпадения таблица разделов и конфигурация повторно считываются в память, заново вычисляются контрольная сумма и количество доступных логических дисков, выполняется программный сброс накопителя, переустановка его параметров (как при загрузке) и выдается ошибка 13(8). Обмен данными не производится. Последующие обращения к НЖМД происходят нормально. Ошибка 13(8) является сигналом порчи таблицы разделов или области конфигурации и позволяет выявить программу, которая умышленно или неумышленно это сделала. ЗАМЕЧАНИЕ: Под областью конфигурации понимаются поля HD$TRK, HD$HEA, HD$SEC и HD$LOG области служебной информации. 160006 Чтение/запись по номеру сектора, головки и дорожки Номер привода при чтении никакой существенной роли не играет, необходимо только, чтобы он был больше или равен 2. Запись же возможна лишь при номере привода, равном 377 (octal), при попытке записи с номером привода от 2 до 376 выдается ошибка 1. Чтение и запись возможны в пределах всего накопителя, разбиение на логические диски не анализируется. При выходе за пределы конфигурации НЖМД, выдается ошибка 5. ЗАМЕЧАНИЕ: после окончания работы подпрограмм драйвера, связанных с передачей информации (160000-160006, 160012), в R4 помещается адрес регистра ошибок с целью нейтрализации действий программ, которые заносят 0 (и не только) в @R4. 160010 Инициализация блока параметров. При обращении к дисководам производится форматирование текущей дорожки с текущей стороны. Для НЖМД выполняется команда 'Верификация дорожки'. 160016 Точка входа эмулятора расширенной арифметики Эмулируются команды EIS: MUL, DIV, ASH и ASHC. Чтобы подключить эмулятор, занесите адрес его начала в вектор 10(8). При прерывании по резервной команде происходит обращение к эмулятору. Если код команды, вызвавшей прерывание, не является кодом одной из вышеперчисленных команд, происходит выход по вектору 4 с установленным битом C (стандарт RT11), иначе - выполняется программная эмуляция команды. Имеется возможность подключения пользовательского драйвера расширенной арифметики (см. ниже). ТАБЛИЦА РАЗДЕЛОВ И СЛУЖЕБНАЯ ИНФОРМАЦИЯ Статическое ОЗУ расположено по адресам 170000-176777. При работе базового драйвера используются следующие области памяти: HD$TRK (176776) - число дорожек НЖМД; Таблица разделов НЖМД начинается с адреса 176766 и имеет стековую структуру (растет вниз). Каждая запись о логическом диске занимает 2 слова и имеет следующий формат: - слово с большим адресом содержит номер дорожки и головки начала логического диска (мл. 4 бита - номер головки, остальные 12 бит - номер дорожки). Если это слово отрицательно (инверсия по COM), то считается установленной защита записи и при попытке записи выдается ошибка 1; - слово с меньшим адресом содержит длину логического диска в блоках (максимум: 65535 блоков - 32 Мб). В слове, следующем за последней записью таблицы разделов, находится CRC таблицы разделов и области конфигурации. В базовом драйвере НЖМД предусмотрен доступ к таблице разделов. Для общей совместимости с последующими версиями рекомендуется пользоваться им, а не обращаться напрямую к области дополнительного ОЗУ. Итак: если при вызове 160004 (при 160006 не работает!) указать в R1 число слов для пересылки равное нулю, драйвер возвратит следующую информацию: R0 - размер данного логического диска в блоках (номер привода берется из 34(R3)); R1 - номер дорожки/головки начала логического диска в формате, описанном выше; в область памяти, начиная с адреса из R2 (если R2 не равно нулю) передается следующее: Смещение Содержимое Кроме того, вычисляются координаты (дорожка, головка, сектор) блока, который был указан в R0 на входе. Если номер блока находится за пределами логического диска, вычисляются координаты последнего доступного блока данного диска. Вычисленные параметры помещаются в соответствующее место блока параметров (см. описание точки входа 160006). После выполнения операции R2 портится. БУДЬТЕ ВНИМАТЕЛЬНЫ! При подключенном драйвере пользователя эта функция не работает, если последний ее, конечно, не выполняет. Под служебные нужды отводится нулевая сторона (головка 0) нулевой дорожки. Первые 7 блоков этой области занимает основной загрузчик (Master Boot Record - MBR), который при каждой загрузке с винчестера считывается в ОЗУ с адреса 10000 и запускается, если его первая команда - NOP. Каждая перезагрузка с НЖМД вызывает обновление в памяти копии таблицы разделов, области конфигурации и проверку их CRC. В седьмом блоке (восьмом секторе) хранится копия области ОЗУ 176000-177000. АЛГОРИТМ ЗАГРУЗКИ Алгоритм загрузки следующий:
В случае ошибки загрузка продолжается с дисководов A и B, если загрузка автоматическая, или, в противном случае, прекращается. ПОДКЛЮЧАЕМЫЙ ДРАЙВЕР ПОЛЬЗОВАТЕЛЯ Подключаемый драйвер пользователя может располагаться в любом месте ОЗУ. Чтобы его подключить, необходимо по адресу 175776 записать адрес его начала. Первой командой драйвера должна быть NOP, далее идут: 1) точка входа по 160004; 2) точка входа по 160006; 3) точка входа по 160012. Предполагается, что драйвер пользуется тем же блоком параметров, что и базовый. Управление драйверу пользователя передается сразу же после вызова базового драйвера, никаких действий по обработке параметров не производится, номер привода не анализируется, контрольная сумма на считается. Драйвер пользователя возвращает управление базовому, признак ошибки должен находиться в блоке параметров (57(R3)). Коды ошибок стандартные, бит C роли не играет. Управление может возвращаться несколькими способами:
Если RTS PC заменить на JSR PC,@(SP)+ (естественно, в первом случае этого делать не следует), то управление от драйверов дисковода или НЖМД будет, по окончании, возвращено в драйвер пользователя. Существующая система подключаемых драйверов позволяет создавать уникальные драйверы на любой вкус! Например, можно "отключить" дисководы, "переместив" все логические диски вниз (чтобы не "пропадали" буквы, если вы работаете без дисководов); можно сделать "дырку" для работы с электронным диском. РАСПРЕДЕЛЕНИЕ ДОП.ОЗУ 170000-175770 В процессе работы программы могут занимать участки доп.ОЗУ и освобождать их в произвольной последовательности. Для бесконфликтной работы программ необходимо придерживаться следующих требований: - резиденты, размещаемые в доп. ОЗУ, должны быть перемещаемыми; - программа, которой необходим участок доп. ОЗУ, должна захватывать свободную область, начиная с первой же свободной ячейки. Первое слово свободного участка равно 0; - в первое слово занимаемого участка вписывается длина этого участка в байтах, в ячейку над этим участком заносится 0. Со второго слова участка начинается список адресов ячеек-указателей, через которые производится адресация к данному участку памяти, список оканчивается нулем. Со следующего адреса располагается тело резидентной программы. В случае, если какая-либо программа будет освобождать участок доп. ОЗУ ниже рассматриваемого, она должна будет переместить вниз каждый расположенный выше резидент, но перед этим вычесть величину смещения из содержимого тех ячеек-указателей, адреса которых находятся в списке перед телом каждого резидента. ПРИМЕР: В этом примере после, например, переименования логических дисков драйвером-2 (часто бывает нужно для непонятливых программ переименовывать диски в A: или B:), управление будет передано драйверу-1, о предназначении которого автору драйвера-2 скорее всего и неизвестно. Причем не составляет труда удалить драйвер-2 и скорректировать HD$USR... ПРИЛОЖЕНИЕ НАЗНАЧЕНИЕ ВЫВОДОВ IDE-ИНТЕРФЕЙСА Все сигналы IDE-интерфейса является TTL-совместимыми. I/O указывает направление сигнала. "I" означает вход жесткого диска, "O" - выход. Сигналы, начинающиеся с "/", при низком уровне имеют свое активное состояние. ────────┬────────┬─────┬──────────────────────────────────────── ВЫБОР РЕГИСТРОВ ВВОДА/ВЫВОДА IDE-ИНТЕРФЕЙСА ──────────────────┬─────┬─────┬─────┬─────┬───── ПРИМЕЧАНИЕ: 0 - низкий уровень сигнала, 1 - высокий. ОБОБЩЕННЫЙ АЛГОРИТМ РАБОТЫ НЖМД IDE После подачи питающего напряжения на НЖМД или активизации интерфейсного сигнала /RES, схема сброса накопителя подает сигнал RESET на управляющий микропроцессор, который отрабатывая свою микропрограмму, инициализирует состояние портов ввода/вывода (из-за этого, как правило, останавливается шпиндельный двигатель), очищает рабочую область памяти, программирует однокристальный микроконтроллер и все программируемые микросхемы находящиеся на внутренней шине данных НЖМД. После этого управляющий микропроцессор опрашивает внутренние сигналы работы накопителя и подает сигнал на запуск шпиндельного двигателя. Следующий этап работы микропрограммы - проведение внутреннего теста НЖМД, при котором проверяются: ОЗУ буфера данных, однокристальный микроконтроллер и состояние входных сигналов микроконтроллера со стороны порта НЖМД. После этого управляющий микропроцессор, анализируя период следования импульсов индекс, ожидает, пока шпиндельный двигатель не наберет заданных оборотов и, как только это произойдет, микропроцессор, управляя схемой позиционирования и однокристальным микроконтроллером, перемещает магнитные головки в зону где записана служебная информация и пересылает ее в буферное ОЗУ для дальнейшей работы. После этого управляющий микропроцессор устанавливает биты DRDY и DSC, сбрасывает бит BSY в регистре состояния НЖМД, а в регистр ошибок пересылается код "ошибок не обнаружено" (данные регистры находятся в однокристальном микроконтроллере). Накопитель в таком состоянии может находиться сколь угодно долго ожидая, пока не произойдет запись в регистр команд. Управление НЖМД IDE производиться с помощью программно доступных регистров 177740-177756, 177741 и 177743 со стороны компьютера. Перед записью команды необходимо проверить бит BSY регистра состояния НЖМД, он должен быть сброшен. После этого подготавливается так называемый файл задания - заполняются регистры, которые участвуют в выполняемой команде (регистр номера сектора, регистр накопителя/головки и т.д.) и в регистр 177740 пересылается команда. После записи в регистр команд однокристальный микроконтроллер формирует запрос прерывания к управляющему микропроцессору MCINT (Micro Controller Interupt) не следует путать с IRQ14. Обрабатывая процедуру прерывания, управляющий микроконтроллер накопителя устанавливает в регистре состояния НЖМД бит BSY, считывает и интерпретирует содержимое регистра команд. Если ошибочно была подана несуществующая команда, то в регистре ошибок устанавливается бит ABRT, а в регистре состояния устанавливается бит ERR и сбрасывается бит BSY, после чего НЖМД готов к приему следующей команды. Если код команды распознан, то управляющий микропроцессор считывает из микроконтроллера содержимое регистров, участвующих в выполнении данной команды и управление передается на процедуру обработки этой команды, по завершении которой сбрасывается бит BSY регистра состояния. При возникновении ошибки дополнительно формируется регистр ошибок и устанавливается бит ERR в регистре состояния. ЛИТЕРАТУРА
Н. Подкопаев, В. Новак 1994-1995 Исходный текст с оригинальным форматированием: |
Автор: | Voland [ 23 июн 2013, 17:52 ] |
Заголовок сообщения: | Re: АРХИТЕКТУРА КОНТРОЛЛЕРА IDE ВИНЧЕСТЕРА ДЛЯ БК |
Происхождение информации неизвестно. Таблица разделов и служебная информация на HDD под контроллер АльтПро Под служебные нужды отводиться 0 сторона 0 дорожки. Первые 6 блоков этой области занимает основной загрузчик (MBR), считывающийся при загрузке в статическое ОЗУ с адреса 170000. Первой командой MBR и нулевого блока любого логического диска, с которого производиться вторичная загрузка, должна быть NOP (240). В 6 блоке (7 секторе) храниться конфигурация накопителя (задействованы только 4 первых слова):
Я такого на своих винтах не видел, поэтому без комментариев. А вот это более реальная информация. Таблица разделов храниться в 7 блоке (8 секторе) служебной области. Данные идут в сторону уменьшения адресов (все данные слова):
-2 - кол-во головок -4 - кол-во секторов -6 - кол-во логических дисков (в старшем байте устройство загрузки по умолчанию A-0...C-2....) Записи о логических дисках идут по порядку, начиная с логического диска с номером 0. Формат записи следующий: 1 слово - номер головки (младшие 4 бита) и номер дорожки (остальные 12 бит) 2 слово - объём логического диска в блоках ( предполагается, что каждый лог. диск начинается с 1 сектора дорожки, определённый 1 словом). |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |