setserial / dev / ttyS4: Impossible de définir les informations de série

J'ai donc une carte avec 6 ports série matériels: les 2 premiers sur le bus ETX et les 4 derniers sur le bus ISA. La configuration suivante est comment il est censé être:

/dev/ttyS0 port 0x03F8 irq 4 /dev/ttyS1 port 0x02F8 irq 3 /dev/ttyS2 port 0x0100 irq 5 /dev/ttyS3 port 0x0108 irq 5 /dev/ttyS4 port 0x0110 irq 5 /dev/ttyS5 port 0x0118 irq 5 

Au démarrage, je cours:

 # dmesg | egrep -i 'serial|ttys' Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A # cat /proc/tty/driver/serial Serinfo:1.0 driver revision: 0: uart:16550A port: 000003F8 irq:4 tx:0 rx:0 1: uart:16550A port: 000002F8 irq:3 tx:0 rx:0 2: uart:unknown port:000003E8 irq:4 3: uart:unknown port:000002E8 irq:3 4: uart:unknown port:00000000 irq:0 5: uart:unknown port:00000000 irq:0 

Donc, j'essaie d'utiliser setserial pour configurer les ports ttyS2-ttyS5 avec les valeurs correctes:

 # setserial /dev/ttyS2 irq 5 port 0x100 uart 16550A # setserial /dev/ttyS3 irq 5 port 0x108 uart 16550A # setserial /dev/ttyS4 irq 5 port 0x110 uart 16550A Cannot set serial info: Invalid argument # setserial /dev/ttyS5 irq 5 port 0x118 uart 16550A Cannot set serial info: Invalid argument 

Même en retirant l'option uart de la dernière command:

 # setserial /dev/ttyS4 irq 5 Cannot set serial info: Invalid argument 

Que dois-je faire pour configurer ttyS4 et ttyS5 via setserial?

Un certain nombre de choses me frappent à propos de ce que je vois dans votre sortie /proc et dmesg :

  • Vous ne devriez pas essayer de partager une IRQ entre les périphériques. Il peut fonctionner, mais l'intention avec ISA est que chaque périphérique sur le bus qui a besoin d'une ligne d'interruption pour fonctionner obtient sa propre IRQ. Si vos maps de port série ne vous donnent pas suffisamment d'options d'IRQ, vous ne pourrez tout simplement pas les utiliser toutes set sur ce PC.

  • Les adresses d'E / S que vous utilisez pour la deuxième paire de ports série ne sont pas standard. ttyS2 est normalement à 0x3E8 et ttyS3 est normalement à 0x2E8. Je voudrais les déplacer si vous avez cette option avec la carte série. (Il n'y a pas d'adresses d'E / S standard ou IRQ pour ttyS4 et plus.)

En dehors de tout cela, si j'avais besoin de 6 ports série sur une machine Linux, je n'essaierais pas d'utiliser de simples maps de ports série. Je voudrais utiliser quelque chose comme un Digi AccelePort . Ils offrent toujours un qui fonctionnera dans vos slots ISA, le model Xe. Si vous avez besoin de pas cher, vous devriez être en mesure de find un flottant sur le marché utilisé; ils étaient très populaires dans la journée.

Essayez d'append 8250.nr_uarts=6 ou nr_uarts=6 dans les parameters de démarrage du kernel.

Edit: Quelques informations qui pourraient aider (espérons-le).

Essayez d'utiliser le paramètre baud_rate 115200 pour setserial

Je sais que cette question a été postée en mars 2011, mais j'ai rencontré le même problème sur Debian récemment, mais j'ai trouvé la cause / la solution relativement obscure.

Comme vous le savez, augmenter le nombre de périphériques série / dev / ttySX au-delà de la valeur par défaut de quatre (/ dev / ttyS0 à ttyS3) est plus simple avec un indicateur de démarrage dans grub (la modification du paramètre par défaut nécessite de recomstackr le kernel)

Après le démarrage, ces nouveaux périphériques ttyS sont vides (les valeurs Port, IRQ, UART, etc. sont toutes définies sur zéro).

Après avoir expérimenté ici, il s'avère que vous essayez de configurer un port avec une base baud zéro. Malheureusement, il commence comme zéro.

Cependant, lorsque vous essayez de changer un port sans spécifier le baud de base, il est possible que le port devienne "utilisable" et à less que nous appliquions la règle "ne doit pas avoir zéro base baud", nous avons la possibilité d'opérer le kernel via un split par zéro.

https://lkml.org/lkml/2007/2/27/201

Ce que vous devez faire est de spécifier la valeur base_baud avant de faire autre chose. Si je me souviens bien, base_baud 115200 a travaillé pour moi.

En plus de base_baud comme mentionné dans mon autre réponse sur cette question, il peut aussi s'agir de l'ordre des arguments: (je n'ai pas eu le time d'expérimenter différents ordres pour voir ce qui l'a corrigé, car base_baud a définitivement fonctionné)

J'ai rencontré un set similaire de problèmes en essayant d'installer de nouveaux ports série dans une application x86 embeddede. Le problème pour moi s'est avéré être que le programme setserial convertit ses arguments de command line, dans l'ordre, dans les opérations correspondantes d'ioctl () pour placer les divers parameters de dispositif. En gros, setserial a appliqué une stratégie de: 1) lire le paramètre actuel pour le / dev / ttySx spécifique 2) modifier les valeurs comme spécifié par chaque command line arg, chaque argument de command line ou indicateur devenant un ioctl

Ainsi, la spécification du type uart (ou autoconfigure) avant de spécifier le port ou irq ne fonctionnera pas correctement pour les ports plus grands que / dev / ttyS3, car la valeur du port pour / dev / ttyS3 n'est initialisée à rien. Cela provoque le return de l'opération ioctl () avec errno défini sur EINVAL (argument invalide). Je soupçonne la string d'ioctl () que le drapeau de quatreportes suivi par le drapeau de basse-latitude se transforme en quelque chose qui n'a aucun sens pour le conducteur. https://bugzilla.kernel.org/show_bug.cgi?id=8458