3. 5.3: Platform Driver + miscdevice + GPIO из Device Tree

3.1. Описание

Модуль hellokeys_rpi3_misc_dt.c демонстрирует создание платформенного драйвера с поддержкой:

  • platform driver (probe() / remove())

  • устройства /dev/mydev через miscdevice

  • считывания состояния кнопок с GPIO, описанных в Device Tree

  • чтения значений из user space через cat /dev/mydev

3.2. Содержимое архива

  • hellokeys_rpi3_misc_dt.c — исходный код модуля

  • Makefile — для сборки с помощью make

  • 5_2_miscdevice_dt_gpio.pptx — презентация по работе

  • 5_2_miscdevice_dt_gpio.rst — эта документация

3.3. Требования

  • Raspberry Pi 3 с Linux kernel 5.x

  • Device Tree с описанием gpios

  • Компилятор модуля ядра (make, linux-headers)

3.4. Пример Device Tree

В файл .dts (например, bcm2710-rpi-3-b.dts) нужно добавить:

hellokeys@0 {
    compatible = "arrow,hellokeys";
    gpios = <&gpio 17 0>, <&gpio 27 0>;
    status = "okay";
};

4. Работа с Device Tree (DTB и DTS)

4.1. Преобразование .dtb → .dts

Если у вас есть скомпилированный файл Device Tree Blob (например, /boot/bcm2710-rpi-3-b.dtb), вы можете получить исходный .dts так:

dtc -I dtb -O dts -o bcm2710-rpi-3-b.dts /boot/bcm2710-rpi-3-b.dtb

Редактируйте bcm2710-rpi-3-b.dts, добавляя свой hellokeys@0 { ... } в нужное место.

4.2. Сборка обратно: .dts → .dtb

После редактирования соберите обратно:

dtc -I dts -O dtb -o bcm2710-rpi-3-b.dtb bcm2710-rpi-3-b.dts

Затем скопируйте новый .dtb в /boot/ на Raspberry Pi:

sudo cp bcm2710-rpi-3-b.dtb /boot/
sudo reboot

4.3. Проверка после загрузки

Проверьте, что узел hellokeys виден в памяти устройства:

ls /proc/device-tree/soc/hellokeys@0
cat /proc/device-tree/soc/hellokeys@0/gpios
hexdump /proc/device-tree/soc/hellokeys@0/compatible

4.4. Сборка и установка

make
sudo insmod hellokeys_rpi3_misc_dt.ko
dmesg | grep hellokeys
cat /dev/mydev

Пример вывода:

key1: 0
key2: 1

Удаление модуля:

sudo rmmod hellokeys_rpi3_misc_dt

4.5. Лицензия

GPL. Образовательное использование. Авторы: Linux Driver Development Guide + ChatGPT