【发布时间】:2019-02-09 22:34:20
【问题描述】:
我正在尝试开发一个简单的 Linux 内核模块,用于管理固定在 Raspberry Pi 的 GPIO 上的一堆传感器/执行器。
我需要的 GPIO 功能非常简单:获取/设置引脚值,接收 IRQ,...
在我的代码中,我有一个 misc_device,它实现了通常的 open、read、write 和 打开操作。例如,在我的读取操作中,我想获取特定 GPIO 引脚的值(高/低)。
幸运的是,内核为此类 GPIO 操作提供了接口。实际上,根据官方GPIO doc 的说法,有两个接口:遗留接口,非常简单但已弃用,以及新的基于描述符的接口。
我想将后者用于我的项目,并且我了解如何实现我需要的所有东西,除了一件事:设备树的东西。
参考board.txt,在我可以调用 gpiod_get_index() 和稍后 gpiod_get_value() 之前,首先我需要像这样设置设备树:
foo_device {
compatible = "acme,foo";
...
led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>, /* red */
<&gpio 16 GPIO_ACTIVE_HIGH>, /* green */
<&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */
power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
};
但是,我完全不知道将那段代码放在哪里,也不知道我是否真的需要它。请注意,我有一个看起来像这样的杂项设备,其中 aaa_fops 包含读取操作:
static struct miscdevice aaa = {
MISC_DYNAMIC_MINOR, "aaa", &aaa_fops
};
使用不推荐使用的旧接口,我的问题将得到解决,因为它不需要弄乱设备树,但如果不太复杂,我仍然想使用新接口。
我已阅读大量文档,包括官方和非官方文档,但无法为我的问题找到一个直接而简单的答案。我试图在内核源代码中找到答案,尤其是在驱动程序部分,但只是迷失在一个复杂而混乱的山谷中。
缺乏关于内核的工作、最小示例 (WME) 显着减慢了我的学习过程,这只是我对它的看法。
您能否给我一个简单设备(最好是杂项)的 WME,其阅读() 操作获取引脚的值,使用新的 GPIO 接口?
如果您需要有关我的代码的更多详细信息,请询问。提前致谢!
注意 1:我知道我的大部分工作都可以在用户空间而不是内核空间中完成;我的项目仅用于教育目的,学习内核。
注意 2:我选择 misc 设备是因为它很简单,但如果需要,我可以切换到 char 设备。
【问题讨论】:
标签: linux-kernel raspberry-pi linux-device-driver kernel-module gpio