底層序列 API

本文件旨在簡要概述新的序列驅動程式的某些方面。 它並不完整,您有任何問題都應傳送至 <rmk@arm.linux.org.uk>

參考實現包含在 amba-pl011.c 中。

底層序列硬體驅動程式

底層序列硬體驅動程式負責向核心序列驅動程式提供埠資訊(由 uart_port 定義)和一組控制方法(由 uart_ops 定義)。 底層驅動程式還負責處理埠的中斷,並提供任何控制檯支援。

控制檯支援

序列核心提供了一些輔助函式。 這包括識別正確的埠結構(透過 uart_get_console())和解碼命令列引數 (uart_parse_options())。

還有一個輔助函式 (uart_console_write()),它執行逐個字元的寫入,並將換行符轉換為 CRLF 序列。 建議驅動程式編寫者使用此函式,而不是實現自己的版本。

鎖定

底層硬體驅動程式負責使用 port->lock 執行必要的鎖定。 有一些例外(在下面的 struct uart_ops 列表中進行了描述。)

有兩個鎖。 每個埠的自旋鎖和一個總體訊號量。

從核心驅動程式的角度來看,port->lock 鎖定以下資料

port->mctrl
port->icount
port->state->xmit.head (circ_buf->head)
port->state->xmit.tail (circ_buf->tail)

底層驅動程式可以自由使用此鎖來提供任何額外的鎖定。

port_sem 訊號量用於防止埠在不適當的時間新增/刪除或重新配置。 自 v2.6.27 以來,此訊號量一直是 tty_port 結構中的“mutex”成員,通常稱為埠互斥鎖。

uart_ops

struct uart_ops
  • serial_core 和驅動程式之間的介面

定義:

struct uart_ops {
    unsigned int    (*tx_empty)(struct uart_port *);
    void (*set_mctrl)(struct uart_port *, unsigned int mctrl);
    unsigned int    (*get_mctrl)(struct uart_port *);
    void (*stop_tx)(struct uart_port *);
    void (*start_tx)(struct uart_port *);
    void (*throttle)(struct uart_port *);
    void (*unthrottle)(struct uart_port *);
    void (*send_xchar)(struct uart_port *, char ch);
    void (*stop_rx)(struct uart_port *);
    void (*start_rx)(struct uart_port *);
    void (*enable_ms)(struct uart_port *);
    void (*break_ctl)(struct uart_port *, int ctl);
    int (*startup)(struct uart_port *);
    void (*shutdown)(struct uart_port *);
    void (*flush_buffer)(struct uart_port *);
    void (*set_termios)(struct uart_port *, struct ktermios *new, const struct ktermios *old);
    void (*set_ldisc)(struct uart_port *, struct ktermios *);
    void (*pm)(struct uart_port *, unsigned int state, unsigned int oldstate);
    const char      *(*type)(struct uart_port *);
    void (*release_port)(struct uart_port *);
    int (*request_port)(struct uart_port *);
    void (*config_port)(struct uart_port *, int);
    int (*verify_port)(struct uart_port *, struct serial_struct *);
    int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
#ifdef CONFIG_CONSOLE_POLL;
    int (*poll_init)(struct uart_port *);
    void (*poll_put_char)(struct uart_port *, unsigned char);
    int (*poll_get_char)(struct uart_port *);
#endif;
};

成員

tx_empty

unsigned int ()(struct uart_port *port)

此函式測試 port 的傳送器 FIFO 和移位器是否為空。 如果為空,此函式應返回 TIOCSER_TEMT,否則返回 0。如果埠不支援此操作,則應返回 TIOCSER_TEMT

鎖定:無。 中斷:呼叫者相關。 此呼叫不得休眠

set_mctrl

void ()(struct uart_port *port, unsigned int mctrl)

此函式將 port 的調變解調器控制線設定為 mctrl 描述的狀態。 mctrl 的相關位是

  • TIOCM_RTS RTS 訊號。

  • TIOCM_DTR DTR 訊號。

  • TIOCM_OUT1 OUT1 訊號。

  • TIOCM_OUT2 OUT2 訊號。

  • TIOCM_LOOP 將埠設定為環回模式。

如果設定了相應的位,則應啟用該訊號。 如果該位已清除,則應取消啟用該訊號。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

get_mctrl

unsigned int ()(struct uart_port *port)

返回 port 的調變解調器控制輸入的當前狀態。 不應返回輸出的狀態,因為核心會跟蹤其狀態。 狀態資訊應包括

  • TIOCM_CAR DCD 訊號的狀態

  • TIOCM_CTS CTS 訊號的狀態

  • TIOCM_DSR DSR 訊號的狀態

  • TIOCM_RI RI 訊號的狀態

如果當前啟用訊號,則設定該位。 如果埠不支援 CTS、DCD 或 DSR,則驅動程式應指示該訊號永久啟用。 如果 RI 不可用,則不應將該訊號指示為啟用。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

stop_tx

void ()(struct uart_port *port)

停止傳輸字元。 這可能是由於 CTS 線變為不活動狀態,或者 tty 層指示我們要由於 XOFF 字元而停止傳輸。

驅動程式應儘快停止傳輸字元。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

start_tx

void ()(struct uart_port *port)

開始傳輸字元。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

throttle

void ()(struct uart_port *port)

通知序列驅動程式線路規程的輸入緩衝區即將滿,它應以某種方式發出訊號,指示不應再將字元傳送到序列埠。 僅當啟用硬體輔助流控制時才會呼叫此函式。

鎖定:與 tty 層進行的 unthrottle() 和 termios 修改序列化。

unthrottle

void ()(struct uart_port *port)

通知序列驅動程式現在可以將字元傳送到序列埠,而不必擔心線路規程的輸入緩衝區溢位。

僅當啟用硬體輔助流控制時才會呼叫此函式。

鎖定:與 tty 層進行的 throttle() 和 termios 修改序列化。

send_xchar

void ()(struct uart_port *port, char ch)

即使埠已停止,也傳輸高優先順序字元。 這用於實現 XON/XOFF 流控制和 tcflow()。 如果序列驅動程式未實現此函式,則 tty 核心會將字元附加到迴圈緩衝區,然後呼叫 start_tx() / stop_tx() 以重新整理資料。

如果 ch == '0' (__DISABLED_CHAR),則不傳輸。

鎖定:無。 中斷:呼叫者相關。

stop_rx

void ()(struct uart_port *port)

停止接收字元; port 正在關閉。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

start_rx

void ()(struct uart_port *port)

開始接收字元。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

enable_ms

void ()(struct uart_port *port)

啟用調變解調器狀態中斷。

可以多次呼叫此方法。 呼叫 shutdown() 方法時應停用調變解調器狀態中斷。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

break_ctl

void ()(struct uart_port *port, int ctl)

控制中斷訊號的傳輸。 如果 ctl 非零,則應傳輸中斷訊號。 當使用零 ctl 進行另一次呼叫時,應終止該訊號。

鎖定:呼叫者持有 tty_port->mutex

startup

int ()(struct uart_port *port)

獲取任何中斷資源並初始化任何底層驅動程式狀態。 啟用埠以進行接收。 它不應啟用 RTS 或 DTR; 這將透過對 set_mctrl() 的單獨呼叫來完成。

僅當最初開啟埠時才會呼叫此方法。

鎖定:已獲取 port_sem。 中斷:全域性停用。

shutdown

void ()(struct uart_port *port)

停用 port,停用可能有效的任何中斷條件,並釋放任何中斷資源。 它不應停用 RTS 或 DTR; 這將已透過對 set_mctrl() 的單獨呼叫來完成。

一旦此呼叫完成,驅動程式不得訪問 port->state

僅當沒有更多使用者使用此 port 時才會呼叫此方法。

鎖定:已獲取 port_sem。 中斷:呼叫者相關。

flush_buffer

void ()(struct uart_port *port)

重新整理任何寫入緩衝區,重置任何 DMA 狀態並停止任何正在進行的 DMA 傳輸。

每當清除 port->state->xmit 迴圈緩衝區時都會呼叫此函式。

鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠

set_termios

void ()(struct uart_port *port, struct ktermios *new, struct ktermios *old)

更改 port 引數,包括字長、奇偶校驗、停止位。 更新 port->read_status_maskport->ignore_status_mask 以指示我們感興趣接收的事件型別。 相關的 ktermios::c_cflag 位是

  • CSIZE - 字大小

  • CSTOPB - 2 個停止位

  • PARENB - 啟用奇偶校驗

  • PARODD - 奇校驗(當 PARENB 有效時)

  • ADDRB - 地址位(透過 uart_port::rs485_config() 更改)。

  • CREAD - 啟用字元接收(如果未設定,仍從埠接收字元,但將其丟棄)。

  • CRTSCTS - 如果設定,則啟用 CTS 狀態更改報告。

  • CLOCAL - 如果未設定,則啟用調變解調器狀態更改報告。

相關的 ktermios::c_iflag 位是

  • INPCK - 啟用幀和奇偶校驗錯誤事件以傳遞到 TTY 層。

  • BRKINT / PARMRK - 這兩者都啟用中斷事件以傳遞到 TTY 層。

  • IGNPAR - 忽略奇偶校驗和幀錯誤。

  • IGNBRK - 忽略中斷錯誤。 如果還設定了 IGNPAR,則也忽略溢位錯誤。

ktermios::c_iflag 位的互動如下(以奇偶校驗錯誤為例)

奇偶校驗錯誤

INPCK

IGNPAR

n/a

0

n/a

接收到的字元,標記為 TTY_NORMAL

1

n/a

接收到的字元,標記為 TTY_NORMAL

1

0

接收到的字元,標記為 TTY_PARITY

1

1

丟棄的字元

如果您的硬體支援硬體“軟”流控制,則可以使用其他標誌(例如,xon/xoff 字元)。

鎖定:呼叫者持有 tty_port->mutex 中斷:呼叫者相關。 此呼叫不得休眠

set_ldisc

void ()(struct uart_port *port, struct ktermios *termios)

規程更改的通知程式。 請參閱 TTY 線路規程

鎖定:呼叫者持有 tty_port->mutex

pm

void ()(struct uart_port *port, unsigned int state, unsigned int oldstate)

對指定的 port 執行任何電源管理相關的活動。 state 指示新狀態(由 enum uart_pm_state 定義),oldstate 指示以前的狀態。

此函式不應用於獲取任何資源。

當最初開啟 port 並最終關閉時,將呼叫此函式,除非 port 也是系統控制檯。 即使未設定 CONFIG_PM,也會發生這種情況。

鎖定:無。 中斷:呼叫者相關。

type

const char *()(struct uart_port *port)

返回指向描述指定 port 的字串常量的指標,或者返回 NULL,在這種情況下,將替換字串“unknown”。

鎖定:無。 中斷:呼叫者相關。

release_port

void ()(struct uart_port *port)

釋放 port 當前使用的任何記憶體和 IO 區域資源。

鎖定:無。 中斷:呼叫者相關。

request_port

int ()(struct uart_port *port)

請求埠所需的任何記憶體和 IO 區域資源。 如果任何資源失敗,則在此函式返回時,不應註冊任何資源,並且應在失敗時返回 -EBUSY

鎖定:無。 中斷:呼叫者相關。

config_port

void ()(struct uart_port *port, int type)

執行 port 所需的任何自動配置步驟。 type 包含所需配置的位掩碼。 UART_CONFIG_TYPE 指示埠需要檢測和識別。 port->type 應設定為找到的型別,如果未檢測到埠,則設定為 PORT_UNKNOWN

UART_CONFIG_IRQ 指示中斷訊號的自動配置,應使用標準核心自動探測技術進行探測。 在埠在內部硬連線中斷的平臺上(例如,片上系統實現),這沒有必要。

鎖定:無。 中斷:呼叫者相關。

verify_port

int ()(struct uart_port *port, struct serial_struct *serinfo)

驗證 serinfo 中包含的新序列埠資訊是否適合此埠型別。

鎖定:無。 中斷:呼叫者相關。

ioctl

int ()(struct uart_port *port, unsigned int cmd, unsigned long arg)

執行任何特定於埠的 IOCTL。 IOCTL 命令必須使用 <asm/ioctl.h> 中找到的標準編號系統來定義。

