TTY 缓冲区

在这里,我们记录了用于处理 tty 缓冲区及其翻转的函数。驱动程序应该通过以下函数之一填充缓冲区,然后翻转缓冲区,以便将数据传递给行规程以进行进一步处理。

翻转缓冲区管理

size_t tty_prepare_flip_string(struct tty_port *port, u8 **chars, size_t size)

为字符腾出空间

参数

struct tty_port *port

tty 端口

u8 **chars

字符写入区域的返回指针

size_t size

所需大小

描述

在缓冲区中准备一个空间块来存储数据。

这用于需要它们自己的块复制例程到缓冲区中的驱动程序。不保证缓冲区是 DMA 目标!

返回

可用长度和缓冲区指针 (chars) 到现在已分配并计为准备好用于正常字符的空间。

size_t tty_ldisc_receive_buf(struct tty_ldisc *ld, const u8 *p, const u8 *f, size_t count)

将数据转发到行规程

参数

struct tty_ldisc *ld

用于处理输入的行规程

const u8 *p

字符缓冲区

const u8 *f

TTY_NORMALTTY_BREAK 等标志缓冲区

size_t count

要处理的字节数

描述

除了flush_to_ldisc()之外的调用者需要排除 kworker 并发使用行规程,请参阅 paste_selection()。

返回

处理的字节数。

void tty_flip_buffer_push(struct tty_port *port)

推送终端缓冲区

参数

struct tty_port *port

要推送的 tty 端口

描述

将终端翻转缓冲区的推送排队到行规程。可以从 IRQ/原子上下文中调用。

如果队列忙于翻转,则该工作将被搁置并在以后重试。

size_t tty_insert_flip_string_fixed_flag(struct tty_port *port, const u8 *chars, u8 flag, size_t size)

将字符添加到 tty 缓冲区

参数

struct tty_port *port

tty 端口

const u8 *chars

字符

u8 flag

每个字符的标志值

size_t size

大小

描述

将一系列字节排队到 tty 缓冲中。所有传递的字符都标有提供的标志。

返回

添加的数量。

size_t tty_insert_flip_string_flags(struct tty_port *port, const u8 *chars, const u8 *flags, size_t size)

将字符添加到 tty 缓冲区

参数

struct tty_port *port

tty 端口

const u8 *chars

字符

const u8 *flags

标志字节

size_t size

大小

描述

将一系列字节排队到 tty 缓冲中。对于每个字符,flags 数组指示字符的状态。

返回

添加的数量。

size_t tty_insert_flip_char(struct tty_port *port, u8 ch, u8 flag)

将一个字符添加到 tty 缓冲区

参数

struct tty_port *port

tty 端口

u8 ch

字符

u8 flag

标志字节

描述

将单个字节 ch 排队到 tty 缓冲中,带有可选标志。


其他函数

unsigned int tty_buffer_space_avail(struct tty_port *port)

返回未使用的缓冲区空间

参数

struct tty_port *port

拥有翻转缓冲区的 tty 端口

返回

驱动程序可以在不达到缓冲区限制的情况下写入的字节数。

注意

这不保证有内存可用于写入返回的字节数(如果需要内存保证,请使用tty_prepare_flip_string()进行预分配)。

int tty_buffer_set_limit(struct tty_port *port, int limit)

更改 tty 缓冲区内存限制

参数

struct tty_port *port

要更改的 tty 端口

int limit

要设置的内存限制

描述

更改 tty 缓冲区内存限制。

必须在使用其他 tty 缓冲区函数之前调用。


缓冲区锁定

这些仅在特殊情况下使用。避免使用它们。

void tty_buffer_lock_exclusive(struct tty_port *port)

获取缓冲区的独占访问权

参数

struct tty_port *port

拥有翻转缓冲区的 tty 端口

描述

通过排除缓冲区工作和任何待处理的刷新使用翻转缓冲区,保证安全使用tty_ldisc_ops.receive_buf()方法。数据可以继续从驱动程序端并发添加到翻转缓冲区。

另请参阅tty_buffer_unlock_exclusive()

void tty_buffer_unlock_exclusive(struct tty_port *port)

释放独占访问权

参数

struct tty_port *port

拥有翻转缓冲区的 tty 端口

描述

如果翻转缓冲区中有数据,则会重新启动缓冲区工作。

另请参阅tty_buffer_lock_exclusive()


内部函数

void tty_buffer_free_all(struct tty_port *port)

释放 tty 使用的缓冲区

参数

struct tty_port *port

要从中释放的 tty 端口

描述

删除 tty 上挂起的所有缓冲区,无论是在队列中还是在空闲环中。当 tty 不再使用时必须调用。

struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)

分配 tty 缓冲区

参数

struct tty_port *port

tty 端口

size_t size

所需大小(字符)

描述

分配一个新的 tty 缓冲区以容纳所需数量的字符。我们将缓冲区四舍五入为 256 个字符块,以获得更好的分配行为。

返回

如果内存不足或分配将超过每个设备的队列,则为NULL

void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)

释放 tty 缓冲区

参数

struct tty_port *port

拥有缓冲区的 tty 端口

struct tty_buffer *b

要释放的缓冲区

描述

释放 tty 缓冲区,或根据我们的内部策略将其添加到空闲列表中。

void tty_buffer_flush(struct tty_struct *tty, struct tty_ldisc *ld)

刷新已满的 tty 缓冲区

参数

struct tty_struct *tty

要刷新的 tty

struct tty_ldisc *ld

可选 ldisc 指针(必须引用)

描述

刷新所有包含接收数据的缓冲区。如果 ld != NULL,则刷新 ldisc 输入缓冲区。

锁定:获取缓冲区锁以确保单线程翻转缓冲区“使用者”。

int __tty_buffer_request_room(struct tty_port *port, size_t size, bool flags)

如果需要,增长 tty 缓冲区

参数

struct tty_port *port

tty 端口

size_t size

所需大小

bool flags

缓冲区必须存储标志以及字符数据

描述

为 tty 缓冲区提供至少 size 字节的线性空间。

如果当前缓冲区编码为TTY_NORMAL(因此没有标志缓冲区)并且新缓冲区需要标志缓冲区,则将更改为新缓冲区。

返回

我们设法找到的大小。

void flush_to_ldisc(struct work_struct *work)

将数据从缓冲区刷新到 ldisc

参数

struct work_struct *work

从工作队列传递的 tty 结构。

描述

此例程从软件中断中调用,以将数据从缓冲区链刷新到行规程。

receive_buf() 方法对于每个 tty 实例都是单线程的。

锁定:获取缓冲区锁以确保单线程翻转缓冲区“使用者”。

int tty_insert_flip_string_and_push_buffer(struct tty_port *port, const u8 *chars, size_t size)

将字符添加到 tty 缓冲区并推送

参数

struct tty_port *port

tty 端口

const u8 *chars

字符

size_t size

大小

描述

该函数结合了 tty_insert_flip_string() 和 tty_flip_buffer_push(),但正确地保持 port->lock 除外。

仅供内部使用(当前由 pty 使用)。

返回

添加的数量。

void tty_buffer_init(struct tty_port *port)

准备 tty 缓冲区结构

参数

struct tty_port *port

要初始化的 tty 端口

描述

设置 tty 设备的缓冲区管理的初始状态。必须在使用其他 tty 缓冲区函数之前调用。