底層序列 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_emptyunsigned int ()(struct uart_port *port)此函式測試 port 的傳送器 FIFO 和移位器是否為空。 如果為空,此函式應返回
TIOCSER_TEMT,否則返回 0。如果埠不支援此操作,則應返回TIOCSER_TEMT。鎖定:無。 中斷:呼叫者相關。 此呼叫不得休眠
set_mctrlvoid ()(struct uart_port *port, unsigned int mctrl)此函式將 port 的調變解調器控制線設定為 mctrl 描述的狀態。 mctrl 的相關位是
TIOCM_RTSRTS 訊號。TIOCM_DTRDTR 訊號。TIOCM_OUT1OUT1 訊號。TIOCM_OUT2OUT2 訊號。TIOCM_LOOP將埠設定為環回模式。
如果設定了相應的位,則應啟用該訊號。 如果該位已清除,則應取消啟用該訊號。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
get_mctrlunsigned int ()(struct uart_port *port)返回 port 的調變解調器控制輸入的當前狀態。 不應返回輸出的狀態,因為核心會跟蹤其狀態。 狀態資訊應包括
TIOCM_CARDCD 訊號的狀態TIOCM_CTSCTS 訊號的狀態TIOCM_DSRDSR 訊號的狀態TIOCM_RIRI 訊號的狀態
如果當前啟用訊號,則設定該位。 如果埠不支援 CTS、DCD 或 DSR,則驅動程式應指示該訊號永久啟用。 如果 RI 不可用,則不應將該訊號指示為啟用。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
stop_txvoid ()(struct uart_port *port)停止傳輸字元。 這可能是由於 CTS 線變為不活動狀態,或者 tty 層指示我們要由於
XOFF字元而停止傳輸。驅動程式應儘快停止傳輸字元。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
start_txvoid ()(struct uart_port *port)開始傳輸字元。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
throttlevoid ()(struct uart_port *port)通知序列驅動程式線路規程的輸入緩衝區即將滿,它應以某種方式發出訊號,指示不應再將字元傳送到序列埠。 僅當啟用硬體輔助流控制時才會呼叫此函式。
鎖定:與 tty 層進行的 unthrottle() 和 termios 修改序列化。
unthrottlevoid ()(struct uart_port *port)通知序列驅動程式現在可以將字元傳送到序列埠,而不必擔心線路規程的輸入緩衝區溢位。
僅當啟用硬體輔助流控制時才會呼叫此函式。
鎖定:與 tty 層進行的 throttle() 和 termios 修改序列化。
send_xcharvoid ()(struct uart_port *port, char ch)即使埠已停止,也傳輸高優先順序字元。 這用於實現 XON/XOFF 流控制和 tcflow()。 如果序列驅動程式未實現此函式,則 tty 核心會將字元附加到迴圈緩衝區,然後呼叫 start_tx() / stop_tx() 以重新整理資料。
如果 ch == '0' (
__DISABLED_CHAR),則不傳輸。鎖定:無。 中斷:呼叫者相關。
stop_rxvoid ()(struct uart_port *port)停止接收字元; port 正在關閉。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
start_rxvoid ()(struct uart_port *port)開始接收字元。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
enable_msvoid ()(struct uart_port *port)啟用調變解調器狀態中斷。
可以多次呼叫此方法。 呼叫 shutdown() 方法時應停用調變解調器狀態中斷。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
break_ctlvoid ()(struct uart_port *port, int ctl)控制中斷訊號的傳輸。 如果 ctl 非零,則應傳輸中斷訊號。 當使用零 ctl 進行另一次呼叫時,應終止該訊號。
鎖定:呼叫者持有 tty_port->mutex
startupint ()(struct uart_port *port)獲取任何中斷資源並初始化任何底層驅動程式狀態。 啟用埠以進行接收。 它不應啟用 RTS 或 DTR; 這將透過對 set_mctrl() 的單獨呼叫來完成。
僅當最初開啟埠時才會呼叫此方法。
鎖定:已獲取 port_sem。 中斷:全域性停用。
shutdownvoid ()(struct uart_port *port)停用 port,停用可能有效的任何中斷條件,並釋放任何中斷資源。 它不應停用 RTS 或 DTR; 這將已透過對 set_mctrl() 的單獨呼叫來完成。
一旦此呼叫完成,驅動程式不得訪問 port->state。
僅當沒有更多使用者使用此 port 時才會呼叫此方法。
鎖定:已獲取 port_sem。 中斷:呼叫者相關。
flush_buffervoid ()(struct uart_port *port)重新整理任何寫入緩衝區,重置任何 DMA 狀態並停止任何正在進行的 DMA 傳輸。
每當清除 port->state->xmit 迴圈緩衝區時都會呼叫此函式。
鎖定:已獲取 port->lock。 中斷:本地停用。 此呼叫不得休眠
set_termiosvoid ()(struct uart_port *port, struct ktermios *new, struct ktermios *old)更改 port 引數,包括字長、奇偶校驗、停止位。 更新 port->read_status_mask 和 port->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_ldiscvoid ()(struct uart_port *port, struct ktermios *termios)規程更改的通知程式。 請參閱 TTY 線路規程。
鎖定:呼叫者持有 tty_port->mutex
pmvoid ()(struct uart_port *port, unsigned int state, unsigned int oldstate)對指定的 port 執行任何電源管理相關的活動。 state 指示新狀態(由 enum uart_pm_state 定義),oldstate 指示以前的狀態。
此函式不應用於獲取任何資源。
當最初開啟 port 並最終關閉時,將呼叫此函式,除非 port 也是系統控制檯。 即使未設定
CONFIG_PM,也會發生這種情況。鎖定:無。 中斷:呼叫者相關。
typeconst char *()(struct uart_port *port)返回指向描述指定 port 的字串常量的指標,或者返回
NULL,在這種情況下,將替換字串“unknown”。鎖定:無。 中斷:呼叫者相關。
release_portvoid ()(struct uart_port *port)釋放 port 當前使用的任何記憶體和 IO 區域資源。
鎖定:無。 中斷:呼叫者相關。
request_portint ()(struct uart_port *port)請求埠所需的任何記憶體和 IO 區域資源。 如果任何資源失敗,則在此函式返回時,不應註冊任何資源,並且應在失敗時返回 -
EBUSY。鎖定:無。 中斷:呼叫者相關。
config_portvoid ()(struct uart_port *port, int type)執行 port 所需的任何自動配置步驟。 type 包含所需配置的位掩碼。
UART_CONFIG_TYPE指示埠需要檢測和識別。 port->type 應設定為找到的型別,如果未檢測到埠,則設定為PORT_UNKNOWN。UART_CONFIG_IRQ指示中斷訊號的自動配置,應使用標準核心自動探測技術進行探測。 在埠在內部硬連線中斷的平臺上(例如,片上系統實現),這沒有必要。鎖定:無。 中斷:呼叫者相關。
verify_portint ()(struct uart_port *port, struct serial_struct *serinfo)驗證 serinfo 中包含的新序列埠資訊是否適合此埠型別。
鎖定:無。 中斷:呼叫者相關。
ioctlint ()(struct uart_port *port, unsigned int cmd, unsigned long arg)執行任何特定於埠的 IOCTL。 IOCTL 命令必須使用 <asm/ioctl.h> 中找到的標準編號系統來定義。
鎖定:無。 中斷:呼叫者相關。
poll_initint ()(struct uart_port *port)由 kgdb 呼叫,以執行支援 poll_put_char() 和 poll_get_char() 所需的最少硬體初始化。 與 startup() 不同,這不應請求中斷。
鎖定:已獲取
tty_mutex和 tty_port->mutex。 中斷:n/a。poll_put_charvoid ()(struct uart_port *port, unsigned char ch)由 kgdb 呼叫,以將單個字元 ch 直接寫入序列 port。 它可以並且應該阻塞,直到 TX FIFO 中有空間。
鎖定:無。 中斷:呼叫者相關。 此呼叫不得休眠
poll_get_charint ()(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 cflagtermios 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 nrports 的數量
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->port 為 NULL。)
鎖定:無,中斷:啟用
-
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 的傳輸助手
引數
portuart 埠
ch用於儲存要寫入 HW 的字元的變數
count要傳送的字元數限制
tx_readyHW 是否可以接受更多資料函式
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 的傳輸助手
引數
portuart 埠
ch用於儲存要寫入 HW 的字元的變數
tx_readyHW 是否可以接受更多資料函式
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