(Courriels de diversion: <demi-cercles@fumiers-insonoriseras.com> <frissonnement@mousses-barmaid.com> <sursauter@gouape-suprematie.com> <escaladerions@magnolia-parlerez.com> <vogua@moyenne-veulerie.com> <defraîchisses@disparaissiez-seyaient.com> <liane@perturberiez-douer.com> <lino@prepares-delimitait.com> <ehonte@tâtonneraient-ville.com> <impressionnante@decuplement-visualisables.com> )
Eric Huiban wrote:
> On Monday 3 March 2003 13:10, Eric Lassauge wrote:
>
>>Huiban, Eric wrote:
>>
>>>>j'ai qq problemes/questions avec la gestion des lignes series.
>>>>Mon contexte:
>>>>- RedHat 6.2 depouillee de X11
>>>>- noyau 2.2.22 (base sur le 2.2.22-6.2.3 de la Redhat, mais avec le
>>>>driver serial en module)
>>>>- module serial en 5.05 recompile "a la mimine".
>>>>
>>>>J'ai une appli fortement consommatrice d'E/S sur lignes series,
>>>>elle contient 2 process fils l'un fait les lectures sur les lignes
>>>>series avec un select l'autre discute avec le premier via un pipe.
>>>>Quand on bourrine sur une ligne serie en entree (depuis un autre
>>>>PC) il apparait que des lignes entieres sont perdues a
>>>>intervalles reguliers.
>>>
>>>Plusieures causes possibles :
>>>
>>>1- manque protocole de controle (RTS/CTS, DSR/DTR)
>>
>> Impossible d'utiliser les lignes de controle car la machine Linux
>>s'insère dans un "vieux" système à base de dos/windows sans refonte
>>de cablage prévue
>
>
> gzzzeuh ? cablage 3 fils (TX,RX,GND) seulement ? Ca va etre chaud à
> haut débit. Pour les machines dos/win a interfacer, un "fossil" aide
> enormement (remplace toute forme de driver serie avec une efficacité
> redoutable). Si par chance tu as un cablage 5 fils, certains UARTs
> modernes disposent d'un sequenceur CTS/RTS hardware calé sur le taux de
> remplissage de la fifo et là ca roxe. :-)
>
>
>>>2- fifo hardware trop petites (si le systeme est mou du driver ou
>>>du bus)
>>
>> D'où ma question sur la gestion des buffers dans le driver série. La
>>aussi dans ce driver on est passé d'un 16550A à un 16950/954
>>(initialement mal détécté)
>
> *
> C'est bien un 16950 qui est dessus ? gros doute d'apres la formulation.
> ;-)
C'est un Oxford 0X16PCI954, le driver serial le reconnait comme un
"16950/954":
% setserial /dev/ttyS11
/dev/ttyS11, UART: 16950/954, Port: 0xb418, IRQ: 10
>
> Si les buffers hardware ne suivent pas... modifier les buffers soft
> risque de ne pas aller plus loin qu'une rustine validable daans un ou
> deux cas.
>
>
>>>3- mauvais reglage du seuil de declenchement d'irq en fonction du
>>>niveau de remplissage la fifo
>>
>> Même question sur l'endroit où on peut modifier ca dans le driver
>>.
>
>
> Il te faut "te trouver" l'equivalent du parametre "rx_trigger" mais
> pour n'importe quel type d'UART et pas seulement pour l'ESP.
>
> Ca doit trainer par là (résultat de gros grep bien bourrin et rapide
> d'après souvenirs périmés, et sans datasheet pour appuyer le tir) :
>
> /* Set up FIFO's */
> if (uart_config[info->state->type].flags & UART_USE_FIFO) {
> if ((info->state->baud_base / quot) < 2400)
> fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
> #ifdef CONFIG_SERIAL_RSA
> else if (info->state->type == PORT_RSA)
> fcr = UART_FCR_ENABLE_FIFO |
> UART_FCR_TRIGGER_14;
> #endif
> else
> fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
> }
>
> dans serial.c... avec tout autre bout de code ressemblant.
>
> Plus tu reduis la valeur de trigger, plus tu charge le cpu et le
> gestionnaire d'irq mais plus tu as du rab' de buffer pour recuperer les
> data qui arrivent pendant ton temps de latence. Réglage à la mimine
> pour chaque appli et chaque plateforme.
>
Y'a plus qu'à ....
>
>>>3- les irqs n'ont pas ete reorganisees pour donner la priorite aux
>>>UARTS.
>>
>> Les E/S séries sont sur des cartes 4ports PCI. Donc si je ne me
>>trompe pas, pas moyen de changer la priorité (j'ai déjà regardé
>>l'outil irqtune)
>
>
> Ou sinon il te faut placer ca sur les irq 9 a 11 pour garder le schema
> PC classique.
>
>
Actuellement j'ai (4 et 3) 10 et 12:
STANDARD:
/dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 115200 spd_normal
skip_test
/dev/ttyS1 uart 16550A port 0x02f8 irq 3 baud_base 115200 spd_normal
skip_test
PCI 1:
/dev/ttyS4 uart 16950/954 port 0xa400 irq 12 baud_base 115200 spd_normal
skip_test
/dev/ttyS5 uart 16950/954 port 0xa408 irq 12 baud_base 115200 spd_normal
skip_test
/dev/ttyS6 uart 16950/954 port 0xa410 irq 12 baud_base 115200 spd_normal
skip_test
/dev/ttyS7 uart 16950/954 port 0xa418 irq 12 baud_base 115200 spd_normal
skip_test
PCI 2:
/dev/ttyS8 uart 16950/954 port 0xb400 irq 10 baud_base 115200 spd_normal
skip_test
/dev/ttyS9 uart 16950/954 port 0xb408 irq 10 baud_base 115200 spd_normal
skip_test
/dev/ttyS10 uart 16950/954 port 0xb410 irq 10 baud_base 115200
spd_normal skip_test
/dev/ttyS11 uart 16950/954 port 0xb418 irq 10 baud_base 115200
spd_normal skip_test
>>>4- systeme de disque IDE monopolisant les irq (mode block enabled
>>>--> disabled).
>>
>> Je suppose que ca se configure avec hdparm ?
>
>
> BIOS + hdparm, oui. De facon a caser une irq IDE par secteur tout en
> s'autorisant l'insertion d'irq etrangeres entre l'acces a deux secteurs.
>
>
>>>5- low-latency patch a appliquer sur le kernel.
>>
>> Je regarde ca... Et l'option low_latency de setserial ?
>
>
> Ca peut aider.
>
> a+
>
> --------------------------------------------------------------------
> Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>
>
Merci pour les infos. Je regarde également pour modifier la
gestion de la line discipline (n_tty.c) afin d'augmenter la taille
des buffers.
--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>