觸發緩衝區

現在我們知道了緩衝區和觸發器是什麼,讓我們看看它們是如何協同工作的。

IIO 觸發緩衝區設定

一個典型的觸發緩衝區設定如下所示

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_dev

IIO 裝置結構

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_dev

IIO 裝置結構