BeagleBone Black Adafruit IO Python库GPIO用户权限

5

我在Debian(来自armhf.org)上使用Adafruit Python IO库中的GPIO遇到了问题。它可以在root用户下运行,但是普通用户无法运行。

我已经添加了udev规则;

KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R debian:gpio /sys/class/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R debian:gpio /sys/devices/virtual/gpio/'"

我的用户“debian”在组“gpio”中。 现在我可以在用户的shell中使用echo... > /sys...来控制gpio。但是在python中却不起作用,而且没有错误提示。
然而,如果我手动运行“echo 45 > /sys/class/gpio/export”,然后启动此gpio上的python脚本,它就能工作了。
我可以在启动python脚本后在/sys/class/gpio中看到gpio45,但它仍然不能工作。只有手动导出才能使其工作。我尝试从源代码编译gpio_export()函数并手动启动它。它确实能工作。但在真正的脚本中,它只会创建gpio文件而无法工作。
这是我的测试脚本:
import Adafruit_BBIO.GPIO as GPIO                                                                    
import time                                                                                          

P = "P8_11"                                                                                          

GPIO.setup(P, GPIO.OUT)                                                                              
for i in xrange(100):                                                                                
        if i % 2 == 0:                                                                               
                GPIO.output(P, GPIO.HIGH)                                                            
        else:                                                                                        
                GPIO.output(P, GPIO.LOW)                                                             
        time.sleep(0.5)                                                                              
GPIO.cleanup() 

感谢

-=更新=- 这是一个bug。我将其发布在项目的github页面上,并附带了一个暴力补丁,可以解决我的问题https://github.com/adafruit/adafruit-beaglebone-io-python/issues/36

--- adafruit-beaglebone-io-python/source/py_gpio.c  2013-09-17 20:10:08.000000000 +0300
+++ adafruit-beaglebone-io-python/source/py_gpio.c  2013-09-21 02:54:43.000000000 +0300
@@ -105,10 +105,26 @@

    if (get_gpio_number(channel, &gpio))
        return NULL;
-
-   gpio_export(gpio);
-   gpio_set_direction(gpio, direction);
-   gpio_set_value(gpio, pud);
+   
+   unsigned int count = 1000000;
+   int res = -1;
+   do {
+       res = gpio_export(gpio);
+   } while(res != 0 && count-- > 0);
+   if(count == 0)
+      return NULL;
+   count = 1000000;
+   do {
+       res = gpio_set_direction(gpio, direction);
+   } while(res != 0 && count-- > 0);
+   if(count == 0)
+      return NULL;
+   count = 1000000;
+   do {
+   res = gpio_set_value(gpio, pud);
+   } while(res != 0 && count-- > 0);
+   if(count == 0)
+      return NULL;

    gpio_direction[gpio] = direction;

基本上,您需要检查返回值。在我的情况下,open()无法打开通过导出gpio文件新创建的文件,因为它尚未出现在文件系统上。


将其标记为已解决或已回答。 - Michael Tomkins
2个回答

1

已解决,此补丁已被接受


-2

我正在使用Beaglebone Black Rev c。它带有Debian和Adafruit GPIO库。 我尝试了一个简单的程序来闪烁4个内置LED。但是程序没有闪烁LED。我用bonescript尝试过,它可以工作。 我已经以root用户身份登录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接