Изобретаем жесткий диск. Часть 3. Удалось прочитать ПЗУ.

В прошлом выпуске была реализована плата-переходник для подключения ПЗУ к плате Arduino MEGA2560. С тех пор удалось протестировать плату, написать и запустить программу чтения данных из ПЗУ.

На рисунке ниже показан основной цикл программы. Полностью программу можно скачать с репозитория проекта на GitHub.

Отрывок программы для Arduino для чтения ПЗУ WD21000

Отрывок программы для Arduino для чтения ПЗУ WD21000

Основной цикл void loop() обрабатывает две команды, подаваемые от ПК к устройству чтения ПЗУ платы Arduino: „d“ и „r“.

Команда „d“ считывает одно слово wData (2 байта) из ПЗУ по текущему адресу в переменной romAddress, выполняет инкремент romAddress и передает через последовательный порт в компьютер прочитанное слово в виде текстовой строки с шестнадцатиричным представлением значения. Еще программа следит за тем, чтобы возвращаемая строка была всегда одного и того же размера. Например, вместо считанного значения 0 будет сформирована строка «0000».

Команда „r“ сбрасывает romAddress в 0.

Со стороны ПК программа чтения реализована при помощи библиотеки Qt и идущей вместе с ней системой разработки программ Qt Creator. Полностью программу можно скачать с репозитория проекта на GitHub (https://github.com/rlabru/WD21000/tree/master/060_WDromRead).

На рисунке ниже показаны две процедуры, отвечающие за подачу команды чтения данных и накоплением считанных слов ПЗУ.

Отрывок программы на Qt для чтения ПЗУ WD AC21000 через Arduino

Отрывок программы на Qt для чтения ПЗУ WD AC21000 через Arduino

Процедура slotReadRom() вызывается по нажатию кнопки «Play». Подает команду „r“ для сброса счетчика адреса, команду „d“ для инициирования чтения первого слова из ПЗУ и запускает таймер для информирования пользователя в случае, когда в течении 5 секунд не будет получен ответ от Arduino.

Процедура handleReadyRead() вызывается при получении данных от Arduino. Вначале, производится добавление всех полученных данных в буфер m_readData. Далее, проверяем, что данных пришло более 5 байт и если это так, то останавливаем таймер выдачи ошибки, добавляем в буфер результата полученное слово и проверяем значение счетчика адреса. Если адрес меньше необходимого размера чтения из 32768 слов, то выполняем инкремент адреса, подаем следующую команду чтения и обновляем отображение прогресса чтения. Как только адрес достигает 32768, передаем все прочитанные данные из в шестнадцатиричный редактор и сбрасываем отображение прогресса чтения.

Программа чтения ПЗУ WD AC21000 в процессе работы

Программа чтения ПЗУ WD AC21000 в процессе работы

Программа чтения ПЗУ WD AC21000. Данные прочитаны.

Программа чтения ПЗУ WD AC21000. Данные прочитаны

Итак, данные прочитаны. О корректности чтения можно судить по строке «Copyright 1995» и последующим списком возможных моделей диска.

Для проверки качества чтения ПЗУ считываем несколько раз.

У автора в первые разы получались отличающиеся данные. Дело оказалось в плохом контакте микросхемы ПЗУ в панельке. После того, как контакт был исправлен, различий между несколькими попытками чтения не появлялось — значит, скорее всего, все заработало хорошо!

Файл с результатом так же выложен на GitHub (https://github.com/rlabru/WD21000/blob/master/WD21000_rom_62-602111-064.bin).

Дальше будем разбирать ПЗУ и связывать заложенную там программу с аппаратурой.

Посты серии:

Изобретаем жесткий диск. Часть 1. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-1-442.html)

Изобретаем жесткий диск. Часть 2. Чтение ПЗУ. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-2-chtenie-pzu-483.html)

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

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

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