Как определить тип микросхемы UART
Как же определить, какая из этих микросхем UART установлена на вашем асинхронном адаптере? Кроме возможности заглянуть в документацию, существует еще один способ. Фактически этот способ основан на различиях в особенностях микросхем UART. Ниже приведены особенности микросхем UART различных типов:
UART8250 не имеет регистра расширения
UART 16450 не имеет внутренних буферов FIFO
UART 16550 имеет внутренние буфера FIFO, но с ошибками. Бит D7 регистра управления прерываниями (регистр IIR) равен единице, а бит D6 - нулю
UART 16550A не содержит ошибок при реализации FIFO. Биты D7 и D6 регистра управления прерываниями (регистр IIR) равны единице.
Согласно этим особенностям микросхем UART возможен следующий алгоритм определения их типа:
Читаем и сохраняем значение регистра расширения. Адрес регистра расширения определяем как базовый адрес плюс семь (base_adr + 7)
Записываем в регистр расширения какое-либо число, например, 0A5h
Снова считываем значение регистра расширения и сравниваем его с числом 0A5h, записанным в него ранее. Если эти значения не равнозначны, значит регистр расширения отсутствует и, следовательно, тип проверяемой микросхемы UART - 8250
Запоминаем в регистре расширения другое число, например, 5Ah
Снова считываем значение регистра расширения и сравниваем его с ранее записанным числом. Если эти значения не одинаковы, значит регистр расширения отсутствует и, следовательно, тестируемая микросхема UART 8250
Восстанавливаем величину, изначально хранившуюся в регистре расширения
Считываем и сохраняем значение регистра управления прерываниями
Записываем единицу в регистр управления режимом буферизации (регистр FCR, подробно описан ниже)
Считываем значение регистра управления прерываниями. Если бит D7 сохраненного регистра управления прерываниями содержит нулевое значение, запоминаем единицу в регистре FCR
Если бит D6 регистра управления прерываниями содержит единицу, тип микросхемы UART - 16550A
Если бит D7 регистра управления прерываниями содержит единицу, тестируемая микросхема - UART 16550
В противном случае мы имеем микросхему UART 16450.