觸發緩衝區¶
現在我們知道了緩衝區和觸發器是什麼,讓我們看看它們是如何協同工作的。
IIO 觸發緩衝區設定¶
iio_triggered_buffer_setup()— 設定觸發緩衝區和 pollfunciio_triggered_buffer_cleanup()— 釋放iio_triggered_buffer_setup()分配的資源struct iio_buffer_setup_ops— 緩衝區設定相關回調
一個典型的觸發緩衝區設定如下所示
const struct iio_buffer_setup_ops sensor_buffer_setup_ops = {
.preenable = sensor_buffer_preenable,
.postenable = sensor_buffer_postenable,
.postdisable = sensor_buffer_postdisable,
.predisable = sensor_buffer_predisable,
};
irqreturn_t sensor_iio_pollfunc(int irq, void *p)
{
pf->timestamp = iio_get_time_ns((struct indio_dev *)p);
return IRQ_WAKE_THREAD;
}
irqreturn_t sensor_trigger_handler(int irq, void *p)
{
u16 buf[8];
int i = 0;
/* read data for each active channel */
for_each_set_bit(bit, active_scan_mask, masklength)
buf[i++] = sensor_get_data(bit)
iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp);
iio_trigger_notify_done(trigger);
return IRQ_HANDLED;
}
/* setup triggered buffer, usually in probe function */
iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc,
sensor_trigger_handler,
sensor_buffer_setup_ops);
這裡需要注意的重要事項是
iio_buffer_setup_ops,在緩衝區配置序列中的預定義點(例如,啟用之前,停用之後)要呼叫的緩衝區設定函式。 如果未指定,則 IIO 核心使用預設的 iio_triggered_buffer_setup_ops。sensor_iio_pollfunc,將用作 poll 函式上半部分的函式。 它應該儘可能少地進行處理,因為它在中斷上下文中執行。 最常見的操作是記錄當前時間戳,因此可以使用 IIO 核心定義的
iio_pollfunc_store_time()函式。sensor_trigger_handler,將用作 poll 函式下半部分的函式。 這在核心執行緒的上下文中執行,並且所有處理都在這裡進行。 它通常從裝置讀取資料,並將其與上半部分記錄的時間戳一起儲存在內部緩衝區中。
更多細節¶
-
int iio_triggered_buffer_setup_ext(struct iio_dev *indio_dev, irqreturn_t (*h)(int irq, void *p), irqreturn_t (*thread)(int irq, void *p), enum iio_buffer_direction direction, const struct iio_buffer_setup_ops *setup_ops, const struct iio_dev_attr **buffer_attrs)¶
設定觸發緩衝區和 pollfunc
引數
struct iio_dev *indio_devIIO 裝置結構
irqreturn_t (*h)(int irq, void *p)將用作 pollfunc 上半部分的函式
irqreturn_t (*thread)(int irq, void *p)將用作 pollfunc 下半部分的函式
enum iio_buffer_direction direction資料流的方向(輸入/輸出)。
const struct iio_buffer_setup_ops *setup_ops用於此裝置的緩衝區設定函式。 如果為 NULL,則將使用觸發緩衝區的預設設定函式。
const struct iio_dev_attr **buffer_attrs此 IIO 緩衝區的額外 sysfs 緩衝區屬性
描述
此函式結合了一些在設定觸發緩衝區時通常執行的常見任務。 它將分配緩衝區和 pollfunc。
在呼叫此函式之前,indio_dev 結構應該已經完全初始化,但尚未註冊。 實際上,這意味著應該在 iio_device_register() 之前立即呼叫此函式。
要釋放此函式分配的資源,請呼叫 iio_triggered_buffer_cleanup()。
-
void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev)¶
釋放
iio_triggered_buffer_setup_ext()分配的資源
引數
struct iio_dev *indio_devIIO 裝置結構