在 Ubuntu 20.04 64 位 arm Raspberry Pi 上控制 gpio

在 Ubuntu 20.04 64 位 arm Raspberry Pi 上控制 gpio

我用 C 编写了一个程序,该程序使用 Raspberry Pi 上的 gpio 引脚。当我编写该程序时,它在 Ubuntu 18.04 armhf(32 位)上运行良好。但是现在,在我的 Raspberry pi 4 上运行 Ubuntu 20.04 arm64 时,使用 sudo 运行时出现以下错误:

    initPeripherals: mmap gpio failed (Operation not permitted)

据我了解,此错误是由于内核使用该选项进行编译而导致的

    CONFIG_STRICT_DEVMEM=y

我该如何修复此问题而不重新编译内核?我尝试设置 iomem=relaxed 和 strict-devmem=0,但无济于事。我还尝试将规则添加到 /etc/udev/rules.d/,但似乎也不起作用。此外,我尝试更改组成员身份,但同样,我以 root 身份使用 sudo 运行此程序。

编辑:18.04 arm64 内核运行良好。我想我会对此感到满意。

答案1

看起来是权限问题。

$ sudo apt install rpi.gpio-common

之后你应该能够

$ echo "21" > /sys/class/gpio/export
$ echo "1" > /sys/class/gpio/gpio21
$ echo "21" > /sys/class/gpio/unexport

如果是这样,那么使用 C 代码操作 gpio 应该没有问题。

该软件包仅安装这些规则文件。我在网上看到过提供 udev 规则的解决方案,但大多数都不起作用。

$ cat /lib/udev/rules.d/60-rpi.gpio-common.rules 
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="dialout", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

您也可以手动将文件放入/etc/udev/rules.d/

相关内容