Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пропадают ttyS при регистрации своего мини-драйвера
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Hoodwin
Наблюдаю следующий глюк. При загрузке линукса с ядром 2.6.34 в систему вставляется наш самодельный модуль, который регистрирует 4 дополнительных порта serial8250. При этом dmesg всегда дает что-то типа:
Код
[    8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[    8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[    8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[    8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[    8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[    8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[    8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[    8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5

Числа 2-5 определяют номера устройств в /dev/ttyS, к которым цепляются новые UARTs.
Однако изредка после вставки модуля один из этих ttyS вообще отваливается. Сделали такой скрипт:
Код
ls -l /dev/ttyS2; echo a2 > /dev/kmsg
ls -l /dev/ttyS3; echo a3 > /dev/kmsg
ls -l /dev/ttyS4; echo a4 > /dev/kmsg
ls -l /dev/ttyS5; echo a5 > /dev/kmsg
insmod m8_hub.ko
ls -l /dev/ttyS2; echo b2 > /dev/kmsg
ls -l /dev/ttyS3; echo b3 > /dev/kmsg
ls -l /dev/ttyS4; echo b4 > /dev/kmsg
ls -l /dev/ttyS5; echo b5 > /dev/kmsg


В итоге имеем такой лог от dmesg:
Код
[    8.013214] a2
[    8.030402] a3
[    8.046447] a4
[    8.063384] a5
[    8.098092] m8_hub: starting...
[    8.098195] m8_hub 00:c004: adding serial ports
[    8.098218] m8_hub 00:c004: found UART at address 0x10000, irq 24
[    8.098239] m8_hub 00:c004: found UART at address 0x10100, irq 25
[    8.098261] m8_hub 00:c004: found UART at address 0x10200, irq 26
[    8.098282] m8_hub 00:c004: found UART at address 0x10300, irq 27
[    8.098300] m8_hub 00:c004: registering serial ports
[    8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[    8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[    8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[    8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[    8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[    8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[    8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[    8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
[    8.230699] b2
[    8.247030] b3
[    8.258412] b4
[    8.268520] b5

То есть вроде бы все хорошо. Но реально на консоль выдается, например:
Код
crw-rw----    1 root     root        4,  66 Nov 30 00:00 /dev/ttyS2
crw-rw----    1 root     root        4,  67 Nov 30 00:00 /dev/ttyS3
crw-rw----    1 root     root        4,  68 Nov 30 00:00 /dev/ttyS4
crw-rw----    1 root     root        4,  69 Nov 30 00:00 /dev/ttyS5
crw-rw----    1 root     root        4,  66 Nov 30 00:00 /dev/ttyS2
crw-rw----    1 root     root        4,  67 Nov 30 00:00 /dev/ttyS3
ls: /dev/ttyS4: No such file or directory
crw-rw----    1 root     root        4,  69 Nov 30 00:00 /dev/ttyS5


То есть, в процессе вставки модуля /dev/ttyS4 взял и умер. При вставке модуля это происходит довольно часто, хотя конкретное устройство может быть любым от ttyS2 до ttyS5. Могут и сразу два пропасть.
Проблема в том, что после такой пропажи перестает работать софт. Однако прямой вызов вроде
Код
mknod -m 660 /dev/ttyS4 c 4 68

возвращает файл устройства на место. Пока правда не удалось проверить, работает ли само устройство после mknod.

Есть подозрение, что это как-то связано не с ядром как таковым, а с busybox. Во всяком случае эффект наблюдается с busybox версии 1.21.1 и не наблюдается с версией 1.17.
Хочется эту бяку победить, но пока не непонятно, что предпринять, чтобы выяснить причину. Может быть кто-нибудь сталкивался с похожим багом?

gormih
Не думаю, что баг в busybox
Может, добавить побольше printk в модуле ядра для пущей ясности?
aignashev
Проблема решена? Возможно ли восстановить работу порта без перезагрузки линукса?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.