C++ nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户)
我正在SAMA5D27-SOM1-EK1板上做一些实验。我正在使用Linux操作系统。我正在利用我董事会的GPIO。在GPIO 10上定义了红色LED,在GPIO 29上定义了用户按钮。我写了C++程序来控制板的LED,这里是代码:C++ nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户),c++,arm,embedded-linux,gpio,sysfs,C++,Arm,Embedded Linux,Gpio,Sysfs,我正在SAMA5D27-SOM1-EK1板上做一些实验。我正在使用Linux操作系统。我正在利用我董事会的GPIO。在GPIO 10上定义了红色LED,在GPIO 29上定义了用户按钮。我写了C++程序来控制板的LED,这里是代码: #include<iostream> #include<fstream> #include<string> using namespace std; #define LED0_PATH "/sys/class/leds/red"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define LED0_PATH "/sys/class/leds/red"
void removeTrigger(){
// remove the trigger from the LED
std::fstream fs;
fs.open( LED0_PATH "/trigger", std::fstream::out);
fs << "none";
fs.close();
}
int main(int argc, char* argv[]){
if(argc!=2){
cout << "Usage is makeLED and one of: on, off, flash or status"
<< endl;
cout << "e.g. makeLED flash" << endl;
}
string cmd(argv[1]);
std::fstream fs;
cout << "Starting the LED flash program" << endl;
cout << "The LED Path is: " << LED0_PATH << endl;
// select whether it is on, off or flash
if(cmd=="on"){
removeTrigger();
fs.open (LED0_PATH "/brightness", std::fstream::out);
fs << "1";
fs.close();
}
else if (cmd=="off"){
removeTrigger();
fs.open (LED0_PATH "/brightness", std::fstream::out);
fs << "0";
fs.close();
}
else if (cmd=="flash"){
fs.open (LED0_PATH "/trigger", std::fstream::out);
fs << "timer";
fs.close();
fs.open (LED0_PATH "/delay_on", std::fstream::out);
fs << "50";
fs.close();
fs.open (LED0_PATH "/delay_off", std::fstream::out);
fs << "50";
fs.close();
}
else if (cmd=="status"){
// display the current trigger details
fs.open( LED0_PATH "/trigger", std::fstream::in);
string line;
while(getline(fs,line)) cout << line;
fs.close();
}
else{
cout << "Invalid command" << endl;
}
cout << "Finished the LED flash program" << endl;
return 0;
现在,当我录制/target\u bin按钮时,它会显示一个错误:
nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083
(用户)指示灯红色:请求\u irq失败,错误为-16
有人能帮我吗
现在,当我录制[sic]./target_bin按钮时,它会显示一个错误:
nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户)LED红色:请求\u irq失败,错误为-16
错误16为“设备或资源忙”。
所涉及的设备或资源是按钮的gpio_键。
请注意,错误消息中提到了“用户”,这恰好是分配给设备树文件中按钮的gpio_键的标签
此(新)中断模式(即0x00002083)与gpio_密钥驱动程序建立的现有模式/标志(即0x00000083)冲突。
此冲突意味着此GPIO不能同时用于GPIO_键(输入事件)和LED触发器。
因此,您必须选择此GPIO将在哪种模式下运行
。。。而不是LED
您的意思是希望错误出现在LED上?
在执行特定操作时,您无法选择导致错误的设备
在为GPIO_键分配(新的)中断处理程序期间,您请求的操作(即分配一个特定GPIO(已作为GPIO_键安装)作为LED触发器失败。
因此,gpio_键报告错误,而不是LED
如需进一步确认以消除您的疑虑:
由于错误消息中提到“irq 80”,您应该在主板上的/proc/interrupts文件中查找此“irq 80”。
该文件应表明“irq 80”与“GPIO 29”(根据DT是GPIO_键)相关联
还有一个程序可以消除你的疑虑:
找到一个可访问且未使用的未使用的PIO引脚(作为gpio由任何外围设备或任何驱动程序/进程使用)。
将该引脚指定为LED触发器。
不应发生错误(假设您选择了未使用的pin)。
将引脚短接至接地或VDD_3V3以更改LED的(默认)状态
如何重新配置按钮用户,使其不是gpio_键并可用作LED触发器
正如我已经写过的,设备树文件at91-sama5d27_som1_ek.dts是带有按钮的GPIO被声明为GPIO_键的地方,我还发布了该节点的一段突出行。
如果不希望将该GPIO配置为GPIO_密钥,则需要通过删除该节点来修改设备树文件(当然还需要重新编译为dtb)。您仍然需要LED触发器请求IRQ。阅读如何释放LED GPIO触发器的GPIO线的绑定文档。更好的方法是在DTS中禁用此GPIO线上的LED。我不希望修改DTS。但当我使用gpioinfo | grep“\[USED\]”
命令搜索主板上“使用”的设备时,我发现在运行程序之前使用了红色LED:第10行:“PA10”“RED”输出高电平[已使用]
但我的代码没有显示错误。为什么它会显示按钮错误而不是LED错误?我如何重新配置按钮用户,使其不是gpio_键并可用作LED触发器?
else if (cmd=="button"){
removeTrigger();
fs.open (LED0_PATH "/trigger", std::fstream::out);
fs << "gpio";
fs.close();
fs.open (LED0_PATH "/gpio", std::fstream::out);
fs << "29";
fs.close();
}
gpio_keys {
...
pb4 {
label = "USER";
gpios = <&pioA PIN_PA29 GPIO_ACTIVE_LOW>;
...
};
};
* IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished.
* Used by threaded interrupts which need to keep the
* irq line disabled until the threaded handler has been run.
...
#define IRQF_ONESHOT 0x00002000