触发器¶
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 *trig
IIO 触发器结构
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。