Uzix | микроблог

Сдул пыль со старого проекта - PCI-OPL3...

Сдул пыль со старого проекта - PCI-OPL3. Полтора года назад остановился на том, что в некотором софте карта определяется через раз. Как работает алгоритм детекта? Код записывает значение в регистр чипа OPL для запуска таймера, ждёт некоторое время, а затем читает регистр статуса - переполнился таймер или нет. Чтение и запись регистров на карте работают стабильно и без ошибок. Но, как оказалось, слишком быстро. Чтобы не реализовывать полноценную задержку на системном таймере, авторы некоторого софта полагались на то, что длительность инструкции чтения/записи регистров будет фиксирована, и для создания задержки просто делали несколько чтений в цикле. Для ISA это работало, для PCI уже нет.

В своей карте я применил PCI-ISA мост CH365P. Он довольно примитивный и не умеет растягивать I/O циклы, а значит это придётся делать софтово. Для этого вместе с кодексом я набросал простой драйвер, который через EMM386 перехватывает обращения к портам карты и вставляет дополнительные циклы ожидания.

На первый взгляд это работает нормально. Попроверяю ещё - и можно релизить.

Комментарии