Изобретаем жесткий диск. Коммутатор головок. Часть 17.

В этой части изучения жесткого диска WD21000 несколько отойдем от плана и немного дополним принципиальную схему и дизассемблер. В прошлой модификации схемы оставались не тронутыми две дискретные микросхемы: инвертор 74LS05 с обозначением U7 и компаратор LM339 с обозначением U8. Хорошо бы уточнить их функции (напоминаю, текущая версия срисованной схемы выложена тут).

Отдельные элементы этих микросхем участвуют в реализации функции выбора магнитной головки. В процессе «прозвона» схемы, я вспомнил, что когда-то в далеком 2000-ом году на заре становления комплекса PC-3000 написал программу, помогающую отключать головки на этих дисках. Такая программа нужна была потому, что на плате не использовалось флэш-пзу и конфигурацию головок нельзя было просто записать в виде таблицы некой карты. Поэтому, вариантов отключения головок было ровно два: модифицировать код в ПЗУ или спаять схему изменения кода выбора головки (на жаргоне тогдашних ремонтников это называлось «перекоммутация»). Собственно, моя программа — это генератор таких схем в зависимости от уже привычной нам в современном мире карты физических головок в виде галочек.

Вот так выглядит интерфейс программы:

pcwdcom_1

Слева карта голов, правее по центру схема выбора головки. Когда все головки включены, то отображается оригинальная схема, реализованная на плате жесткого диска.

В созданной автором реверсированной KiCad схеме эта схема из программы выглядит так:

head_sel_sch

Для некоторых вариантов карты схема «перекоммутации» простая:

pcwdcom_3

Для отключения головки 2 достаточно поменять проводники местами.

Однако, есть схемы, где требуется припаять дополнительную логическую микросхему «И», что делает «перекомутацию» затейливым трюком с проводками и паяльником:

pcwdcom_4

Микропрограмма определяет количество установленных головок в гермоблоке по номиналу резистора между 16-ым выводом разъема J1 и GND, установленного внутри гермоблока.

На элементе компаратора U8A реализована функция определения, какой номинал резистора установлен в гермоблоке. Для этого при помощи PWM выхода P4.0 устанавливается пробное напряжение и смотрится, срабатывает ли компаратор или нет. Как это выглядит в микропрограмме автор пока не искал.

Таблица соответствия моделей семейства и номиналов резистора в гермоблоке:

pcwdcom_5

Встроенный хелп выглядел так:

pcwdcom_2

Написание хэлпа, помнится заняло больше времени, чем написание самой программы, так как хотелось разложить все по полочкам.

Обращение к выбору головки в дизассемблере выглядит так:

wd_head_sel_diz

word_56 содержит нормальный номер головки, но мы помним, что его нужно преобразовать к инверсному виду и сместить в биты 5,6 и 7 регистра выдачи данных порта. В коде это делается через таблицу по адресу 0xA2B4:

wd_head_sel_diz1

Видимо, так быстрее, чем использовать битовые операции и сдвиг.

Не забывайте делать бэкап. До новых встреч!

 

 

Поделиться ссылкой на пост в соц. сетях

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *