我正在尝试编写一个用于在Beaglebone上闪烁LED的C程序.我知道我可以使用sysfs方式......但是我想看看是否可以使用/ dev/mem获得与物理地址空间映射相同的结果.
我有一个头文件,beaglebone_gpio.h,内容如下:
#ifndef _BEAGLEBONE_GPIO_H_
#define _BEAGLEBONE_GPIO_H_
#define GPIO1_START_ADDR 0x4804C000
#define GPIO1_END_ADDR 0x4804DFFF
#define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)
#define GPIO_OE 0x134
#define GPIO_SETDATAOUT 0x194
#define GPIO_CLEARDATAOUT 0x190
#define USR0_LED (1<<21)
#define USR1_LED (1<<22)
#define USR2_LED (1<<23)
#define USR3_LED (1<<24)
#endif
Run Code Online (Sandbox Code Playgroud)
然后我有我的C程序,gpiotest.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "beaglebone_gpio.h"
int main(int argc, char *argv[]) {
volatile void *gpio_addr = NULL;
volatile unsigned int *gpio_oe_addr = NULL;
volatile unsigned int *gpio_setdataout_addr = NULL;
volatile unsigned int *gpio_cleardataout_addr …Run Code Online (Sandbox Code Playgroud) 在Raspberry Pi 2上运行Docker时,我们如何将GPIO引脚暴露给Docker容器?
我有以下代码,并在尝试运行时收到以下错误消息:
NameError: name 'true' is not defined
Run Code Online (Sandbox Code Playgroud)
我试图让Raspberry Pi在端口17上接收输入时运行HTML脚本:
import RPi.GPIO as GPIO
import time
import os
inputSignal = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(inputSignal,GPIO.IN)
while true:
if (GPIO.input(inputSignal)):
os.system("html /home/pi/index.html")
else:
print("No Input")
Run Code Online (Sandbox Code Playgroud) 我的电路板上有一个多用作GPIO的焊盘.当我尝试通过/ sys/class/gpio/export导出它时,我得到了
-sh: echo: write error: Device or resource busy
Run Code Online (Sandbox Code Playgroud)
我的猜测是其他一些司机在我得到这个机会之前要求这个垫子.我怎样才能找到保留它的内容?
当然,这个问题可能并不特定于树莓派.另外,我对Linux比较陌生.
我想写一个小库(在node.js中,如果这很重要)来使用sysfs访问raspberry pi的GPIO.但是,访问sysfs需要sudo访问权限,这显然是有原因的.
Quick2Wire似乎有一个解决方案,但我想更好地理解它,而不是盲目地使用它.他们当然使用了C语言,但从我的理解来看,代码并不复杂,而且可能只用bash就可以完成,即使不那么优雅.但是,最重要的是,我不确定它为什么会起作用.
任何帮助都会很棒.
编辑:感谢您的评论.很明显,我需要重新解释这个问题.这里说:一旦安装(作为root),应用程序不再需要使用根权限吗?在这种情况下,如何将某人添加到群组中?/sys/devices/virtual/gpio不是gpio sysfs可用的位置,那有什么诀窍呢?我真的是一个n00b,所以这些问题可能是n00b-ish,所以请耐心等待.
我正在使用我的Raspberry Pi上的GPIO引脚和PIR传感器来检测运动.当传感器检测到运动时,我想将软件移动到其他功能上.
此刻,为了检测运动,我的程序在等待运动被检测到的同时不断地循环运行.虽然目前这种方法有效,但在将来使用时,这将是非常低效的,我希望通过将其分配给一个事件来改进这一点.
有没有办法将我的GPIO输入绑定到程序检测到的事件,而无需手动运行循环.
这是我当前的检测运动循环:
var = 1
counter = 0
while var == 1:
if GPIO.input(7):
counter += 1
time.sleep(0.5)
else:
counter = 0
time.sleep(1)
if counter >= 3:
print "Movement!"
captureImage()
time.sleep(20)
Run Code Online (Sandbox Code Playgroud)
计数器和检测运动多次用于减少传感器拾取的误报数.
在使用Arch Linux的Raspberry Pi上,有一个名为的服务活动serial-getty@AMA0.
单元文件是:/usr/lib/systemd/system/serial-getty@.service
作为root我可以调用
systemctl stop serial-getty@ttyAMA0
systemctl disable serial-getty@ttyAMA0
Run Code Online (Sandbox Code Playgroud)
但重启后,服务已启用并再次运行.
禁用后为什么启用服务?如何永久禁用它?
UPDATE
systemd使用发电机在/ usr/lib中/ systemd /系统发电机/是称为systemd-getty的发电机二进制.此二进制文件在系统启动时运行,并将符号链接serial-getty@ttyAMA0.service添加到/run/systemd/generator/getty.target.wants.
我终于找到了一个肮脏的解 我在/usr/lib/systemd/system/serial-getty@.service中注释掉了所有操作.无论如何,服务确实似乎已开始,但没有阻止ttyAMA0.
我有一个用Python编写的Raspberry Pi项目,它使用RPi.GPIO模块.关于代码的所有工作都是在Windows机器上完成的,RPi.GPIO不会安装,每次我尝试运行autodoc时都会崩溃,说它无法导入RPi.GPIO.
D:\cube\docs\ledcube.rst:4: WARNING: autodoc: failed to import module u'ledcube'
; the following exception was raised:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\sphinx-1.2b1-py2.7.egg\sphinx\ext\autodoc.
py", line 326, in import_object
__import__(self.modname)
File "D:\cube\ledcube.py", line 2, in <module>
import RPi.GPIO as GPIO
ImportError: No module named RPi.GPIO
Run Code Online (Sandbox Code Playgroud)
有什么方法吗?
我正在开发运行Linux 2.6.37的ARM设备.我试图尽可能快地切换IO引脚.我制作了一个小内核模块和一个用户空间应用程序.我尝试了两件事:
ioremap.mmap() GPIO控制寄存器无需缓存并从用户空间使用它们.两种方法都有效,但第二种方法比第一种方法慢3倍(在示波器上观察).我想我禁用了所有缓存机制.
当然,我想要充分利用这两个领域:从内核空间的速度来看,用户空间的灵活性和易开发性.
有谁知道为什么mmap()可能比这慢ioremap()?
这是我的代码:
static int ti81xx_usmap_mmap(struct file* pFile, struct vm_area_struct* pVma)
{
pVma->vm_flags |= VM_RESERVED;
pVma->vm_page_prot = pgprot_noncached(pVma->vm_page_prot);
if (io_remap_pfn_range(pVma, pVma->vm_start, pVma->vm_pgoff,
pVma->vm_end - pVma->vm_start, pVma->vm_page_prot))
return -EAGAIN;
pVma->vm_ops = &ti81xx_usmap_vm_ops;
return 0;
}
static void ti81xx_usmap_test_gpio(void)
{
u32* pGpIoRegisters = ioremap_nocache(TI81XX_GPIO0_BASE, 0x400);
const u32 pin = 1 << 24;
int i;
/* I should use IO read/write functions instead of pointer deferencing,
* but portability isn't …Run Code Online (Sandbox Code Playgroud) 我目前有两个连接到我的Raspberry Pi的按钮(这些是带有环形LED的那些)并且我正在尝试执行此代码
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT) #green LED
GPIO.setup(18, GPIO.OUT) #red LED
GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) #green button
GPIO.setup(27, GPIO.IN, GPIO.PUD_UP) #red button
def remove_events():
GPIO.remove_event_detect(4)
GPIO.remove_event_detect(27)
def add_events():
GPIO.add_event_detect(4, GPIO.FALLING, callback=green, bouncetime=800)
GPIO.add_event_detect(27, GPIO.FALLING, callback=red, bouncetime=800)
def red(pin):
remove_events()
GPIO.output(17, GPIO.LOW)
print "red pushed"
time.sleep(2)
GPIO.output(17, GPIO.HIGH)
add_events()
def green(pin):
remove_events()
GPIO.output(18, GPIO.LOW)
print "green pushed"
time.sleep(2)
GPIO.output(18, GPIO.HIGH)
add_events()
def main():
while True:
print "waiting"
time.sleep(0.5)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.add_event_detect(4, …Run Code Online (Sandbox Code Playgroud)