虛擬 GPIO 消費者

虛擬 GPIO 消費者模組允許使用者例項化請求 GPIO 並透過 debugfs 控制其行為的虛擬裝置。虛擬消費者裝置可以從裝置樹或透過 configfs 例項化。

虛擬消費者使用面向驅動程式的 GPIO API,並允許透過使用者空間驅動的自動化測試來覆蓋它。GPIO 是使用 gpiod_get_array() 請求的,因此我們支援每個聯結器 ID 多個 GPIO。

建立 GPIO 消費者

gpio-consumer 模組註冊了一個名為 'gpio-virtuser' 的 configfs 子系統。有關 configfs 檔案系統的詳細資訊,請參閱 configfs 文件。

使用者可以建立 configfs 組和項的層次結構,以及修改公開屬性的值。一旦消費者例項化,這個層次結構將被轉換為適當的裝置屬性。一般結構是

組: /config/gpio-virtuser

這是 gpio-consumer configfs 樹的頂級目錄。

組: /config/gpio-consumer/example-name

屬性: /config/gpio-consumer/example-name/live

屬性: /config/gpio-consumer/example-name/dev_name

這是一個表示 GPIO 消費者裝置的目錄。

只讀的 dev_name 屬性公開了裝置在平臺總線上系統中將顯示的名稱。這對於在 /sys/kernel/debug/gpio-virtuser/$dev_name 下定位關聯的 debugfs 目錄非常有用。

'live' 屬性允許在裝置完全配置後觸發其實際建立。接受的值為:'1' 用於啟用虛擬裝置,'0' 用於停用和拆除它。

建立 GPIO 查詢表

使用者可以在裝置組下建立多個 configfs 組

組: /config/gpio-consumer/example-name/con_id

'con_id' 目錄表示一個單獨的 GPIO 查詢,其值對映到 gpiod_get() 函式的 'con_id' 引數。例如:con_id == 'reset' 對映到 reset-gpios 裝置屬性。

使用者可以為每個查詢分配多個 GPIO。每個 GPIO 都是 'con_id' 組下帶有使用者定義名稱的子目錄。

屬性: /config/gpio-consumer/example-name/con_id/0/key

屬性: /config/gpio-consumer/example-name/con_id/0/offset

屬性: /config/gpio-consumer/example-name/con_id/0/drive

屬性: /config/gpio-consumer/example-name/con_id/0/pull

屬性: /config/gpio-consumer/example-name/con_id/0/active_low

屬性: /config/gpio-consumer/example-name/con_id/0/transitory

這是一個描述 con_id-gpios 屬性中單個 GPIO 的組。

對於使用 configfs 建立的虛擬消費者,我們使用機器查詢表,因此這個組可以被視為檔案系統和 'struct gpiod_lookup' 中單個條目欄位之間的對映。

'key' 屬性表示此 GPIO 所屬晶片的名稱或 GPIO 線名稱。這取決於 'offset' 屬性的值:如果其值 >= 0,則 'key' 表示要查詢的晶片的標籤,而 'offset' 表示該晶片中線的偏移量。如果 'offset' < 0,則 'key' 表示線的名稱。

其餘屬性對映到 GPIO 查詢結構體的 'flags' 欄位。前兩個屬性接受字串值作為引數

``’drive’``: 'push-pull''open-drain''open-source' ``’pull’``: 'pull-up''pull-down''pull-disabled''as-is'

'active_low''transitory' 是布林屬性。

啟用 GPIO 消費者

配置完成後,必須將 'live' 屬性設定為 1 以例項化消費者。可以將其設定回 0 以銷燬虛擬裝置。模組將同步等待新的模擬裝置成功探測,如果未發生,則寫入 'live' 將導致錯誤。

裝置樹

虛擬 GPIO 消費者也可以在裝置樹中定義。相容字串必須是:"gpio-virtuser",並且至少有一個屬性遵循標準化的 GPIO 模式。

定義虛擬 GPIO 消費者的裝置樹程式碼示例

gpio-virt-consumer {
    compatible = "gpio-virtuser";

    foo-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>, <&gpio1 2 0>;
    bar-gpios = <&gpio0 6 0>;
};

控制虛擬 GPIO 消費者

一旦啟用,裝置將匯出 debugfs 屬性,用於控制 GPIO 陣列以及每個請求的 GPIO 線。讓我們考慮以下裝置屬性:foo-gpios = <&gpio0 0 0>, <&gpio0 4 0>;

將建立以下 debugfs 屬性組

組: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo/

這是將包含整個 GPIO 陣列屬性的組。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo/values

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo/values_atomic

這兩個屬性都允許讀取和設定 GPIO 值陣列。使用者必須以包含零和一的字串形式傳遞陣列中包含的值的確切數量,分別代表非活動和活動 GPIO 狀態。在此示例中:echo 11 > values

values_atomic 屬性的工作方式與 values 相同,但核心將在中斷上下文中執行 GPIO 驅動程式回撥。

組: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/

這是一個表示單個 GPIO 的組,其中 $index 是其在陣列中的偏移量。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/consumer

允許設定和讀取 GPIO 線的消費者標籤。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/debounce

允許設定和讀取 GPIO 線的去抖週期。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/direction

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/direction_atomic

這兩個屬性允許設定 GPIO 線的方向。它們接受“input”(輸入)和“output”(輸出)作為值。原子變體在中斷上下文中執行驅動程式回撥。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/interrupts

如果以輸入模式請求該線,則向此屬性寫入 1 將使模組監聽 GPIO 上的邊沿中斷。寫入 0 將停用監視。讀取此屬性將返回當前註冊的中斷數(兩個邊沿)。

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/value

屬性: /sys/kernel/debug/gpio-virtuser/$dev_name/gpiod:foo:$index/value_atomic

這兩個屬性都允許讀取和設定單個請求的 GPIO 線的值。它們接受以下值:10