GPIO_V2_LINE_EVENT_READ

名稱

GPIO_V2_LINE_EVENT_READ - 從請求中讀取線的邊沿檢測事件。

概要

int read(int req_fd, void *buf, size_t count)

引數

req_fd

GPIO 字元裝置的 檔案描述符,由 GPIO_V2_GET_LINE_IOCTL 返回,其值在 request.fd 中。

buf

用於包含 事件 的緩衝區。

count

buf 中可用的位元組數,其值必須至少是一個 gpio_v2_line_event 的大小。

描述

從請求中讀取線的邊沿檢測事件。

必須使用 GPIO_V2_LINE_FLAG_EDGE_RISINGGPIO_V2_LINE_FLAG_EDGE_FALLING,或兩者,為輸入線啟用邊沿檢測。當輸入線檢測到邊沿中斷時,就會生成邊沿事件。

邊沿是根據邏輯線值的變化來定義的,因此從非活動到活動的轉換是上升沿。如果設定了 GPIO_V2_LINE_FLAG_ACTIVE_LOW,則邏輯極性與物理極性相反,此時 GPIO_V2_LINE_FLAG_EDGE_RISING 對應於一個下降的物理邊沿。

核心儘可能接近其發生時捕獲並時間戳邊沿事件,並將其儲存在緩衝區中,使用者空間可以方便地使用 read() 從中讀取。

從緩衝區讀取的事件始終與核心檢測到的順序相同,即使單個請求正在監視多條線也是如此。

核心事件緩衝區的大小在建立線請求時固定,並且可以受 request.event_buffer_size 的影響。預設大小是請求行數的 16 倍。

如果事件突發發生的速度快於使用者空間讀取的速度,則緩衝區可能會溢位。如果發生溢位,則最舊的緩衝事件將被丟棄。可以透過監視事件序列號從使用者空間檢測到溢位。

為了最小化將事件從核心複製到使用者空間所需的呼叫次數,read() 支援複製多個事件。複製的事件數量是核心緩衝區中可用事件數量與使用者空間緩衝區 (buf) 中可容納事件數量中的較小值。

使用 GPIO_V2_LINE_SET_CONFIG_IOCTL 更改邊沿檢測標誌不會刪除或修改已包含在核心事件緩衝區中的事件。

如果事件不可用且 req_fd 未設定為 O_NONBLOCK,則 read() 將會阻塞。

可以透過使用 poll() 或類似函式檢查 req_fd 是否可讀來測試事件的存在。

返回值

成功時,返回讀取的位元組數,該位元組數將是 gpio_v2_line_event 事件大小的倍數。

錯誤時,返回 -1 並適當設定 errno 變數。常見錯誤程式碼在 GPIO 錯誤程式碼 中描述。