触发器

在许多情况下,驱动程序能够基于某些外部事件(触发器)捕获数据,而不是定期轮询数据,这非常有用。 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。