觸發器¶
struct iio_trigger— 工業 I/O 觸發器裝置devm_iio_trigger_alloc()— 資源管理的 iio_trigger_allocdevm_iio_trigger_register()— 資源管理的 iio_trigger_register iio_trigger_unregisteriio_trigger_validate_own_device()— 檢查觸發器和 IIO 裝置是否屬於同一裝置
在許多情況下,驅動程式能夠基於某些外部事件(觸發器)捕獲資料,而不是定期輪詢資料,這非常有用。 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 觸發器操作¶
struct iio_trigger_ops— iio_trigger 的操作結構。
請注意,觸發器附加了一組操作
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 *trigIIO 觸發器結構
void *data驅動程式特定資料
說明
允許將任意指標附加到 IIO 觸發器,以後可以透過 iio_trigger_get_drvdata() 檢索該指標。
-
void *iio_trigger_get_drvdata(struct iio_trigger *trig)¶
獲取觸發器驅動程式資料
-
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要分配給裝置的觸發器
引數
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。