(revised) test for linux serial ports


Author Message
robert.rozee
Guru

Joined: 31/12/2012
Location: New Zealand
Posts: 2541
Posted: 10:40am 06 Jan 2025      

  JohnS said  I'm a bit surprised it doesn't find the ports on various of my computers.

There are (for x = 0,1,2,3)
/dev/ttySx
/sys/class/tty/ttySx/ which are links to
/sys/devices/platform/serial8250/tty/ttySx/
in which are files such as type
(cat type is just a 0)

I don't know what tty-related chips are on each motherboard.

John


it will only find ports that are associated with actual hardware - i would be surprised if a motherboard had four onboard serial ports without there being any visible DB9 sockets on the back, or any 2x5 pin headers internally.

the Linux kernel creates the ttySxx entries in /dev, /sys/class/tty and /sys/devices/platform/serial8250/tty without doing any checking that there is real serial port hardware present.

the actual number of ttySxx entries created is hard-coded in the kernel. 32 is a common number, as is 16 and, it would seem 4. the actually number is dependent on whims of the person compiling the kernel!

for instance, on a VM (Linux Mint 19.3 i686, kernel 5.4.0-89-generic) i have here that has no serial ports available to it, one finds:

user@user-VirtualBox:~$ ls /dev/ttyS*
/dev/ttyS0   /dev/ttyS14  /dev/ttyS2   /dev/ttyS25  /dev/ttyS30  /dev/ttyS8
/dev/ttyS1   /dev/ttyS15  /dev/ttyS20  /dev/ttyS26  /dev/ttyS31  /dev/ttyS9
/dev/ttyS10  /dev/ttyS16  /dev/ttyS21  /dev/ttyS27  /dev/ttyS4
/dev/ttyS11  /dev/ttyS17  /dev/ttyS22  /dev/ttyS28  /dev/ttyS5
/dev/ttyS12  /dev/ttyS18  /dev/ttyS23  /dev/ttyS29  /dev/ttyS6
/dev/ttyS13  /dev/ttyS19  /dev/ttyS24  /dev/ttyS3   /dev/ttyS7
user@user-VirtualBox:~$ ls /sys/devices/platform/serial8250/tty
ttyS0   ttyS12  ttyS16  ttyS2   ttyS23  ttyS27  ttyS30  ttyS6
ttyS1   ttyS13  ttyS17  ttyS20  ttyS24  ttyS28  ttyS31  ttyS7
ttyS10  ttyS14  ttyS18  ttyS21  ttyS25  ttyS29  ttyS4   ttyS8
ttyS11  ttyS15  ttyS19  ttyS22  ttyS26  ttyS3   ttyS5   ttyS9
user@user-VirtualBox:~$ ls -d /sys/class/tty/ttyS*
/sys/class/tty/ttyS0   /sys/class/tty/ttyS19  /sys/class/tty/ttyS29
/sys/class/tty/ttyS1   /sys/class/tty/ttyS2   /sys/class/tty/ttyS3
/sys/class/tty/ttyS10  /sys/class/tty/ttyS20  /sys/class/tty/ttyS30
/sys/class/tty/ttyS11  /sys/class/tty/ttyS21  /sys/class/tty/ttyS31
/sys/class/tty/ttyS12  /sys/class/tty/ttyS22  /sys/class/tty/ttyS4
/sys/class/tty/ttyS13  /sys/class/tty/ttyS23  /sys/class/tty/ttyS5
/sys/class/tty/ttyS14  /sys/class/tty/ttyS24  /sys/class/tty/ttyS6
/sys/class/tty/ttyS15  /sys/class/tty/ttyS25  /sys/class/tty/ttyS7
/sys/class/tty/ttyS16  /sys/class/tty/ttyS26  /sys/class/tty/ttyS8
/sys/class/tty/ttyS17  /sys/class/tty/ttyS27  /sys/class/tty/ttyS9
/sys/class/tty/ttyS18  /sys/class/tty/ttyS28
user@user-VirtualBox:~$


while on a real machine (Linux Mint 22 x86_64, kernel 6.8.0-51-generic) that has ttyS0, ttyS4, ttyS5 present:

user@user-DH61BE:~$ ls /dev/ttyS*
/dev/ttyS0   /dev/ttyS14  /dev/ttyS2   /dev/ttyS25  /dev/ttyS30  /dev/ttyS8
/dev/ttyS1   /dev/ttyS15  /dev/ttyS20  /dev/ttyS26  /dev/ttyS31  /dev/ttyS9
/dev/ttyS10  /dev/ttyS16  /dev/ttyS21  /dev/ttyS27  /dev/ttyS4
/dev/ttyS11  /dev/ttyS17  /dev/ttyS22  /dev/ttyS28  /dev/ttyS5
/dev/ttyS12  /dev/ttyS18  /dev/ttyS23  /dev/ttyS29  /dev/ttyS6
/dev/ttyS13  /dev/ttyS19  /dev/ttyS24  /dev/ttyS3   /dev/ttyS7
user@user-DH61BE:~$ ls /sys/devices/platform/serial8250/tty
ls: cannot access '/sys/devices/platform/serial8250/tty': No such file or directory
user@user-DH61BE:~$ ls -d /sys/class/tty/ttyS*
/sys/class/tty/ttyS0   /sys/class/tty/ttyS19  /sys/class/tty/ttyS29
/sys/class/tty/ttyS1   /sys/class/tty/ttyS2   /sys/class/tty/ttyS3
/sys/class/tty/ttyS10  /sys/class/tty/ttyS20  /sys/class/tty/ttyS30
/sys/class/tty/ttyS11  /sys/class/tty/ttyS21  /sys/class/tty/ttyS31
/sys/class/tty/ttyS12  /sys/class/tty/ttyS22  /sys/class/tty/ttyS4
/sys/class/tty/ttyS13  /sys/class/tty/ttyS23  /sys/class/tty/ttyS5
/sys/class/tty/ttyS14  /sys/class/tty/ttyS24  /sys/class/tty/ttyS6
/sys/class/tty/ttyS15  /sys/class/tty/ttyS25  /sys/class/tty/ttyS7
/sys/class/tty/ttyS16  /sys/class/tty/ttyS26  /sys/class/tty/ttyS8
/sys/class/tty/ttyS17  /sys/class/tty/ttyS27  /sys/class/tty/ttyS9
/sys/class/tty/ttyS18  /sys/class/tty/ttyS28
user@user-DH61BE:~$


from the above you can see that in both cases there are 32 ttySxx entries, and also that with kernel 6.8 there is no /sys/devices/platform/serial8250/tty directory - this is because the 6.8 kernel uses a different /sys/devices/ directory layout and file naming convention to earlier kernels.


cheers,
rob   :-)