После перерыва в год, мы выпускаем новую публикацию по исследованию WD21000. Такая длительная пауза была обусловлена постепенным усилением технологической базы всех проводимых исследований, как программных, так и аппаратных. Итак, после того, как уровень поднят, можно пользоваться наработками.
Начнем с того, что обновлена принципиальная схема. Уточнено подключение процессора 80С196.
А еще вкусного в этом посте то, что он сопровождается ассемблер-листингом из IDA базы на github.
Итак, пришло время задействовать анализатор. Подключение к шине процессора рассматривалось тут (часть 16).
Теперь, хорошо бы понять, как идет управление шпиндельным двигателем, а именно: разгон, стабилизация скорости и торможение. Плюс еще в микросхеме WD61C13A находится синтезатор частоты. Возможно, он как-то тоже управляется. Полученные знания попробую протестировать на макете — при помощи подключенного к этой микросхеме процессора STM32 (Часть 15)
Еще важный момент. У автора этого опуса нет глубоких знаний ассемблера процессора 80С196, так как он никогда не писал на нем программы и не отлаживал их. Нет коллекции библиотек и исходников для него, чтобы что-то посмотреть по аналогии. Автор знакомится с героем своего повествования по мере написания этого текста. Поэтому, набираться опыта и знаний нужно по схеме: смотрим анализатором, как работает и ищем это в коде. Находим — хорошо! Пытаемся понять зачем. А вот если не находим, то отмечаем, что есть какое-то непонимание. Формулируем вопрос и заносим его в список неизвестного.
Для решения задачи потребуется прибор, назовем его «счетчик/синхронизатор». Проблема в том, что анализатор ловит случайный пакет по входу синхронизации. Не получается посмотреть, например, первый от включения диска запрос к интересующей микросхеме, второй и так далее.
Чтобы посмотреть номерные обращения нужен счетчик импульсов сигнала «CS3#», который когда досчитает до заданного номера выдаст сигнал синхронизации. А уже от этого сигнала сработает анализатор и запишет кадр.
Проект счетчика/синхронизатора сделан в среде Arduino под плату STM32 Nucleo-64, F091RC.
Исходный код программы на github.
Для того, чтобы среда разработки Arduino могла работать с STM32 нужно поставить соответствующий модуль.
Используется аппаратный таймер в режиме счета импульсов, поступающих на вход «D2».
В процедуре void InputCapture_IT_callback(void) есть условие вида:
« if(isInputCapture >= 9) {», где число 9 задает количество отсчетов до срабатывания выхода «D4».
Процесс постановки опыта по записи осциллограммы одного обращения по сигнал CS3#:
1) установить значение условия срабатывания;
2) собрать и загрузить программу в плату;
3) запускать кнопкой RUN/STOP осциллограф в режим ожидания сигнала триггера;
4) подавать питание на жесткий диск.
Тестовая установка:
Пример осциллограммы цифрового анализатора:
Захват кадра цифровым анализатором (триггер) производится от положительного перепада на аналоговом канале 1 осциллографа. Так сделано потому, что по какой-то странной причине от цифрового входа захват кадра работает неверно. Аналоговый канал 1 подключен к сигналу срабатывания платы счетчика/синхронизатора, описанному выше.
Подключение цифрового анализатора к плате жесткого диска:
D0-D7 — младшие 8 бит шины данных процессора;
D8 — сигнал ALE, который показывает, что по линиям данных передается адрес;
D9 — сигнал WR#, в момент активности которого производится запись данных;
D10 — сигнал RD#, в момент активности которого производится чтение данных;
D11 — сигнал EXTINT1 обозначающий запрос на прерывание от микросхемы WD61C13A (в данном исследовании не используется).
А теперь, результаты поисков номерных транзакций — в студию! Сканирование первых 9 обращений к WD61C13A и сравнение с дизассемблером.
Шаг сканирования 0.
Какая-то странность первого срабатывания. Объяснения почему так у меня нет.
Видно, что CS3# длиться несколько транзакция явно не относящихся к обращению к микросхеме WD61C13A.
Шаг сканирования 1.
Белая вертикальная пунктирная линия соответствует фазе адреса. К микросхеме подключены только 8 бит шины адрес/данные. В этой фазе бит D0 = 1, D1 = 1, D2 = 0, D3 = 0, D4 = 0, D5 = 1, D6 = 0 и D7 = 1. Собираем биты: D[7:0] = 10100011 или в шестнадцатиричной форме 0xA3.
Найденный фрагмент кода:
Инструкция stb записывает байт регистра EAX в ячейку памяти соответствующую обращению по CS3# и адресу 0xA3.
Когда сигнал D9 в нуле, а он соответствует сигналу процессора WR#, производится передача и запись байта данных в выбранный ранее адрес. Собираем из осциллограммы байт данный так же, как выше был собран байт адреса: D0 = 1, D1 = 0, D2 = 0, D3 = 0, D4 = 1, D5 = 1, D6 = 0 и D7 = 0. Собираем биты: D[7:0] = 00110001 = 0x31. В найденном фрагменте кода инструкция ldb загружает младший байт регистра EAX как раз кодом 0x31.
От старта программы управления диском — это действительно первое обращение. Все сошлось, т.е. мы явно на верном пути!
Шаг сканирования 2
Адрес: D[7:0] = 10000100 = 0x84.
Запись данных: D[7:0] = 11111111 = 0xFF.
Найденный фрагмент кода:
Шаг сканирования 3
Адрес: D[7:0] = 10000100 = 0x81.
Запись данных: D[7:0] = 00001100 = 0x0C.
Адрес: D[7:0] = 10000100 = 0x81.
Запись данных: D[7:0] = 00000000 = 0x00.
Найденный фрагмент кода:
Шаг сканирования 4
Адрес: D[7:0] = 10011000 = 0x98.
Обе записи 16-и битные!
Запись данных: D[7:0] = 10110100 = 0xB4.
Найденный фрагмент кода:
Шаг сканирования 5
Адрес: D[7:0] = 10100010 = 0xA2.
Запись данных: D[7:0] = 00000010 = 0x02.
Найденный фрагмент кода:
Шаг сканирования 6
Адрес: D[7:0] = 10000001 = 0x81.
Запись данных: D[7:0] = 00000001 = 0x01.
Найденный фрагмент кода:
Шаг сканирования 7
Адрес: D[7:0] = 10011100 = 0x9C.
Чтение данных: D[7:0] = 00010101 = 0x15.
Адрес: D[7:0] = 10011100 = 0x9С.
Запись данных: D[7:0] = 00000000 = 0x00.
Найденный фрагмент кода:
Шаг сканирования 8
Найденный фрагмент кода:
Выводы:
1) Похоже, что STM32 как устройство-счетчик не особенно подходит. Он работает, но явно пропускает события. Нужно делать подобное устройство на ПЛИС. Но есть проблема с 5-ю вольтами…
2) Можно переходить к повторению всего наблюдаемого на своем макете, о котором говорилось в части 15.
Не забывайте делать бэкап. До новых встреч!
PS. Все публикации этой серии доступны по метке «WD21000».