ttyS1/uart1 инициализирован, но недоступен через /dev/ttyS1

ttyS1/uart1 инициализирован, но недоступен через /dev/ttyS1

Я не уверен, на каком уровне у меня возникла проблема.

Система представляет собой LeopardBoard DM368, работающую под управлением собственного ядра SDK / LSP / BusyBox от TI, базовое ядро ​​Linux — 2.6.x, поэтому используется модель драйвера serial_core.c.

По умолчанию в системе включен один UART, UART0, смонтированный как , /dev/ttyS0который также используется/вызывается через bootargs console=ttyS0,115200n8 earlyprintk.

Мы хотим включить UART1 как /dev/ttyS1, поэтому прошли через низкоуровневый код инициализации платы, который настраивает pinmux, тактовую частоту и т. д.

При загрузке низкоуровневая инициализация сообщает (через добавленные мной printk), что UART1 включен, и код драйвера тоже сообщает о счастье:

[    0.547812] serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
[    0.569849] serial8250.0: ttyS1 at MMIO 0x1d06000 (irq = 41) is a 16550A

Однако порт не отображается в /dev/(как /dev/ttyS1), и имеются расхождения с его статусом (биты управления потоком), которые, как я подозреваю, могут быть причиной его зависания / отсутствия передачи:

cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:97998 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:0 rx:0 DSR

Если я попытаюсь настроить или изменить его из командной строки, я получу ошибку:

>: stty -F /dev/ttyS1
stty: can't open '/dev/ttyS1': No such file or directory

Как ни странно, если я изменю bootargs на console=ttyS1,115200n8 earlyprintkпорт, все будет работать отлично, и ttyS0 по-прежнему будет правильно инициализирован и тоже будет работать:

cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:0 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:11563 rx:0 RTS|DTR|DSR

Это было бы неплохо, но наш загрузчик должен использовать UART0, поэтому было бы неплохо сохранить все консольные данные на ttyS0 и использовать ttyS1 для наших дополнительных коммуникаций.

Я вставил пару printk в serial_core.c, и похоже, что uart_open() никогда не вызывается для ttyS1. Предполагаю, что это что-то в последовательности инициализации/запуска Linux, что нужно изменить?

Отредактировано: потому что я обманул себя, сделав то, echo >/dev/ttyS1что создалофайлназывается /dev/ttyS1, что несколько затуманило дело. Теперь я на 99% уверен, /dev/ttyS1чтоникогдасозданный.

решение1

mknod /dev/ttyS1 c 4 65

(если /devтолько для чтения, используйте любой доступный для записи каталог, смонтированный без опции nodev)

Если узел создан без ошибок, вы можете проверить, работает ли ваш патч, выполняя чтение/запись на узел или используя любой эмулятор терминала.

Проблема в том, что узел не создан?

Если вы используете какую-то автоматическую магию, например, динамическую файловую систему Dev devfsили, udevвозможно, есть какая-тоРегистрацияпроблема посередине (но я так не думаю, поскольку большая часть кода для вызова ttyS0 та же самая, и я полагаю, что добавление последовательного порта похоже на добавление строки конфигурации в массив в каком-то файле платформы).

Если вы не используете dev fs таким образом, вероятно, у вас есть файл MAKEDEVгде-то в дереве сборки, куда вручную добавить строку для вашего нового устройства, которое будет создано статически. Я также видел систему, где узлы dev создавались скриптом init.

Связанный контент