目前我正在为friendlyarm Linux 2.6.32.2(mini2440)开发GPIO内核模块.我来自电子背景,是Linux新手.
启动时加载的内核模块和相关的设备文件位于/devas gpiofreq.
首次写入器件文件时,GPIO引脚在50kHz时连续切换.在第二次写它停止翻转.第三次,它再次启动,依此类推.
我编写了单独的内核模块来生成freq.但是在第一次写入设备文件后CPU冻结了.显示终端提示,但之后我无法运行任何命令.
这是代码片段:
//calling function which generates continuous freq at gpio
static int send_freq(void *arg)
{
set_current_state(TASK_INTERRUPTIBLE);
for(;;)
{
gpio_set_value(192,1);
udelay(10);
gpio_set_value(192,0);
udelay(10);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是设备写入代码,它使用写入设备文件的任何数据启动或停止.
if(toggle==0)
{
printk("Starting Freq.\n");
task=kthread_run(&send_freq,(void *)freq,"START");
toggle=1;
}
else
{
printk("Operation Terminated.\n");
i = kthread_stop(task);
toggle=0;
}
Run Code Online (Sandbox Code Playgroud) 如何使用go语言读取Raspberry Pi的GPIO上的温度传感器值?
拜托,有人帮帮我.
提前致谢.
我需要:
能够硬件重置连接USB的设备(华为E220调制解调器)
已尝试软复位(使用unbind/bind和授权0/1),但软件复位不足以使设备再次正常工作; 该设备有一些奇怪的错误,这是由长时间使用(连接几天后)触发的.
使用/ sys/debug/omap_mux找到了很多答案,但是这个设备在新内核中不再存在.
由于这个问题花了两天时间才得到可行的答案,所以我决定在这里发布答案,这对其他人来说可能有用.
我在基于ARM的linux板(imx233 CPU)上使用3.12内核.我的目的是检测GPIO的引脚变化(1到0).
我可以不断调用下面的函数读取引脚值(在while(1)循环中)
int GPIO_read_value(int pin){
int gpio_value = 0;
char path[35] = {'\0'};
FILE *fp;
sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
//error
}
fscanf(fp, "%d", &gpio_value);
fclose(fp);
return gpio_value;
}
Run Code Online (Sandbox Code Playgroud)
但它会给CPU带来太多负载.我不使用usleep或nanosleep,因为引脚更改发生的时间很短,导致我错过了该事件.
据我所知,它是不可能使用的poll().有没有poll()类似的功能可以用来检测GPIO的引脚变化?
编辑:以防万一,如果我做错了什么,这是我的poll()用法没有检测到引脚更改
struct pollfd pollfds;
int fd;
int nread, result;
pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
int timeout = 20000; /* Timeout in msec. */
char buffer[128];
if( pollfds.fd < 0 ){
printf(" …Run Code Online (Sandbox Code Playgroud) 我一直在学习Linux设备树,我们一直在尝试开始移植一些旧的代码来使用它们.我在使用gpio控制器节点时遇到了一些麻烦:
gpio1: gpio-controller@c00 {
#gpio-cells = <2>;
compatible = "cavium,octeon-3860-gpio";
reg = <0xc00 0x100>;
gpio-controller;
/* Interrupts are specified by two parts:
* 1) GPIO pin number (0..15)
* 2) Triggering (1 - edge rising
* 2 - edge falling
* 4 - level active high
* 8 - level active low)
*/
interrupt-controller;
interrupt-cells = <2>;
interrupts = <0 24>, <1 25>, <2 26>, <3 27>;
Run Code Online (Sandbox Code Playgroud)
};
我正在尝试将某些IRQ映射到GPIO引脚,但是,看起来它只是将第一个<0 24> IRQ 24映射到gpio引脚0.我查看了源代码并且看起来它似乎无法进行交互'中断',虽然设备树绑定文本文件似乎暗示它将(devicetree/bindings/gpio/cavium-octeon-gpio.txt).有谁知道我如何将一些中断映射到不同的gpio引脚?
我有一个使用boost :: asio进行异步输入/输出的单线程Linux应用程序.现在我需要扩展此应用程序以读入GPIO输入/sys/class/gpio/gpioXX/value.
在边沿触发的GPIO输入上使用boost :: asio :: posix :: stream_descriptor可以做到这一点吗?
我配置了GPIO输入,如下所示:
echo XX >/sys/class/gpio/export
echo in >/sys/class/gpio/gpioXX/direction
echo both >/sys/class/gpio/gpioXX/edge
Run Code Online (Sandbox Code Playgroud)
我设法编写了一个epoll基于GPIO文件描述符的基础测试应用程序,直到GPIO信号发生变化但boost::asio似乎无法正常阻塞.调用boost::asio::async_read总是立即调用处理程序(当然只在内部io_service.run()),使用EOF或 - 如果文件指针被设置回 - 2字节数据.
我不是boost::asio内部专家,但原因可能是boost::asioepoll反应器是水平触发而不是边缘触发的情况posix::stream_descriptor?
这是我的代码:
#include <fcntl.h>
#include <algorithm>
#include <iterator>
#include <stdexcept>
#include <boost/asio.hpp>
boost::asio::io_service io_service;
boost::asio::posix::stream_descriptor sd(io_service);
boost::asio::streambuf streambuf;
void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (error.value() == boost::asio::error::eof) {
// If we don't reset the file pointer we …Run Code Online (Sandbox Code Playgroud) 所以我有一个小小的风扇连接到引脚6(接地)和引脚2.我试图在需要时手动启动和停止风扇,但我在尝试时遇到此错误:
ValueError:在Raspberry Pi上发送的通道无效
这是我以root身份执行的代码.它似乎在其他引脚上工作但不在引脚2上工作
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(2, GPIO.OUT, pull_up_down=GPIO.PUD_UP)
Run Code Online (Sandbox Code Playgroud)
我不知道如何访问此引脚.有什么我做错了吗?
我正在尝试为嵌入式系统创建设备树,并希望向用户空间公开一些GPIO。这些不是,也不应该由内核驱动程序使用。例如,有一个USB设备焊接到板上,由用户空间驱动器控制。它具有GPIO重置线,用户空间库需要访问该重置线。
我希望这些文件在sysfs中通过名称公开,以便用户空间可以访问/sys/class/gpio/usbreset而不需要知道不可思议的gpio编号并需要专门“导出”它。我尝试将其设置为GPIO猪,该猪初始化GPIO,但其名称未出现在sysfs中,并且在将其拖入时无法导出gpio。我知道我可以选择其他内核驱动程序类型,例如LED,但它不是LED,对我来说,这似乎不是很干净。
在sysfs中导出命名的GPIO的正确方法是什么?
如何在OrangePi PC plus(SoC H3)上访问Armbian 3.4.113上的GPIO,因为使用gpio-sunxi和编辑.fex-file 的旧方法已过时(想要共享此...)
gpio-hog声明的目的和用例是什么?我正在尝试配置许多(10+)GPIO,以便与Userspace中的低级芯片通信。我已经很容易使用sysfs导出对芯片进行了交谈,但是内核和编程论坛中的文档都让我担心在生产系统中使用这种机制。
阅读更多的内核文档,我阅读了有关gpio-hog声明的信息,这似乎是至少初始配置GPIO的理想机制。从文档中:
GPIO触发是一种机制,提供自动GPIO请求和配置,作为gpio控制器的驱动程序探测功能的一部分。
除了设置正确的低位供应商设置外,我还启用了所需gpio引脚的暂存功能,他们提出了正确的设置。问题在于,gpio似乎是内核拥有的,不能通过任何Userspace工具(例如sysfs或)进行接口libgpiod。这对我来说使猪圈基本上毫无用处,也使我怀疑它的真正目的是什么。我正在libgpiod最后一种探索方式,但是文档表明,这hogging应该是我使用的机制。
gpio ×10
linux ×5
device-tree ×3
linux-kernel ×2
boost-asio ×1
c ×1
c++ ×1
embedded ×1
epoll ×1
go ×1
orange-pi ×1
posix ×1
python ×1
raspberry-pi ×1
raspbian ×1
sysfs ×1
task ×1
usb ×1