
Я не уверен, на каком уровне у меня возникла проблема.
Система представляет собой 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.