Probleme de carte pcmcia RS232 - Hardware - Linux et OS Alternatifs
MarshPosté le 24-11-2005 à 11:01:13
Bonjour a tous !
Mon probleme de base est le suivant :
J'ai fait l'acquisition d'une carte pcmcia afin de rajouter une liaison serie RS232 a mon pc portable (qui n'en n'ont plus maintenant ). J'arrive a la faire marcher, mais au detriment de l'usb, car a un moment le noyau detecte un probleme et desactive mon interruption 10, qui sert a la fois a l'usb et au module yenta_socket (port pcmcia).
Une fois mon PC fraichement demarré sans avoir mis ma carte RS232, voici ce que j'ai dans /proc/interrupts :
Ensuite, j'insere ma carte pcmcia, et j'obtiens dans syslog :
Nov 24 10:24:27 localhost kernel: PCI: Enabling device 0000:02:00.0 (0000 -> 0003) Nov 24 10:24:27 localhost kernel: ACPI: PCI interrupt 0000:02:00.0[A] -> GSI 10 (level, low) -> IRQ 10 Nov 24 10:24:28 localhost pci.agent[3609]: ... no modules for PCI slot 0000:02:00.0
Aucun module driver n'a été trouvé, mais ce n'est pas grave car le kernel est directement capable de gerer le chip de la carte, qui est un "OXCB950 Cardbus 16950 UART".
Un lspci -vv me donne au niveau de la carte :
02:00.0 Serial controller: Oxford Semiconductor Ltd OXCB950 Cardbus 16950 UART (prog-if 06 [16950]) Subsystem: Oxford Semiconductor Ltd: Unknown device 0001 Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- Interrupt: pin A routed to IRQ 10 Region 0: I/O ports at 2010 [size=8] Region 1: Memory at ec100000 (32-bit, non-prefetchable) [size=4K] Region 2: I/O ports at 2000 [size=16] Region 3: Memory at ec101000 (32-bit, non-prefetchable) [size=4K] Region 4: Memory at ec102000 (32-bit, non-prefetchable) [size=4K] Capabilities: [40] Power Management version 1 Flags: PMEClk- DSI- D1- D2+ AuxCurrent=0mA PME(D0+,D1-,D2+,D3hot+,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME-
Pour faire marcher la carte, j'utilise la commande setserial, qui doit sans doute indiquer au kernel comment gerer les /dev/ttySx.
Je tape setserial /dev/ttyS0 pour voir la config actuelle :
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
Y'a rien, normal, y'a pas de port serie sur mon PC
Donc grace aux données fournies par lspci, je configure le port serie :
setserial /dev/ttyS0 port 0x2010 irq 10 autoconfig baud_base 1000000
Je verifie ce que la commande a donné : setserial /dev/ttyS0 :
Cool ! Le kernel a reconnu l'uart, c'est bien un 16950 !
A ce stade, ma souris USB fonctionne toujours bien. Ensuite j'essaye le port serie en lancant minicom, qui par defaut utilise /dev/ttyS0. La carte serie ne marche pas, pas moyen de sortir le moindre octet. Par contre l'USB marche toujours.
Alors j'ai essayé avec setserial de changer les interruptions, et je constate qu'en faisant :
setserial /dev/ttyS0 port 0x2010 irq 0 autoconfig baud_base 1000000
Pour l'instant, tout marche encore, j'ai ma souris USB, pas de souci. Je lance alors minicom, et là, le port serie fonctionne !! Je recois et envois des octets, ca tourne nickel. Par contre, j'obtiens le message suivant dans syslog, et ma souris USB ne marche plus :
Nov 24 10:43:32 localhost kernel: irq 10: nobody cared! Nov 24 10:43:32 localhost kernel: [<c0106ce2>] __report_bad_irq+0x22/0x90 Nov 24 10:43:32 localhost kernel: [<c0106dbc>] note_interrupt+0x4c/0x70 Nov 24 10:43:32 localhost kernel: [<c0106fb0>] do_IRQ+0xe0/0xf0 Nov 24 10:43:32 localhost kernel: [<c01057b8>] common_interrupt+0x18/0x20 Nov 24 10:43:32 localhost kernel: [<c011e09a>] __do_softirq+0x2a/0x80 Nov 24 10:43:32 localhost kernel: [<c011e115>] do_softirq+0x25/0x30 Nov 24 10:43:32 localhost kernel: [<c0106f9f>] do_IRQ+0xcf/0xf0 Nov 24 10:43:32 localhost kernel: [<c01057b8>] common_interrupt+0x18/0x20 Nov 24 10:43:32 localhost kernel: [<c02bdab1>] uart_start+0x11/0x20 Nov 24 10:43:32 localhost kernel: [<c02bdf93>] uart_write+0x73/0x210 Nov 24 10:43:32 localhost kernel: [<c0269f0f>] inode_has_perm+0x4f/0x80 Nov 24 10:43:32 localhost kernel: [<c02b0818>] write_chan+0x178/0x210 Nov 24 10:43:32 localhost kernel: [<c0117e70>] default_wake_function+0x0/0x20 Nov 24 10:43:32 localhost kernel: [<c0117e70>] default_wake_function+0x0/0x20 Nov 24 10:43:32 localhost kernel: [<c02ac088>] tty_write+0x158/0x1d0 Nov 24 10:43:32 localhost kernel: [<c02b06a0>] write_chan+0x0/0x210 Nov 24 10:43:32 localhost kernel: [<c014cebd>] vfs_write+0x9d/0x100 Nov 24 10:43:32 localhost kernel: [<c04818a1>] schedule_timeout+0x61/0xb0 Nov 24 10:43:32 localhost kernel: [<c014cfcd>] sys_write+0x3d/0x70 Nov 24 10:43:32 localhost kernel: [<c0104df7>] sysenter_past_esp+0x58/0x79 Nov 24 10:43:32 localhost kernel: handlers: Nov 24 10:43:32 localhost kernel: [<eea67b00>] (usb_hcd_irq+0x0/0x60 [usbcore]) Nov 24 10:43:32 localhost kernel: [<eea67b00>] (usb_hcd_irq+0x0/0x60 [usbcore]) Nov 24 10:43:32 localhost kernel: [<eebc8850>] (yenta_interrupt+0x0/0x30 [yenta_socket]) Nov 24 10:43:32 localhost kernel: Disabling IRQ #10
Il semble que la carte genere des interruptions 10, mais le noyau detecte qu'elles ne sont pas gérées, et donc il devalide l'irq, stoppant net le fonctionnement de l'usb. Par contre, le port serie fonctionne bien alors qu'avec setserial j'ai demandé d'utiliser l'IRQ 0
Vous avez une idée de comment je pourrais remedier a tout ca ? C'est a dire faire marcher ma carte serie sans perdre l'usb ? Par ce qu'il faut savoir qu'apres ces manips, et avoir travaillé normalement toute une journée, j'ai deja rencontré des problemes a l'extinction du PC, un freeze total qui m'oblige a couper le PC a l'arrache. Et ca j'aime pas trop !
Marsh Posté le 24-11-2005 à 11:01:13
Bonjour a tous !
Mon probleme de base est le suivant :
J'ai fait l'acquisition d'une carte pcmcia afin de rajouter une liaison serie RS232 a mon pc portable (qui n'en n'ont plus maintenant ).
J'arrive a la faire marcher, mais au detriment de l'usb, car a un moment le noyau detecte un probleme et desactive mon interruption 10, qui sert a la fois a l'usb et au module yenta_socket (port pcmcia).
Une fois mon PC fraichement demarré sans avoir mis ma carte RS232, voici ce que j'ai dans /proc/interrupts :
CPU0
0: 3463580 XT-PIC timer
1: 12129 XT-PIC i8042
2: 0 XT-PIC cascade
3: 2 XT-PIC ehci_hcd
4: 2981 XT-PIC eth0
5: 2977 XT-PIC ohci1394, SiS SI7012
8: 1 XT-PIC rtc
9: 26774 XT-PIC acpi
10: 20509 XT-PIC ohci_hcd, ohci_hcd, yenta
12: 58 XT-PIC i8042
14: 7940 XT-PIC ide0
15: 11 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 10
MIS: 0
Ensuite, j'insere ma carte pcmcia, et j'obtiens dans syslog :
Nov 24 10:24:27 localhost kernel: PCI: Enabling device 0000:02:00.0 (0000 -> 0003)
Nov 24 10:24:27 localhost kernel: ACPI: PCI interrupt 0000:02:00.0[A] -> GSI 10 (level, low) -> IRQ 10
Nov 24 10:24:28 localhost pci.agent[3609]: ... no modules for PCI slot 0000:02:00.0
Aucun module driver n'a été trouvé, mais ce n'est pas grave car le kernel est directement capable de gerer le chip de la carte, qui est un "OXCB950 Cardbus 16950 UART".
Un lspci -vv me donne au niveau de la carte :
02:00.0 Serial controller: Oxford Semiconductor Ltd OXCB950 Cardbus 16950 UART (prog-if 06 [16950])
Subsystem: Oxford Semiconductor Ltd: Unknown device 0001
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at 2010 [size=8]
Region 1: Memory at ec100000 (32-bit, non-prefetchable) [size=4K]
Region 2: I/O ports at 2000 [size=16]
Region 3: Memory at ec101000 (32-bit, non-prefetchable) [size=4K]
Region 4: Memory at ec102000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] Power Management version 1
Flags: PMEClk- DSI- D1- D2+ AuxCurrent=0mA PME(D0+,D1-,D2+,D3hot+,D3cold-)
Status: D0 PME-Enable- DSel=0 DScale=0 PME-
Pour faire marcher la carte, j'utilise la commande setserial, qui doit sans doute indiquer au kernel comment gerer les /dev/ttySx.
Je tape setserial /dev/ttyS0 pour voir la config actuelle :
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
Y'a rien, normal, y'a pas de port serie sur mon PC
Donc grace aux données fournies par lspci, je configure le port serie :
setserial /dev/ttyS0 port 0x2010 irq 10 autoconfig baud_base 1000000
Je verifie ce que la commande a donné : setserial /dev/ttyS0 :
/dev/ttyS0, UART: 16950/954, Port: 0x2010, IRQ: 10
Cool ! Le kernel a reconnu l'uart, c'est bien un 16950 !
A ce stade, ma souris USB fonctionne toujours bien.
Ensuite j'essaye le port serie en lancant minicom, qui par defaut utilise /dev/ttyS0.
La carte serie ne marche pas, pas moyen de sortir le moindre octet. Par contre l'USB marche toujours.
Alors j'ai essayé avec setserial de changer les interruptions, et je constate qu'en faisant :
setserial /dev/ttyS0 port 0x2010 irq 0 autoconfig baud_base 1000000
Pour l'instant, tout marche encore, j'ai ma souris USB, pas de souci.
Je lance alors minicom, et là, le port serie fonctionne !! Je recois et envois des octets, ca tourne nickel.
Par contre, j'obtiens le message suivant dans syslog, et ma souris USB ne marche plus :
Nov 24 10:43:32 localhost kernel: irq 10: nobody cared!
Nov 24 10:43:32 localhost kernel: [<c0106ce2>] __report_bad_irq+0x22/0x90
Nov 24 10:43:32 localhost kernel: [<c0106dbc>] note_interrupt+0x4c/0x70
Nov 24 10:43:32 localhost kernel: [<c0106fb0>] do_IRQ+0xe0/0xf0
Nov 24 10:43:32 localhost kernel: [<c01057b8>] common_interrupt+0x18/0x20
Nov 24 10:43:32 localhost kernel: [<c011e09a>] __do_softirq+0x2a/0x80
Nov 24 10:43:32 localhost kernel: [<c011e115>] do_softirq+0x25/0x30
Nov 24 10:43:32 localhost kernel: [<c0106f9f>] do_IRQ+0xcf/0xf0
Nov 24 10:43:32 localhost kernel: [<c01057b8>] common_interrupt+0x18/0x20
Nov 24 10:43:32 localhost kernel: [<c02bdab1>] uart_start+0x11/0x20
Nov 24 10:43:32 localhost kernel: [<c02bdf93>] uart_write+0x73/0x210
Nov 24 10:43:32 localhost kernel: [<c0269f0f>] inode_has_perm+0x4f/0x80
Nov 24 10:43:32 localhost kernel: [<c02b0818>] write_chan+0x178/0x210
Nov 24 10:43:32 localhost kernel: [<c0117e70>] default_wake_function+0x0/0x20
Nov 24 10:43:32 localhost kernel: [<c0117e70>] default_wake_function+0x0/0x20
Nov 24 10:43:32 localhost kernel: [<c02ac088>] tty_write+0x158/0x1d0
Nov 24 10:43:32 localhost kernel: [<c02b06a0>] write_chan+0x0/0x210
Nov 24 10:43:32 localhost kernel: [<c014cebd>] vfs_write+0x9d/0x100
Nov 24 10:43:32 localhost kernel: [<c04818a1>] schedule_timeout+0x61/0xb0
Nov 24 10:43:32 localhost kernel: [<c014cfcd>] sys_write+0x3d/0x70
Nov 24 10:43:32 localhost kernel: [<c0104df7>] sysenter_past_esp+0x58/0x79
Nov 24 10:43:32 localhost kernel: handlers:
Nov 24 10:43:32 localhost kernel: [<eea67b00>] (usb_hcd_irq+0x0/0x60 [usbcore])
Nov 24 10:43:32 localhost kernel: [<eea67b00>] (usb_hcd_irq+0x0/0x60 [usbcore])
Nov 24 10:43:32 localhost kernel: [<eebc8850>] (yenta_interrupt+0x0/0x30 [yenta_socket])
Nov 24 10:43:32 localhost kernel: Disabling IRQ #10
Il semble que la carte genere des interruptions 10, mais le noyau detecte qu'elles ne sont pas gérées, et donc il devalide l'irq, stoppant net le fonctionnement de l'usb.
Par contre, le port serie fonctionne bien alors qu'avec setserial j'ai demandé d'utiliser l'IRQ 0
Vous avez une idée de comment je pourrais remedier a tout ca ? C'est a dire faire marcher ma carte serie sans perdre l'usb ?
Par ce qu'il faut savoir qu'apres ces manips, et avoir travaillé normalement toute une journée, j'ai deja rencontré des problemes a l'extinction du PC, un freeze total qui m'oblige a couper le PC a l'arrache. Et ca j'aime pas trop !
Si vous avez des idées, merci d'avance !
Cyril
Message édité par nlc le 01-12-2005 à 19:04:24
---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );