How to identify a device > serial device
How to "identify" the serial device (/dev/ttyS*) for a given interface of your computer (not the peripheral connected behind it).
The serial interfaces (RS-232) is a legacy interface. It has no enumeration process, you have to tell your application which /dev/ttyS* to use (some application do have some auto-detection features, but it's not always reliable).
About serial interfaces
The Serial port can either have a physical interface on your computer:
- DB9 serial interface.
- DB25 serial interface (on older computers).
- RJ-45 serial interface (mostly on switch and routers, but also on some computers like Sun ones).
Or it can be "built-in" another device, like:
- Internal Modem (ISA, PCI...).
- PC Card (pcmcia, Cardbus...), including Modem, GSM or UMTS/3G cards.
- USB to serial adapters.
- Docking station (for laptop).
Often, the computer have an internal UART chipset, but not a physical interface : Recent laptops have the DB-9 connector on the docking station only ; Some desktop have 1 connector available, the 2nd requires an optional cable, etc. so what you see IS NOT what you have.
Which /dev/ttyS* ?
Using hal
hal in installed by default in Desktop Environment (both Gnome and Kde), but not on servers.
Take special attention to 'info.product' and 'linux.device_file' lines :
$hal-find-by-capability --capability serial | xargs -n 1 hal-device udi = '/org/freedesktop/Hal/devices/pcmcia__1__1_serial_platform_1' info.capabilities = {'serial'} (string list) info.category = 'serial' (string) info.parent = '/org/freedesktop/Hal/devices/pcmcia__1__1' (string) info.product = 'Merlin UMTS Modem' (string) info.udi = '/org/freedesktop/Hal/devices/pcmcia__1__1_serial_platform_1' (string) linux.device_file = '/dev/ttyS1' (string) linux.hotplug_type = 2 (0x2) (int) linux.subsystem = 'tty' (string) linux.sysfs_path = '/sys/class/tty/ttyS1' (string) serial.device = '/dev/ttyS1' (string) serial.originating_device = '/org/freedesktop/Hal/devices/pcmcia__1__1' (string) serial.physical_device = '/org/freedesktop/Hal/devices/pcmcia__1__1' (string) serial.port = 1 (0x1) (int) serial.type = 'platform' (string) udi = '/org/freedesktop/Hal/devices/pci_8086_2a07_serial_platform_0' info.capabilities = {'serial'} (string list) info.category = 'serial' (string) info.parent = '/org/freedesktop/Hal/devices/pci_8086_2a07' (string) info.product = 'Mobile PM965/GM965 KT Controller' (string) info.udi = '/org/freedesktop/Hal/devices/pci_8086_2a07_serial_platform_0' (string) linux.device_file = '/dev/ttyS0' (string) linux.hotplug_type = 2 (0x2) (int) linux.subsystem = 'tty' (string) linux.sysfs_path = '/sys/class/tty/ttyS0' (string) serial.device = '/dev/ttyS0' (string) serial.originating_device = '/org/freedesktop/Hal/devices/pci_8086_2a07' (string) serial.physical_device = '/org/freedesktop/Hal/devices/pci_8086_2a07' (string) serial.port = 0 (0x0) (int) serial.type = 'platform' (string)
more example : thinkpad-a22-hal.txt ; usb-to-serial-adapter_hal.txt
Find in /sys/*
This command should work on all standard Debian installation (even minimalist ones).
$find /sys/ -name 'tty:ttyS*' /sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/0.0/tty:ttyS1 /sys/devices/pci0000:00/0000:00:03.3/tty:ttyS0 /sys/devices/platform/serial8250/tty:ttyS3 /sys/devices/platform/serial8250/tty:ttyS2 /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0/ttyUSB0/tty:ttyUSB0 $lspci [..] 00:03.3 Serial controller: Intel Corporation Mobile PM965/GM965 KT Controller (rev 0c) [..] 00:1a.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Contoller #4 (rev 03) [..] 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev f3) [..] 15:00.0 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev ba)
some explanations on this example :
- serial8250
- ttyS* under "serial8250" probably doesn't exist (they are present by default because it's hard to detect if they are present or not)
- 0000:00:1e.0/0000:15:00.0/0.0/tty:ttyS1
if you look at the lspci output above, pci device "00:1e.0" is a PCI bridge to the card bus controller ("15:00.0"), so ttyS1 is a PC Card device.
- pci0000:00/0000:00:03.3/tty:ttyS0
- ttyS0 is directly connected to the PCI bus. according to the PCI device name, you can assume it isn't a Modem, so it's probably a built-in serial interface.
- ttyUSB0/tty:ttyUSB0
if you look at the lspci output above, pci device "00:1a.0" is a USB Controller, so ttyUSB1 is a USB device (USB-to-serial or modem).
more example : thinkpad-a22-find-sysfs.txt
keywords:UART ; 8250 , 16550 ; 16450 ; RS232 ; RS-232 ; DB-9 ; DB9 ; DB25 ; UART ; Serial ; ttyS0 ; ttyS1 ; ttyS3 ; ttyS4 ;COM1 ; COM2 ; Com Port