У меня есть плата на базе процессора Vortex86DX, который является микроконтроллером на базе x86. Он имеет пять 16550A UARTS, четыре (COM1-COM4) из которых находятся на обычных адресах портов ввода-вывода (0x3f8, 0x2f8, 0x3e8, 0x2e8), но пятый (COM9) находится на 0x010, irq 9.
Первые четыре UARTS обнаружены, у меня нет с ними проблем. Проблема в том, что я не могу заставить работать пятый (COM9) в Linux. COM9 работает в отдельном приложении DOS, но я даже не могу обнаружить его из Linux.
Что я уже сделал:
добавил свой дополнительный UART к/драйверы/tty/серийный/8250/
включен DEBUG_AUTOCONF в/драйверы/tty/serial/8250/8250.cчтобы я мог видеть, когда и какие адреса проверяются.
отредактировано/arch/x86/kernel/setup.cпоскольку порт ввода-вывода 0x010 перекрывает существующую область, зарезервированную для dma1
Результат: ядро не смогло проверить UART по адресу 0x010
Поэтому я написал утилиту проверки порта ввода-вывода для прямого чтения из порта ввода-вывода 0x010, и я не смог обнаружить никаких регистров 16550A в области от 0x010 до 0x017. Похоже, там ничего нет. Я пытался записать и прочитать данные из регистра scratch (смещение +7), но ничего не получил по адресу 0x017.
В техническом описании ЦП не сказано многого. Там указано, что в регистре южного моста есть бит управления, который делает "что-то" для COM9. Я написал утилиту PCI, которая записывала в этот бит, но она, похоже, не включила порт COM или не изменила ничего, когда я провел зондирование порта io.
На этом этапе мы будем признательны за любую помощь!
решение1
Я не понимаю, зачем вы так усложнили себе жизнь, изменив исходный код ядра, чтобы добавить поддержку этого нестандартного последовательного порта ввода-вывода и IRQ. Программа setserial(8)
должна уметь настраивать его для вас. Что-то вроде этого:
# setserial ttyS4 address 0x10 irq 9
ВидетьLinux Serial HOWTOБольше подробностей.
решение2
Похоже, что либо BIOS, либо Linux отключают порт COM9 в регистрах южного моста.
Регистры:
- «Внутренний регистр управления UART9» необходимо сбросить до значения по умолчанию: 0x00810010
- Для повторного включения COM9 необходимо очистить бит 9 в «Регистре управления встроенным устройством».
Я не знаю, почему и где они отключены.
Когда я установил разумные значения в драйвере устройства, мне удалось обнаружить COM9 UART.
Linux требует новый тип чипа x86 для Vortex86DX. Он не совместим на 100%.