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 緩衝區函式之前呼叫。