[Xenomai] Only 2 serial ports at a time with xeno_16550A driver

C Smith csmithquestions at gmail.com
Wed May 30 19:39:48 CEST 2018

I configured BIOS so two ports shared IRQ5, and gave Linux kernel thoase
two ports with setserial:
/dev/ttyS0, UART: unknown, Port: 0x02e0, IRQ: 10
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 5
/dev/ttyS2, UART: unknown, Port: 0x03f8, IRQ: 4
/dev/ttyS3, UART: 16550A, Port: 0x02e8, IRQ: 5

Using Minicom to send some bytes (sucessfully) out of port 0x02f8, IRQ5
/proc/interrupts shows one more interrupt every time I send a byte out the
           CPU0       CPU1       CPU2       CPU3
  5:         26         13          1          0   IO-APIC-edge      serial

But if I subsequently take those ports away from kernel with setserial
(with no changes to BIOS) and load xeno_16550A like this:
modprobe xeno_16550A io=0x02e0,0x02f8,0x03f8,0x02e8 irq=10,5,4,5

I get file descriptors when the ports are initialized:
successfully initialized serial device rtser1 (fd=12)   [OK]
successfully initialized serial device rtser0 (fd=13)   [OK]
successfully initialized serial device rtser2 (fd=14)   [OK]
successfully initialized serial device rtser3 (fd=15)   [OK]

But the ports which share IRQ5 can't communicate.
While the port on 0x03f8 IRQ4 can communicate successfully.

So sharing IRQ5 is not working, and there is no way in the BIOS for these
ports to share another interrupt.

-C Smith
PS: Sorry Gmail was hiding your messages so I couldn't Reply to them.
<Trying a Reply here...>

On Mon, May 28, 2018 at 11:39 PM, Jan Kiszka <jan.kiszka at siemens.com> wrote:

> On 2018-05-28 19:21, C Smith wrote:
> > Jan wrote:
> >> Platform UART IRQs are assumed to be edge-triggered (see irqtype
> >> variable) - maybe your special board is different in this regard as
> >> well. Try removing RTDM_IRQTYPE_EDGE.
> >
> > I couldn't find a kernel option called RTDM_IRQTYPE_EDGE, either with
> 'make
> > menuconfig' or by grepping the Xenomai sources.
> >
> > So I assumed you meant do do this in include/rtdm_driver.h ?
> > /* #define RTDM_IRQTYPE_EDGE        XN_ISR_EDGE */   // just a test
> > #define RTDM_IRQTYPE_EDGE 0
> >
> > I  recompiled the xeno_16550A driver this way and it behaved no better. I
> > still can't get an interrupt if two serial ports share an IRQ.
> >
> How does /proc/interrupts look like when you have Linux driving all UARTs?
> Jan
> PS: You mail program is constantly breaking the topic threading - or you
> are not replying to the previous answers but writing new emails.
> --
> Siemens AG, Corporate Technology, CT RDA IOT SES-DE
> Corporate Competence Center Embedded Linux

More information about the Xenomai mailing list