GPIO_LINEEVENT_DATA_READ

警告

此 ioctl 是 GPIO 字元裝置使用者空間 API (v1) 的一部分,已被 GPIO_V2_LINE_EVENT_READ 廢棄。

名稱

GPIO_LINEEVENT_DATA_READ - 從行事件中讀取邊沿檢測事件。

概要

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

引數

event_fd

GPIO 字元裝置的 檔案描述符,由 GPIO_GET_LINEEVENT_IOCTLrequest.fd 中返回。

buf

用於包含 events 的緩衝區。

count

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

描述

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

必須使用 GPIOEVENT_REQUEST_RISING_EDGEGPIOEVENT_REQUEST_FALLING_EDGE 或兩者都啟用輸入線的邊沿檢測。當輸入線檢測到邊沿中斷時,將生成邊沿事件。

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

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

event.timestamp 的時鐘源是 CLOCK_MONOTONIC,但在 Linux 5.7 之前的核心中它是 CLOCK_REALTIME。在 gpioevent_data 中沒有指示使用了哪個時鐘源,必須從核心版本或時間戳本身的健全性檢查中確定。

從緩衝區讀取的事件始終與核心檢測到的順序相同。

核心事件緩衝區的大小固定為 16 個事件。

如果事件爆發的速度快於使用者空間的讀取速度,緩衝區可能會溢位。如果發生溢位,則最近的事件將被丟棄。使用者空間無法檢測到溢位。

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

如果當前沒有可用事件並且 event_fd 未設定為 O_NONBLOCK,則 read() 將阻塞。

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

返回值

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

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