我基本上是在应用程序中导出任何gpios。我开始在beaglebone黑色上实现此功能。没问题后,我继续在beaglebone blue上实现该应用程序。因此,我意识到该应用程序可以第一次运行,然后第二次失败。之后,它可以再次运行第三次。
经过一番搜索,我意识到在beaglebone blue上导出任何gpio时出现了问题,不仅不允许覆盖所需的GPIO值,而且还删除了现有的gpio。例如,简单的 echo 23> / sys / class / gpio / export 命令给出beaglebone black和beaglebone blue的输出,如下所示:
Beaglebone Black(3.8.13-bone86)
root@beaglebone# echo 23 > /sys/class/gpio/export
root@beaglebone# ls /sys/class/gpio/
export gpio23 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
root@beaglebone# echo 23 > /sys/class/gpio/export
bash: echo: write error: Device or resource busy
root@beaglebone# ls /sys/class/gpio/
export gpio23 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
Beaglebone Blue(4.9.105-ti-rt-r113)
root@beaglebone# echo 23 > /sys/class/gpio/export
root@beaglebone# ls /sys/class/gpio/
export gpio23 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
root@beaglebone# echo 23 > /sys/class/gpio/export
bash: echo: write error: Operation not permitted
root@beaglebone# ls /sys/class/gpio/
export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
那么,如何消除beaglebone blue上的这个问题?
答案 0 :(得分:0)
我在BeagleBone Black(4.14.71-ti-r80)中重复了这个“错误”。
它发生在Derek Molloy的《问题1》(Emsue 1)的优秀著作《探索BeagleBone》中复制的某些C ++中,该书是在3.8内核是最新的时编写的。
我检查了该书的新版本(今年发行),但没有提及此问题。
在将gpio编号写入导出sysfs文件之前,我通过测试gpio#目录是否存在来“修复”它。
即我检查了是否存在'/ sys / class / gpio / gpio7'
在将7写入'/ sys / class / gpio / export'之前
我从以下位置更改了Molloy的GPIO.cpp中现有的exportGPIO功能:
int GPIO::exportGPIO(){
return write(GPIO_PATH, "export", this->number);
}
收件人:
int GPIO::exportGPIO(){
// APM - 2019-05-27 - export twice kills it
if (checkDirectoryExists(GPIO_PATH + this->name)) {
cout << std::string("GPIO: export ") + GPIO_PATH + this->name + " already exists" << endl;
return 0;
}
return write(GPIO_PATH, "export", this->number);
}
我基于stat()调用编写的checkDirectoryExists函数。
在shell脚本中,类似的方法应该非常简单。