我已经浏览了大部分文献,它的核心部分已经被覆盖、理解和吸收了。
但是我的问题基本上是:当内核空间发生中断并且我的守护程序存在于用户空间时,我如何才能收到警报,例如通过回调函数。
IRQ Occuring --------> 中断上半部分(将时间戳放入缓冲区) ---------> 中断处理程序的下半部分(读取数据并在缓冲区中添加时间戳) ------------> ???? 将在 HD 上写入日志的用户空间守护进程(某些描述的异步回调)。
我已经编写并工作了守护程序部分的所有内容,我似乎明白通过 libiio 您可以将触发器分配给特定的通道或属性,但这就是我卡住的地方。
libiio 上的文献(最值得注意的是它的 wiki)有一章是关于触发器的,它有 4 行长……至少可以说不是很有帮助。
iioinfo 列出了 LSM6DSLTR 中存在的设备(18 个设备,包括两个触发器),我无法将触发器分配给尚未分配给它们的任何设备(没有这样的文件或目录),我收集这些设备是指没有该特定设备的 sysfs 中的 trigger 目录。
我还收集到 sysfs 目录当然是内核设备树的从属,并且设备树的该部分的创建是在加载驱动程序时创建的。
所以必须有一种方法来改变 sysfs 文件系统的那部分,方法是要求内核驱动程序在上下文中提供一个设备来实现触发器目录,这样我们就可以为它分配一个触发器
第二部分将是从触发到实际 IRQ(在我的情况下为 42 - 如 /proc/interrupts 中列出的)的从属,并在达到加速度或振动阈值时在用户空间守护程序中发出警报......
好吧,这就是我想要实现的目标。最后一部分是在芯片上写入一些寄存器,以配置任何给定集成设备的 IRQ 发生方式和时间。