TTY 缓冲区¶
在此,我们记录了用于处理 tty 缓冲区及其翻转的函数。驱动程序应使用下面的函数之一填充缓冲区,然后翻转缓冲区,以便将数据传递给线路规程进行进一步处理。
翻转缓冲区管理¶
参数
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_NORMAL
、TTY_BREAK
等标志缓冲区size_t count
要处理的字节数
描述
除 flush_to_ldisc()
之外的调用方需要将 kworker 从并发使用线路规程中排除,请参阅 paste_selection()。
返回
已处理的字节数。
参数
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 缓冲区。对于每个字符,标志数组指示字符的状态。
返回
添加的数目。
参数
struct tty_port *port
tty 端口
u8 ch
字符
u8 flag
标志字节
描述
将单个字节 ch 排队到 tty 缓冲中,带有可选标志。
其他函数¶
参数
struct tty_port *port
拥有翻转缓冲区的tty端口
返回
驱动程序在不达到缓冲区限制的情况下可以写入的字节数。
注意
这并不保证有内存可用于写入返回的字节数(如果需要内存保证,请使用 tty_prepare_flip_string()
进行预分配)。
参数
struct tty_port *port
要更改的 tty 端口
int limit
要设置的内存限制
描述
更改 tty 缓冲区内存限制。
必须在其他 tty 缓冲区函数使用之前调用。
缓冲区锁定¶
这些仅在特殊情况下使用。避免使用它们。
参数
struct tty_port *port
拥有翻转缓冲区的tty端口
描述
通过排除缓冲区工作和任何挂起的刷新操作使用翻转缓冲区,保证 tty_ldisc_ops.receive_buf()
方法的安全使用。数据可以继续从驱动程序端并发添加到翻转缓冲区。
内部函数¶
参数
struct tty_port *port
要释放的 tty 端口
描述
删除 tty 上所有挂起的缓冲区,无论是有数据排队的还是在空闲环中。当 tty 不再使用时必须调用此函数。
参数
struct tty_port *port
tty 端口
size_t size
所需大小(字符数)
描述
分配一个新的 tty 缓冲区以容纳所需数量的字符。我们将缓冲区舍入为 256 个字符的块,以获得更好的分配行为。
返回
如果内存不足或分配将超过每个设备的队列,则返回 NULL
。
参数
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 输入缓冲区。
锁定:获取缓冲区锁以确保单线程翻转缓冲区“使用者”。
参数
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 使用)。
返回
添加的数目。
参数
struct tty_port *port
要初始化的 tty 端口。
描述
为 tty 设备设置缓冲区管理的初始状态。必须在其他 tty 缓冲区函数被使用之前调用。