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 缓冲区。对于每个字符,标志数组指示字符的状态。

返回

添加的数目。

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 结构。

描述

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

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

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

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 缓冲区函数被使用之前调用。