TTY终端

终端

终端是一个电子(或电气)设备,用于向系统输入数据(input),或者将系统接收到的数据显示出来(output),即我们常说的“人机交互设备”。 TTY(Teletypewriter)代表终端设备的概念,它允许用户与系统进行交互,在Linux中,TTY可分为如下几类:

  • 物理终端(serial port terminal): 指使用计算机串行端口连接的终端设备, /dev/ttyS*
  • 伪终端(pseudo terminal): 通常是通过ssh/telnet 登陆的终端, /dev/pts/*
  • 控制终端(controlling terminal): 代表当前tty设备 /dev/tty
  • 控制台终端(console): 指计算机的输出设备, 通常是printk信息输出的设备, /dev/ttyn、/dev/console

TTY 设备文件

TTY 设备在 Linux 文件系统 中的表现为设备文件,通常位于 /dev 目录下。常见的 TTY 设备文件包括:

  • /dev/tty:当前终端的设备文件。
  • /dev/ttyN:虚拟控制台设备文件,其中 N 是控制台编号(例如,/dev/tty1 对应第一个虚拟控制台)。
  • /dev/pts/N:伪终端设备文件,其中 N 是伪终端编号。
  • /dev/ttyS0:串口设备文件,/dev/ttyS1 对应第二个串口设备,以此类推。

使用TTY

串口子系统

串口子系统框架是 Linux 内核中专门用于处理串口设备的模块化框架

graph TD
	A[应用层]
	B[字符设备]
	C[tty_core层]
    D[uart_core层]
    E[硬件层]
    A-->B
    B-->C
    C-->D
    D-->E

应用层:

​ 位于最顶层,应用层包括用户空间的串口应用程序,如串口通信工具 minicom等

字符设备层:

​ 位于应用层的下方,负责将用户空间的串口读写请求传递给内核空间的tty_core 层。字符设备层将串口设备看作一个特殊的字符设备,通过字符设备接口来进行操作。

tty_core层:

​ 位于字符设备层的下方,是串口设备的通用处理层。在 Linux 内核中用于管理串口设备,如数据传输,控制,缓冲管理等

uart_core 层:

位于 tty_core 层的下方,提供了串口设备的底层驱动接口,如负责控制串口数据的发送和接收、中断处理、时钟管理等底层操作。

串口设备节点

串口设备节点命名以tty为前缀。可以通过ls /dev/tty*查看已创建的串口设备节点。

image-20260923152951313

虚拟控制终端

/dev/tty1、/dev/tty2 等是虚拟控制台的编号接口。是否支持虚拟控制台、创建哪些设备节点以及实际分配多少控制台,取决于内核配置与用户空间设备管理,不能假定所有系统启动时都有 63 个已分配控制台。

  • /dev/tty0:表示前台程序的虚拟终端

UART串口

/dev/ttyS1、/dev/ttyS2 是串口设备节点,只有通过内核 console 参数等配置选中后才承担串口控制台角色;登录终端通常还需配置 getty。

A1

在

/* 在a1_claf_v12.dts*/
&uart1 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&uart1_pc>;
};

/*a1.dtsi*/
uart1: serial@0x10031000 {
    compatible = "ingenic,8250-uart";
    reg = <0x10031000 0x1000>;
    reg-shift = <2>;
    interrupt-parent = <&core_intc>;
    interrupts = <IRQ_UART1>;
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_pc>;   /*指向a1-pinctrl.dtsi*/
    status = "disabled";
};
/*a1-pinctrl.dtsi*/
uart1_pin: uart1-pin {
    uart1_pc: uart1-pc {    /*真正的引脚配置节点*/
        ingenic,pinmux = <&gpc 6 7>;
        ingenic,pinmux-funcsel = <PINCTL_FUNCTION0>;
    };
};