觸發器

在許多情況下,驅動程式能夠基於某些外部事件(觸發器)捕獲資料,而不是定期輪詢資料,這非常有用。 IIO 觸發器可以由裝置驅動程式提供,該驅動程式還具有基於硬體生成的事件(例如,資料就緒或超出閾值)的 IIO 裝置,或者由來自獨立中斷源的單獨驅動程式提供(例如,連線到某些外部系統的 GPIO 線、定時器中斷或使用者空間寫入 sysfs 中的特定檔案)。 觸發器可以啟動多個感測器的資料捕獲,並且它可能與感測器本身完全無關。

IIO 觸發器 sysfs 介面

sysfs 中有兩個與觸發器相關的位置

  • /sys/bus/iio/devices/triggerY/*,此檔案在 IIO 觸發器註冊到 IIO 核心後建立,對應於索引為 Y 的觸發器。 由於觸發器可能因型別而異,因此我們可以描述的標準屬性很少

    • name,觸發器名稱,以後可用於與裝置關聯。

    • sampling_frequency,一些基於定時器的觸發器使用此屬性來指定觸發器呼叫的頻率。

  • /sys/bus/iio/devices/iio:deviceX/trigger/*,一旦裝置支援觸發緩衝區,就會建立此目錄。 我們可以透過將觸發器的名稱寫入 current_trigger 檔案來將觸發器與我們的裝置關聯。

IIO 觸發器設定

讓我們看一個簡單的示例,說明如何設定驅動程式使用的觸發器

struct iio_trigger_ops trigger_ops = {
    .set_trigger_state = sample_trigger_state,
    .validate_device = sample_validate_device,
}

struct iio_trigger *trig;

/* first, allocate memory for our trigger */
trig = iio_trigger_alloc(dev, "trig-%s-%d", name, idx);

/* setup trigger operations field */
trig->ops = &trigger_ops;

/* now register the trigger with the IIO core */
iio_trigger_register(trig);

IIO 觸發器操作

請注意,觸發器附加了一組操作

  • set_trigger_state,根據需要開啟/關閉觸發器。

  • validate_device,噹噹前觸發器更改時驗證裝置的函式。

更多詳細資訊

struct iio_trigger_ops

iio_trigger 的操作結構。

定義:

struct iio_trigger_ops {
    int (*set_trigger_state)(struct iio_trigger *trig, bool state);
    void (*reenable)(struct iio_trigger *trig);
    int (*validate_device)(struct iio_trigger *trig, struct iio_dev *indio_dev);
};

成員

set_trigger_state

根據需要開啟/關閉觸發器

reenable

當使用計數為零時重新啟用觸發器的函式(可以為 NULL)

validate_device

噹噹前觸發器更改時驗證裝置的函式。

說明

這通常是驅動程式中的靜態常量,並由給定裝置的例項共享。

struct iio_trigger

工業 I/O 觸發器裝置

定義:

struct iio_trigger {
    const struct iio_trigger_ops    *ops;
    struct module                   *owner;
    int id;
    const char                      *name;
    struct device                   dev;
    struct list_head                list;
    struct list_head                alloc_list;
    atomic_t use_count;
    struct irq_chip                 subirq_chip;
    int subirq_base;
    struct iio_subirq subirqs[CONFIG_IIO_CONSUMERS_PER_TRIGGER];
    unsigned long pool[BITS_TO_LONGS(CONFIG_IIO_CONSUMERS_PER_TRIGGER)];
    struct mutex                    pool_lock;
    bool attached_own_device;
    struct work_struct              reenable_work;
};

成員

ops

[DRIVER] 操作結構

owner

[INTERN] 此驅動程式模組的所有者

id

[INTERN] 唯一 ID 號

name

[DRIVER] 唯一名稱

dev

[DRIVER] 關聯裝置(如果相關)

list

[INTERN] 用於維護全域性觸發器列表

alloc_list

[DRIVER] 用於驅動程式特定的觸發器列表

use_count

[INTERN] 觸發器的使用計數。

subirq_chip

[INTERN] 關聯 ‘虛擬’ irq 晶片。

subirq_base

[INTERN] 觸發器提供的 irq 的基本編號。

subirqs

[INTERN] 有關 ‘子’ irq 的資訊。

pool

[INTERN] 當前正在使用的 irq 的點陣圖。

pool_lock

[INTERN] 保護 irq 池。

attached_own_device

[INTERN] 如果我們使用我們自己的裝置作為觸發器,即如果我們向與提供觸發器的裝置相同的設備註冊了輪詢函式。

reenable_work

[INTERN] 用於確保重新啟用可以休眠的工作項。

