пятница, 27 августа 2021 г.

Решение проблем с GPIO на Raspberry PI 4 в Debian Bullseye arm64

Обновил Raspberry PI 4 с Debian Buster до Debian Bullseye и подключил схему управления оборотами вентилятора чтобы сделать его тише. Для управления PWM я использую GPIO 16.

Raspberry PI 4 pinout
https://www.raspberrypi.org/documentation/computers/os.html

В прошлый раз я тестировал на OpenELEC с python 2.7, но в Bullseye используется python 3.9.2. Для работы с GPIO в Debian нужно установить пакет python3-rpi.gpio

$ sudo apt-get update
$ sudo apt-get install python3-rpi.gpio

Теперь можно установить сервис для управления оборотами в зависимости от температуры процессора

$ git clone https://github.com/tataranovich/Raspberry-Pi-PWM-fan.git
$ cd ./Raspberry-Pi-PWM-fan/
$ sudo python3 fan.py
Traceback (most recent call last):
  File "/home/andrey/Raspberry-Pi-PWM-fan/fan.py", line 42, in <module>
    GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)
RuntimeError: Not running on a RPi!

Судя по ошибке RPi.GPIO не определил Raspberry PI 4. Подтверждение этому нашлось в Wiki Debian. Проблему с определением платы уже решили в upstream, но в Debian еще нет исправления (подробности в #976114).

Я собрал последний срез из репозитария в пакет для Debian Bullseye (arm64) и залил в свой репозитарий.

$ sudo apt-get install -y curl gnupg
$ curl -fsSL http://www.tataranovich.com/debian/gpg | sudo apt-key add -
$ APT_SOURCE='deb http://www.tataranovich.com/debian bullseye main'
$ echo $APT_SOURCE | sudo tee /etc/apt/sources.list.d/tataranovich.list
$ sudo apt-get update
$ sudo apt-get install -t bullseye python3-rpi.gpio
$ $ apt policy python3-rpi.gpio
python3-rpi.gpio:
  Installed: 0.7.1a4-1
  Candidate: 0.7.1a4-1
  Version table:
 *** 0.7.1a4-1 500
        500 http://www.tataranovich.com/debian bullseye/main arm64 Packages
        100 /var/lib/dpkg/status
     0.7.0-0.2+b2 990
        990 http://deb.debian.org/debian bullseye/main arm64 Packages

После обновления пакета python3-rpi.gpio до версии 0.7.1a4-1 ошибка меняется

$ sudo python3 fan.py 
Traceback (most recent call last):
  File "/home/andrey/Raspberry-Pi-PWM-fan/fan.py", line 42, in <module>
    GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)
RuntimeError: Mmap of GPIO registers failed

Решение есть в той же Wiki Debian. Нужно передать ядру параметр iomem=relaxed. Для этого создаем файл /etc/default/raspi-extra-cmdline и записываем в него нужное значение (важно чтобы там была только одна строка без комментариев)

$ echo 'iomem=relaxed' | sudo tee /etc/default/raspi-extra-cmdline
$ sudo update-initramfs -u -k all
$ cat /boot/firmware/cmdline.txt
console=tty0 console=ttyS1,115200 root=/dev/sda2 rw fsck.repair=yes net.ifnames=0  rootwait iomem=relaxed
$ sudo reboot

После перезагрузки GPIO начинает работать без проблем.

Комментариев нет:

Отправить комментарий