Папка GPIO удаляется при повторном экспорте того же GPIO - PullRequest
0 голосов
/ 01 сентября 2018

Я в основном экспортирую любые gpios в моем приложении. Я начал реализовывать это на биглебоне черного цвета. После без проблем я перешел к реализации приложения на beaglebone blue. Итак, я понял, что приложение может быть запущено в первый раз, а затем оно перестало работать во второй раз. После этого он снова может работать в третий раз.

После небольшого поиска я понял, что проблема возникает при экспорте любого gpio на beaglebone blue, он не только не позволяет перезаписать желаемое значение 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

Итак, как мне избавиться от этой проблемы на биглебоне синем?

1 Ответ

0 голосов
/ 27 мая 2019

Я повторил эту «ошибку» в BeagleBone Black (4.14.71-ti-r80).

Это происходило в некотором C ++, скопированном из превосходной Исследовавшей BeagleBone книги Дерека Моллоя Выпуск 1 , которая была написана, когда ядро ​​3.8 было самым последним.

Я проверил новую версию книги (выпущенную в этом году), но не упомянул об этой проблеме.

Я «исправил» это, поставив тест на существование каталога gpio # перед записью номера gpio в файл экспорта sysfs.

т.е. Я проверил наличие '/ sys / class / gpio / gpio7'

Перед записью 7 в '/ sys / class / gpio / export'

Я изменил существующую функцию exportGPIO в GPIO.cpp в Molloy с:

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);
}

Функция checkDirectoryExists, которую я написал на основе вызова stat ().

Подобный подход должен быть довольно простым в сценарии оболочки.

...