void iio_trigger_set_drvdata(struct iio_trigger *trig, void *data)

設定觸發器驅動程式資料

引數

struct iio_trigger *trig

IIO 觸發器結構

void *data

驅動程式特定資料

說明

允許將任意指標附加到 IIO 觸發器,以後可以透過 iio_trigger_get_drvdata() 檢索該指標。

void *iio_trigger_get_drvdata(struct iio_trigger *trig)

獲取觸發器驅動程式資料

引數

struct iio_trigger *trig

IIO 觸發器結構

說明

返回先前使用 iio_trigger_set_drvdata() 設定的資料

int iio_trigger_register(struct iio_trigger *trig_info)

向 IIO 核心註冊觸發器

引數

struct iio_trigger *trig_info

要註冊的觸發器

void iio_trigger_unregister(struct iio_trigger *trig_info)

從核心登出觸發器

引數

struct iio_trigger *trig_info

要登出的觸發器

int iio_trigger_set_immutable(struct iio_dev *indio_dev, struct iio_trigger *trig)

在目標上設定不可變的觸發器

引數

struct iio_dev *indio_dev

包含裝置的 IIO 裝置結構

struct iio_trigger *trig

要分配給裝置的觸發器

bool iio_trigger_using_own(struct iio_dev *indio_dev)

告訴我們是否使用我們自己的硬體觸發器

引數

struct iio_dev *indio_dev

要檢查的裝置

void iio_trigger_poll(struct iio_trigger *trig)

呼叫消費者的 IRQ 觸發器處理程式

引數

struct iio_trigger *trig

發生的觸發器

說明

此函式只能從硬 IRQ 上下文呼叫。

void iio_trigger_poll_nested(struct iio_trigger *trig)

呼叫消費者的執行緒觸發器處理程式

引數

struct iio_trigger *trig

發生的觸發器

說明

此函式只能從核心執行緒上下文呼叫。

struct iio_trigger *__iio_trigger_alloc(struct device *parent, struct module *this_mod, const char *fmt, ...)

分配觸發器

引數

struct device *parent

為其分配 iio_trigger 的裝置

struct module *this_mod

分配觸發器的模組

const char *fmt

觸發器名稱格式。 如果它包含格式說明符,則格式後面的其他引數將被格式化並插入到結果字串中,以替換它們各自的說明符。

...

可變引數

返回

成功時指向已分配 iio_trigger 的指標,失敗時為 NULL。

struct iio_trigger *__devm_iio_trigger_alloc(struct device *parent, struct module *this_mod, const char *fmt, ...)

資源管理的 iio_trigger_alloc() 託管 iio_trigger_alloc。 使用此函式分配的 iio_trigger 在驅動程式分離時自動釋放。

引數

struct device *parent

為其分配 iio_trigger 的裝置

struct module *this_mod

分配觸發器的模組

const char *fmt

觸發器名稱格式。 如果它包含格式說明符,則格式後面的其他引數將被格式化並插入到結果字串中,以替換它們各自的說明符。

...

可變引數

返回

成功時指向已分配 iio_trigger 的指標,失敗時為 NULL。

int devm_iio_trigger_register(struct device *dev, struct iio_trigger *trig_info)

資源管理的 iio_trigger_register()

引數

struct device *dev

為此觸發器分配的裝置

struct iio_trigger *trig_info

要註冊的觸發器

說明

託管 iio_trigger_register()。使用此函式註冊的 IIO 觸發器會在驅動程式分離時自動登出。此函式內部呼叫 iio_trigger_register()。有關更多資訊,請參閱該函式。

返回

成功時返回 0,失敗時返回負錯誤號。

int iio_validate_own_trigger(struct iio_dev *idev, struct iio_trigger *trig)

檢查觸發器和 IIO 裝置是否屬於同一裝置

引數

struct iio_dev *idev

要檢查的 IIO 裝置

struct iio_trigger *trig

要檢查的 IIO 觸發器

說明

此函式可用作 validate_trigger 回撥,用於只能連線到自身裝置的觸發器。

返回

如果觸發器和 IIO 裝置都屬於同一裝置,則返回 0,否則返回 -EINVAL。

int iio_trigger_validate_own_device(struct iio_trigger *trig, struct iio_dev *indio_dev)

檢查觸發器和 IIO 裝置是否屬於同一裝置

引數

struct iio_trigger *trig

要檢查的 IIO 觸發器

struct iio_dev *indio_dev

要檢查的 IIO 裝置

說明

此函式可用作 validate_device 回撥,用於只能連線到自身裝置的觸發器。

返回

如果觸發器和 IIO 裝置都屬於同一裝置,則返回 0,否則返回 -EINVAL。