我已经使用this question的答案来从运行Alpine的Docker容器中控制我的Raspberry Pi GPIO引脚。
$ docker run --device /dev/gpiomem whatever
这适用于Python RPi.GPIO模块,但不适用于connectioningPi。
Python及其依赖项所占用的空间与Alpine本身大约相同,因此,我想使用wirelessPi来节省安装时间和SD卡空间,并使事情变得简单。
直接在Raspbian(使用apt-get install wiringpi
安装)中运行wireingPi v2.46可以正常工作,并且我可以成功配置和触发数字输出引脚。
尝试配置引脚时,在Alpine容器(使用apk add wiringpi
安装)中运行wirePi v2.26失败:
$ gpio -g mode 26 out
Unable to determine hardware version. I see: Hardware : BCM2835,
- expecting BCM2708 or BCM2709. Please report this to projects@drogon.net
我可以采取什么措施将SOC暴露给容器,以便wireingPi正确识别它?要使它正常工作,还需要什么?
答案 0 :(得分:2)
警告:别客气。
正如我在评论中指出的那样,一个基本问题是您的容器wiringPi
太旧了。较旧的Pi硬件(例如Pi 2)使用BCM2708 / BCM2709处理器,而较新的硬件使用BCM2835。 WiringPi需要知道正在使用什么处理器,才能正确定位GPIO控制寄存器。
就GPIO而言,新旧处理器之间可能没有实质性差异。如果是(且仅)在这种情况下,您可以“诱骗”您的集装箱式布线Pi正常工作。
使用所需的处理器名称创建版本/proc/cpuinfo
:
sed s/BCM2835/BCM2709/ < /proc/cpuinfo > /proc/cpuinfo
将其绑定到容器内部的/proc/cpuinfo
上。您还需要提供/dev/mem
,和,并与--privileged
一起运行:
docker run -it --rm --privileged --device /dev/mem -v /tmp/cpuinfo:/proc/cpuinfo alpine sh
这给我们:
/ # gpio -v
gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Model 2, Revision: 1.1, Memory: 1024MB, Maker: Sony [OV]
/ # gpio readall
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 0 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 0 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 0 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 0 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 0 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 0 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 0 | 27 || 28 | 0 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 0 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 0 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
您可能想尝试一下,看看它是否真的按预期工作。
或者只运行Raspbian映像而不是Arch映像。
答案 1 :(得分:1)
感谢larsk指出版本号的差异。
wireingPi 的2.46版本适用于Alpine,但我没注意到它仅在edge branch of the community repository
中要使用此版本,我必须修改文件/etc/apk/repositories
,将现有社区条目替换为边缘版本。
由于我使用的是Docker,因此必须在映像构建过程中执行此操作,因此我在Dockerfile中添加了以下内容:
RUN sed -i "s/v[0-9.]*\/community/edge\/community/" /etc/apk/repositories \
&& apk update && apk add wiringpi
答案 2 :(得分:0)
感谢乔纳森(Jonathan)的更新/回答,也感谢Larsks的帮助!那正是我想要的。
我在安装软件包后稍稍修改了dockerfile步骤,将存储库恢复为原始版本,因此以后安装的所有软件包都将来自稳定的存储库。
RUN REPOVERSION=$(grep 'community$' /etc/apk/repositories | sed 's/.*\(v[0-9.]*\).*/\1/') && \
sed -i "s/$REPOVERSION\/community/edge\/community/" /etc/apk/repositories && \
apk update && apk add wiringpi && \
sed -i "s/edge\/community/$REPOVERSION\/community/" /etc/apk/repositories && \
apk update
还允许非root用户运行gpio命令(在我的情况下,使用apache用户运行php exec命令),则可以将以下命令添加到dockerfile中:
chmod 4755 $(which gpio)
(附:抱歉,将其作为答案发布,但我没有信誉对您的答案发表评论,这是向大家发布我的“谢谢”的唯一途径。)