我目前正在开发一个串行端口库,该库已经使用特殊框架来获取有关系统上串行端口的信息。尽管串行端口是 Unix 中的基本设计——作为答案,例如这个证明——我认为测试文件是否是串行端口的一个好方法是测试字符设备的主要模式并检查这是否实际上是 a TTY
。
在互联网上爬行,我找不到任何关于TTY
s 跨 unices 的主要模式的文档。嗯,只有一个 Linux 手册页指出 ptmx 有主模式 5。
虽然我已经询问过基于 tty 字符设备的实现细节这个堆栈溢出 问题,我想我可以问 Unix Stack Exchange 社区来找出答案如何tty 值跨 Unix 风格稳定。
因此,我请求您帮助建立系统上所有 tty 文件的主要模式的知识库,即:什么是主要模式
- 真正的串口?
- 伪终端 (
PTS
) 端口? FTDI USB
串口?- 其他
USB
串口?
要获取字符设备的主要模式的值,您应该使用:
% stat -f " * %N: %Hr%n" /dev/tty* /dev/pts/*
* /dev/ttys001: 16
^^- major mode
或使用旧的ls
:
% ls -l /dev/ttys001
crw--w---- 1 <user> tty 16, 1 Apr 30 03:25 /dev/ttys001
major mode -^^ ^^- minor mode
您可以将信息放入您自己的答案中,或者使用其他信息扩展社区 wiki 答案。
答案1
Unix 版本 7(1979):
# ls -l /dev/console /dev/tty?*
crw--w--w- 1 root 0, 0 Sep 22 06:46 /dev/console
crw-rw-r-- 1 root 0, 1 Sep 22 05:47 /dev/tty1
crw-rw-r-- 1 root 0, 2 Sep 22 05:47 /dev/tty2
(那里还没有 pty)
Linux 3.2.0(debian 喘息)。
注意:您还可以通过搜索/dev
owned by grouptty
和来找到这些dialout
。那是 Debian 的事情。
- 虚拟控制台
/dev/tty[0-9]*
:4
- 真实串口:
/dev/ttyS[0-9]+
:4
- 伪终端:
/dev/pts/[0-9]+
: 136/dev/pts/ptmx
: 5
- FTDI USB 串口:
/dev/ttyUSB[0-9]+
:188
- USB串口:(AVR嵌入式USB/Arduino Uno)
/dev/ttyACM[0-9]+
: 166
Linux 3.4.0(安卓 4.4.2/Nexus 5)
注意:具有所有 linux 加上:
- ttyACM(蜂窝调制解调器控制)
- (
/dev
显然没有条目):166
- (
- ttyHSL(蓝牙)
/dev/ttyHSL0
: 247
- ttyHS(蓝牙)
/dev/ttyHS99
: 248
达尔文 13.1.0(MacOS 10.9.2):
- 真实串口:
/dev/ttys[0-9a-f]
:4
- 伪终端:
/dev/ttys[0-9]{3}
:16
- FTDI USB 串口:
/dev/tty.usbserial.*
:18
- USB串口:(AVR嵌入式USB/Arduino Uno)
/dev/tty.usbmodem.*
:18
Solaris 10 x86/amd64:
伪终端:
/dev/pty[p-r][0-9a-f]
(pty大师):25/dev/tty[p-r][0-9a-f]
(pty奴隶):26/dev/pts/[0-9]+
:24/dev/ptmx
:23
串口设备:
/dev/tty[abc...]
又名/dev/term/[abc...]
或/dev/tty0[012..]
(UART 串行,也):106- 也
/dev/ttyd[012...]
有不同的接口(拨号、调制解调器)也有 106 但高未成年人。
OpenBSD 6.0
正如评论中所述/dev/MAKEDEV
- PC/AT UART串口:
/dev/tty[0-7][0-9a-f]
: 8/dev/cua[0-7][0-9a-f]
: 8
- 基克拉泽斯串行端口:
/dev/ttyc*
:38/dev/cuac*
:38
- Virtio串口:
/dev/ttyVI*
:94
- USB串口:
/dev/ttyU[0-3]
: 66/dev/cuaU[0-3]
: 66
- wscons 终端:
/dev/tty[C-J][0-b]
:12
- 伪终端主从(非UNIX 98)
/dev/pty[p-zP-T][0-9a-zA-Z]
: 6/dev/tty[p-zP-T][0-9a-zA-Z]
: 5
FreeBSD 10.0 和 TrueOS
FreeBSD(及其衍生产品,例如 TrueOS)是您的想法显示出致命缺陷的地方。那里没有FreeBSD 中的主+次设备编号方案。
devfs
FreeBSD 上的伪文件系统通常安装在,/dev
根本不使用主+次系统将设备分组为“主”类。相反,研发人员设备的 i 节点号与其在伪文件系统中的 i 节点号相同,i 节点在生成设备节点时简单地按升序分配,具体取决于当时机器上的确切硬件。
所以设备号不能作为 的快捷方式isatty()
。
答案2
在 Linux 3.8.2 源代码树上:
$ cscope -dL1 '.*MAJOR' | grep -e TTY -e PTS -e PTY
drivers/s390/char/sclp_vt220.c .*MAJOR 31 #define SCLP_VT220_MAJOR TTY_MAJOR
drivers/staging/net/pc300_tty.c .*MAJOR 62 #define CPC_TTY_MAJOR CYCLADES_MAJOR
drivers/staging/sb105x/sb_pci_mp.h .*MAJOR 42 #define SB_TTY_MP_MAJOR 54
drivers/tty/rocket_int.h .*MAJOR 1168 #define TTY_ROCKET_MAJOR 46
drivers/tty/serial/apbuart.c .*MAJOR 38 #define SERIAL_APBUART_MAJOR TTY_MAJOR
drivers/tty/serial/atmel_serial.c .*MAJOR 79 #define SERIAL_ATMEL_MAJOR TTY_MAJOR
drivers/tty/serial/pmac_zilog.c .*MAJOR 93 #define PMACZILOG_MAJOR TTY_MAJOR
drivers/tty/serial/serial_txx9.c .*MAJOR 45 #define TXX9_TTY_MAJOR 204
drivers/tty/serial/serial_txx9.c .*MAJOR 50 #define TXX9_TTY_MAJOR TTY_MAJOR
drivers/usb/class/cdc-acm.h .*MAJOR 21 #define ACM_TTY_MAJOR 166
drivers/usb/serial/ipw.c .*MAJOR 55 #define IPW_TTY_MAJOR 240
include/linux/isdn.h .*MAJOR 41 #define ISDN_TTY_MAJOR 43
include/linux/isdn.h .*MAJOR 42 #define ISDN_TTYAUX_MAJOR 44
include/linux/usb/serial.h .*MAJOR 21 #define SERIAL_TTY_MAJOR 188
include/net/irda/ircomm_tty.h .*MAJOR 45 #define IRCOMM_TTY_MAJOR 161
include/uapi/linux/major.h .*MAJOR 13 #define PTY_MASTER_MAJOR 2
include/uapi/linux/major.h .*MAJOR 16 #define PTY_SLAVE_MAJOR 3
include/uapi/linux/major.h .*MAJOR 17 #define TTY_MAJOR 4
include/uapi/linux/major.h .*MAJOR 18 #define TTYAUX_MAJOR 5
include/uapi/linux/major.h .*MAJOR 144 #define UNIX98_PTY_MASTER_MAJOR 128
include/uapi/linux/major.h .*MAJOR 146 #define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT)
include/uapi/linux/major.h .*MAJOR 169 #define IBM_TTY3270_MAJOR 227
net/bluetooth/rfcomm/tty.c .*MAJOR 40 #define RFCOMM_TTY_MAJOR 216
UNIX98_PTY_MAJOR_COUNT 是 8,这给你的 pty-slave = 136,但似乎没有以其他方式使用。
我想到的另一个是:
drivers/tty/hvc/hvc_console.c .*MAJOR 48 #define HVC_MAJOR 229
(XEN 串行设备)。
现在,还有一个具有动态分配主号码的号码。例如:
tty_drv->driver_name = "sdio_uart";
tty_drv->name = "ttySDIO";
tty_drv->major = 0; /* dynamically allocated */
tty_register_driver
您可以查找所有对where is 0 的调用driver->major
。
有些您还可以提供主设备号作为内核/模块参数。例如hso
。
因此,在 Linux 上,听起来您必须在 /proc/devices 中查找主要并根据驱动程序名称而不是主要编号来决定。