再次导出相同的GPIO时,将删除GPIO文件夹

时间:2018-09-01 06:39:53

标签: linux-kernel beagleboneblack gpio

我基本上是在应用程序中导出任何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上的这个问题?

1 个答案:

答案 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脚本中,类似的方法应该非常简单。