Я пытаюсь разработать простой модуль ядра Linux, который управляет группой датчиков / исполнительных механизмов, закрепленных на GPIO Raspberry Pi.
Функции GPIO, которые мне нужны, довольно просты: получить / установить значения выводов, получить IRQ, ...
В моем коде у меня есть misc_device , который реализует обычное открытие , чтение , запись и открытие операций. Например, в моей операции чтения я хотел бы получить значение (высокое / низкое) определенного вывода GPIO.
К счастью, ядро предоставляет интерфейс для таких операций GPIO. На самом деле, согласно официальному документу GPIO , существует два интерфейса: устаревший, чрезвычайно простой, но устаревший, и новый, основанный на дескрипторах.
Я хотел бы использовать последний для своего проекта, и я понимаю, как реализовать все, что мне нужно, за исключением одной вещи: дерева устройств.
Со ссылкой на 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 простого устройства (предпочтительно misc), чья операция read () получает значение контакта, используя новый интерфейс GPIO?
Если вам нужна более подробная информация о моем коде, просто спросите. Заранее спасибо!
Примечание 1: я знаю, что большая часть моей работы может выполняться в пространстве пользователя, а не в пространстве ядра; Мой проект только для образовательных целей, чтобы изучить ядро.
Примечание 2: Я выбираю разное устройство, потому что оно простое, но при необходимости я могу переключиться на символьное устройство.