鎖定:無。 中斷:呼叫者相關。

poll_init

int ()(struct uart_port *port)

由 kgdb 呼叫,以執行支援 poll_put_char()poll_get_char() 所需的最少硬體初始化。 與 startup() 不同,這不應請求中斷。

鎖定:已獲取 tty_mutex 和 tty_port->mutex。 中斷:n/a。

poll_put_char

void ()(struct uart_port *port, unsigned char ch)

由 kgdb 呼叫,以將單個字元 ch 直接寫入序列 port。 它可以並且應該阻塞,直到 TX FIFO 中有空間。

鎖定:無。 中斷:呼叫者相關。 此呼叫不得休眠

poll_get_char

int ()(struct uart_port *port)

由 kgdb 呼叫,以直接從序列埠讀取單個字元。 如果有資料可用,則應返回;否則,該函式應立即返回 NO_POLL_CHAR

鎖定:無。 中斷:呼叫者相關。 此呼叫不得休眠

說明

此結構描述了可以在物理硬體上完成的所有操作。

其他函式

void uart_write_wakeup(struct uart_port *port)

計劃寫入處理

引數

struct uart_port *port

要處理的埠

說明

中斷處理程式使用此例程來安排驅動程式的軟體中斷部分中的處理。 當傳輸緩衝區中的字元數已降至閾值以下時,驅動程式應呼叫此函式。

鎖定:應持有 port->lock

void uart_update_timeout(struct uart_port *port, unsigned int cflag, unsigned int baud)

更新每個埠的幀定時資訊

引數

struct uart_port *port

描述埠的 uart_port 結構

unsigned int cflag

termios cflag 值

unsigned int baud

埠速度

說明

設定 port 幀定時資訊,從中匯出 FIFO 超時值。 cflag 值應反映實際的硬體設定,因為此處考慮了位數、奇偶校驗、停止位和波特率。

鎖定:呼叫者應獲取 port->lock

unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios, const struct ktermios *old, unsigned int min, unsigned int max)

返回特定埠的波特率

引數

struct uart_port *port

描述相關埠的 uart_port 結構。

struct ktermios *termios

所需的 termios 設定

const struct ktermios *old

舊 termios(或 NULL

unsigned int min

最小可接受的波特率

unsigned int max

最大可接受的波特率

說明

將 termios 結構解碼為數字波特率,同時考慮神奇的 38400 波特率(帶有 spd_* 標誌),並將 B0 速率對映到 9600 波特。

如果新的波特率無效,請嘗試 old termios 設定。 如果仍然無效,我們會嘗試 9600 波特。 如果這也無效,則返回 0。

將更新 termios 結構以反映我們實際將使用的波特率。 對於請求 B0 的情況(“結束通話”),不要這樣做。

鎖定:呼叫者相關

unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud)

返回 uart 時鐘除數

引數

struct uart_port *port

描述埠的 uart_port 結構

unsigned int baud

所需的波特率

說明

計算指定 baud 的除數 (baud_base / baud),並適當舍入。

如果選擇了 38400 波特和自定義除數,則返回自定義除數。

鎖定:呼叫者相關

int uart_get_lsr_info(struct tty_struct *tty, struct uart_state *state, unsigned int __user *value)

獲取線路狀態暫存器資訊

引數

struct tty_struct *tty

與 UART 關聯的 tty

struct uart_state *state

正在查詢的 UART

unsigned int __user *value

返回的調變解調器值

void uart_console_write(struct uart_port *port, const char *s, unsigned int count, void (*putchar)(struct uart_port*, unsigned char))

將控制檯訊息寫入序列埠

引數

struct uart_port *port

用於寫入訊息的埠

const char *s

字元陣列

unsigned int count

字串中要寫入的字元數

void (*putchar)(struct uart_port *, unsigned char)

將字元寫入埠的函式

struct uart_port *uart_get_console(struct uart_port *ports, int nr, struct console *co)

獲取控制檯的 uart 埠

引數

struct uart_port *ports

要在其中搜索的埠

int nr

ports 的數量

struct console *co

要搜尋的控制檯

返回值

控制檯 co 的 uart_port

說明

