Serial luvz ! Couldn't register serial port :(

J’aime le port série (alias l’EIA RS-232C). Le port parallèle disparaît et l’utilisation des convertisseurs USB/lp n’est pas pratique du tout. Reste l’USB qui est encore relativement délicat à mettre en oeuvre et utilisable avec des micocontrôleur encore coûteux (plus qu’un AVR simple). On peut jouer avec les AVR (Attiny2313) et supporter l’USB de manière soft, certes, mais au prix d’une grosse consommation de flash.

Le port série reste donc la meilleure solution pour bidouiller et développer ses propres périphériques. Non seulement les convertisseurs USB/série sont peu cher mais le code pour un AVR est un vrai bonheur. RS232 <3 donc :)

Je me suis payé une sympathique carte PCI 6 ports série chez Think ITX à 38 €. Avec les deux ports présents sur la carte mère cela me donne TTYS0 -> TTYS7. De quoi jouer.  Mais voilà :
[    1.527011] Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
[    1.527790] ACPI: PCI Interrupt 0000:00:0c.0[A] -> GSI 19 (level, low) -> IRQ 19
[    1.527990] 0000:00:0c.0: ttyS0 at I/O 0xa000 (irq = 19) is a 16550A
[    1.528781] 0000:00:0c.0: ttyS1 at I/O 0xa400 (irq = 19) is a 16550A
[    1.529012] 0000:00:0c.0: ttyS2 at I/O 0xa800 (irq = 19) is a 16550A
[    1.529232] 0000:00:0c.0: ttyS3 at I/O 0xac00 (irq = 19) is a 16550A
[    1.529323] Couldn’t register serial port 0000:00:0c.0: -28
Damn ! J’avais préalablement désactivé les deux ports de la carte mère dans le BIOS. Je devrai donc avoir 6 ports et j’en vois 4 !

Le problème vient du nombre de ports gérés par défaut par le noyau :
% grep SERIAL config-2.6.26-1-686
[…]
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
[…]
Voilà le fameux 4. Vais-je devoir recompiler un noyau ? Non :
config SERIAL_8250_RUNTIME_UARTS
        int « Number of 8250/16550 serial ports to register at runtime »
        depends on SERIAL_8250
        range 0 SERIAL_8250_NR_UARTS
        default « 4 »
        help
          Set this to the maximum number of serial ports you want
          the kernel to register at boot time.  This can be overridden
          with the module parameter « nr_uarts », or boot-time parameter
          8250.nr_uarts
Hop, un petit changement dans les paramètres passés au noyau depuis mon GRUB : 8250.nr_uarts=8. Et c’est trop bonheur :
[    1.536962] 00:07: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    1.537232] 00:08: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    1.537628] 0000:00:0c.0: ttyS4 at I/O 0xa000 (irq = 19) is a 16550A
[    1.537854] 0000:00:0c.0: ttyS5 at I/O 0xa400 (irq = 19) is a 16550A
[    1.538077] 0000:00:0c.0: ttyS6 at I/O 0xa800 (irq = 19) is a 16550A
[    1.538299] 0000:00:0c.0: ttyS7 at I/O 0xac00 (irq = 19) is a 16550A
[    1.538516] 0000:00:0c.0: ttyS2 at I/O 0xb000 (irq = 19) is a 16550A
[    1.538733] 0000:00:0c.0: ttyS3 at I/O 0xb400 (irq = 19) is a 16550A
Luvz, je vous, mais luvz quoi :)