(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/>