檢查是否已指定無效的 uart 編號(作為 co->index),如果是,則搜尋第一個具有控制檯支援的可用埠。

int uart_parse_earlycon(char *p, enum uart_iotype *iotype, resource_size_t *addr, char **options)

解析 earlycon 選項

引數

char *p

指向第二個欄位的指標(即,剛剛超過“<name>,”)

enum uart_iotype *iotype

用於解碼的 iotype 的指標(輸出)

resource_size_t *addr

用於解碼的 mapbase/iobase 的指標(輸出)

char **options

用於 <options> 欄位的指標; 如果不存在,則為 NULL(輸出)

說明

解碼以下形式的 earlycon 核心命令列引數
  • earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>

  • console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>

可選形式
  • earlycon=<name>,0x<addr>,<options>

  • console=<name>,0x<addr>,<options>

也被接受; 返回的 iotype 將為 UPIO_MEM

返回值

成功時為 0,失敗時為 -EINVAL

void uart_parse_options(const char *options, int *baud, int *parity, int *bits, int *flow)

解析序列埠波特率/奇偶校驗/資料位/流控。

引數

const char *options

選項字串指標

int *baud

指向用於儲存波特率的“int”變數的指標。

int *parity

指向用於儲存奇偶校驗的“int”變數的指標。

int *bits

指向用於儲存資料位數的“int”變數的指標。

int *flow

指向用於儲存流控字元的“int”變數的指標。

說明

uart_parse_options() 解碼包含序列埠選項的字串。字串的格式為 <波特率><奇偶校驗><資料位><流控>,例如:115200n8r

int uart_set_options(struct uart_port *port, struct console *co, int baud, int parity, int bits, int flow)

設定序列埠引數

引數

struct uart_port *port

指向序列埠 uart_port 結構的指標

struct console *co

控制檯指標

int baud

波特率

int parity

奇偶校驗字元 - ‘n’(無),‘o’(奇),‘e’(偶)

int bits

資料位數

int flow

流控字元 - ‘r’ (rts)

說明

鎖定:呼叫者必須持有 console_list_lock 才能序列化序列埠鎖的早期初始化。

int uart_register_driver(struct uart_driver *drv)

向 uart 核心層註冊驅動程式

引數

struct uart_driver *drv

底層驅動程式結構

說明

向核心驅動程式註冊 uart 驅動程式。反過來,我們向 tty 層註冊,並初始化每個埠的核心驅動程式狀態。

我們在 /proc/tty/driver 中有一個 proc 檔案,它以普通驅動程式命名。

drv->port 應該為 NULL,並且在成功呼叫此函式後,應使用 uart_add_one_port() 註冊每個埠的結構。

鎖定:無,中斷:啟用

void uart_unregister_driver(struct uart_driver *drv)

從 uart 核心層移除驅動程式

引數

struct uart_driver *drv

底層驅動程式結構

說明

從核心驅動程式中移除對驅動程式的所有引用。如果底層驅動程式使用 uart_add_one_port() 註冊了所有埠,則必須透過 uart_remove_one_port() 移除所有埠。(即 drv->portNULL。)

鎖定:無,中斷:啟用

bool uart_match_port(const struct uart_port *port1, const struct uart_port *port2)

兩個埠是否等效?

引數

const struct uart_port *port1

第一個埠

const struct uart_port *port2

第二個埠

說明

此實用程式函式可用於確定兩個 uart_port 結構是否描述同一埠。

void uart_handle_dcd_change(struct uart_port *uport, bool active)

處理載波檢測狀態的更改

引數

struct uart_port *uport

開啟埠的 uart_port 結構

bool active

新的載波檢測狀態

說明

呼叫者必須持有 uport->lock。

void uart_handle_cts_change(struct uart_port *uport, bool active)

處理清除傳送狀態的更改

引數

struct uart_port *uport

開啟埠的 uart_port 結構

bool active

新的清除傳送狀態

說明

呼叫者必須持有 uport->lock。

bool uart_try_toggle_sysrq(struct uart_port *port, u8 ch)

從序列線路啟用 SysRq

引數

struct uart_port *port

在 BREAK 後遇到 char(s) 的 uart_port 結構

