我正在使用 C++库(easyBlack) 通过 /dev/mem 处理 GPIO。
如我在“AM335x SitaraTM 处理器 - 技术参考手册”的“25.3.3 中断功能”章节中所见,
为了在 GPIO 引脚上发生定义的事件(电平或逻辑转换)时向主机处理器生成中断请求,必须按以下方式编程 GPIO 配置寄存器:
• 在 GPIO_IRQSTATUS_SET_0 和/或 GPIO_IRQSTATUS_SET_1 寄存器中启用 GPIO 通道的中断。
• 在 GPIO_LEVELDETECT0、GPIO_LEVELDETECT1、GPIO_RISINGDETECT 和 GPIO_FALLINGDETECT 寄存器中选择输入 GPIO 上预期的事件以触发中断请求。
直到这里都没问题,但我能找到的所有文档都是基于Linux内核头文件(“linux/gpio.h”和“linux/interrupt.h”),似乎不能用于用户空间程序,只能在模块中使用。或者示例使用内核驱动程序并监视sysfs中的状态文件以实现中断。这可能有效,但速度较慢,需要大量资源。
如我在“AM335x SitaraTM 处理器 - 技术参考手册”的“25.3.3 中断功能”章节中所见,
为了在 GPIO 引脚上发生定义的事件(电平或逻辑转换)时向主机处理器生成中断请求,必须按以下方式编程 GPIO 配置寄存器:
• 在 GPIO_IRQSTATUS_SET_0 和/或 GPIO_IRQSTATUS_SET_1 寄存器中启用 GPIO 通道的中断。
• 在 GPIO_LEVELDETECT0、GPIO_LEVELDETECT1、GPIO_RISINGDETECT 和 GPIO_FALLINGDETECT 寄存器中选择输入 GPIO 上预期的事件以触发中断请求。
直到这里都没问题,但我能找到的所有文档都是基于Linux内核头文件(“linux/gpio.h”和“linux/interrupt.h”),似乎不能用于用户空间程序,只能在模块中使用。或者示例使用内核驱动程序并监视sysfs中的状态文件以实现中断。这可能有效,但速度较慢,需要大量资源。
除了使用多线程来查看所需引脚的值之外,还有其他选择吗?(这个库 - github.com/jackmitch/libsoc如何)
也许将easyBlack编译为内核模块?
谢谢!