8 Port Serial Cards in Linux

From Kyle's Wiki
Jump to: navigation, search

So you want to use a fancy 8 Port serial card in linux? The first thing you need to know is that most distros come hard coded to only initialize 4 serial ports. Add this to your grub/bootloader:

8250.nr_uarts=8

Adjust if you have more ports. The next thing to check is your lspci -v, look for your serial card:

01:00.0 Serial controller: Oxford Semiconductor Ltd Device c308 (prog-if 02)
	Subsystem: Oxford Semiconductor Ltd Device c308
	Flags: bus master, fast devsel, latency 0, IRQ 16
	Memory at fe9fc000 (32-bit, non-prefetchable) [size=16K]
	Memory at fe600000 (32-bit, non-prefetchable) [size=2M]
	Memory at fe400000 (32-bit, non-prefetchable) [size=2M]
	Capabilities: [40] Power Management version 3
	Capabilities: [70] Express Endpoint, MSI 00
	Capabilities: [b0] MSI-X: Enable- Mask- TabSize=16
	Capabilities: [100] Device Serial Number 00-03-00-11-11-e0-30-00
	Capabilities: [110] Power Budgeting <?>
	Kernel driver in use: serial

Setserial

Next is the setserial command. A good output looks like this:

root@ubuntu:~# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS1, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS2, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS3, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS4, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS5, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS6, UART: 16950/954, Port: 0x0000, IRQ: 16
/dev/ttyS7, UART: 16950/954, Port: 0x0000, IRQ: 16

This would be a bad output (you can see it just guessing at the uart, irq, etc):

[root@centos ~]# setserial -g /dev/ttyS*
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
/dev/ttyS4, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS5, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS6, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS7, UART: unknown, Port: 0x0000, IRQ: 0

To fix this, stick this in your rc.local:

setserial /dev/ttyS0 port 0xec00 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS1 port 0xe880 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS2 port 0xe800 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS3 port 0xe480 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS4 port 0xe400 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS5 port 0xe080 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS6 port 0xe000 irq 217 uart 16550a baud_base 115200 ^fourport
setserial /dev/ttyS7 port 0xdc00 irq 217 uart 16550a baud_base 115200 ^fourport
Personal tools
Namespaces

Variants
Actions
Efforts
Toolbox
Meta