u8 ch

收到 BREAK 後序列中的新字元

說明

當埠上滿足所需序列時,啟用 magic SysRq(請參閱 CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE)。

返回值

如果 ch 超出啟用序列並且應以其他方式處理,則為 false,如果消耗了 ch,則為 true

uart_port_tx_limited

uart_port_tx_limited (port, ch, count, tx_ready, put_char, tx_done)

  • 具有計數限制的 uart_port 的傳輸助手

引數

port

uart 埠

ch

用於儲存要寫入 HW 的字元的變數

count

要傳送的字元數限制

tx_ready

HW 是否可以接受更多資料函式

put_char

寫入字元的函式

tx_done

迴圈完成後要呼叫的函式

說明

此助手使用 put_char() 將字元從 xmit 緩衝區傳輸到硬體。這樣做直到傳送 count 個字元,並且當 tx_ready 的計算結果為 true 時。

宏引數中的表示式應設計如下
  • tx_ready:如果 HW 可以接受更多要傳送的資料,則應評估為 true。此引數可以是 true,這意味著 HW 始終準備就緒。

  • put_char:應將 ch 寫入 port 的裝置。

  • tx_done:當寫入迴圈完成後,這可以在 ops->stop_tx() 的潛在呼叫發生之前執行任意操作。如果驅動程式不需要執行任何操作,請使用例如 ({})。

對於所有這些,都持有 port->lock,本地停用中斷,並且表示式不得睡眠。

返回值

完成後 xmit 緩衝區中的字元數。

uart_port_tx

uart_port_tx (port, ch, tx_ready, put_char)

  • uart_port 的傳輸助手

引數

port

uart 埠

ch

用於儲存要寫入 HW 的字元的變數

tx_ready

HW 是否可以接受更多資料函式

put_char

寫入字元的函式

說明

有關更多詳細資訊,請參見 uart_port_tx_limited()

其他說明

目標是在未來的某一天從 uart_port 中刪除“unused”條目,並允許底層驅動程式向核心註冊它們自己的 uart_port。這將允許驅動程式使用 uart_port 作為指向包含 uart_port 條目及其自身擴充套件的結構的指標,因此

struct my_port {
        struct uart_port        port;
        int                     my_stuff;
};

透過 GPIO 的調變解調器控制線

提供了一些助手函式,以便透過 GPIO 設定/獲取調變解調器控制線。

void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)

根據 mctrl 狀態設定 gpios

引數

struct mctrl_gpios *gpios

要設定的 gpios

unsigned int mctrl

要設定的狀態

說明

根據 mctrl 狀態設定 gpios。

struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios, enum mctrl_gpio_idx gidx)

獲取調變解調器線路索引的 gpio_desc

引數

struct mctrl_gpios *gpios

要查詢的 gpios

enum mctrl_gpio_idx gidx

調變解調器線路的索引

返回值

與調變解調器線路索引關聯的 gpio_desc 結構

unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)

使用 gpios 值更新 mctrl。

引數

struct mctrl_gpios *gpios

從中獲取資訊的 gpios

unsigned int *mctrl

要設定的 mctrl

返回值

修改後的 mctrl(與 mctrl 中的值相同)

說明

使用 gpios 值更新 mctrl。

struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx)

初始化 uart gpios

引數

struct uart_port *port

為其初始化 gpios 的埠

unsigned int idx

裝置中 gpio 的索引

說明

如果裝置樹中存在 {cts,rts,...}-gpios,並且它們被請求,則將從裝置樹中獲取它們,設定方向等,並返回分配的結構。使用 devm_* 函式,因此無需顯式釋放。由於這會設定 irq 處理,請確保也不要在驅動程式中處理 gpio 輸入線的更改。

void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios)

啟用 irqs 並處理 ms 線的更改

引數

struct mctrl_gpios *gpios

要啟用的 gpios

void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios)

停用 irqs 並處理 ms 線的更改,並等待處理任何掛起的 IRQ

引數

struct mctrl_gpios *gpios

要停用的 gpios

void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios)

停用 irqs 並處理 ms 線的更改,並立即返回

引數

struct mctrl_gpios *gpios

要停用的 gpios