Событие библиотеки gpiod и запрос ввода той же строки gpio не работают

Я попробовал вызвать gpiod_line_request_rising_edge_events () и gpiod_line_request_input () для одной и той же строки gpio в двух разных приложениях, но он вернул -1.

Я использовал приведенный ниже код, если я сначала вызываю Application-1, тогда gpiod_line_request_rising_edge_events терпит неудачу с -1. и если я сначала вызываю Application-2, тогда gpiod_line_request_inputgets терпит неудачу с -1.

// Приложение-1

      #include <stdio.h>
#include <gpiod.h>

int main()
{
char tBuffer[64] = {0,};
int gpio_num = 64, ret;
static struct gpiod_chip *gs_gpiod_chip = NULL;
struct gpiod_line *gs_gpiod_line = NULL;

unsigned int tgpio_chip = gpio_num / 32;
unsigned int tgpio_line = gpio_num % 32;

sprintf(tBuffer, "/dev/gpiochip%d", tgpio_chip);

gs_gpiod_chip = gpiod_chip_open(tBuffer);
if(!gs_gpiod_chip)
{
    printf("Error gpiod_chip_open\n");
    return -1;
}

gs_gpiod_line = gpiod_chip_get_line(gs_gpiod_chip, tgpio_line);
if(!gs_gpiod_line)
{
    printf("Error gs_gpiod_line\n");
    return -1;
}

ret = gpiod_line_request_input(gs_gpiod_line, "gpio-test");
if(ret == -1)
{
    printf("Error gpiod_line_request_input\n");
    return -1;
}

while(1);

gpiod_chip_close(gs_gpiod_chip);

printf("success\n");
return 0;
}

// Приложение-2

      #include <stdio.h>
#include <gpiod.h>

int main()
{
char tBuffer[64] = {0,};
int gpio_num = 64, ret;
static struct gpiod_chip *gs_gpiod_chip = NULL;
struct gpiod_line *gs_gpiod_line = NULL;

unsigned int tgpio_chip = gpio_num / 32;
unsigned int tgpio_line = gpio_num % 32;

sprintf(tBuffer, "/dev/gpiochip%d", tgpio_chip);

gs_gpiod_chip = gpiod_chip_open(tBuffer);
if(!gs_gpiod_chip)
{
    printf("Error gpiod_chip_open\n");
    return -1;
}

gs_gpiod_line = gpiod_chip_get_line(gs_gpiod_chip, tgpio_line);
if(!gs_gpiod_line)
{
    printf("Error gs_gpiod_line\n");
    return -1;
}

ret = gpiod_line_request_rising_edge_events(gs_gpiod_line, "DICnt-TEST");
if(ret == -1)
{
    printf("Error gpiod_line_request_rising_edge_events\n");
    return -1;
}
    
while(1);

gpiod_chip_close(gs_gpiod_chip);

printf("success\n");
return 0;
}

Есть ли у нас возможность заставить его работать или любое другое альтернативное решение с библиотекой libgpiod.

Спасибо.

1 ответ

GPIO uAPI икоторый его оборачивает, позволяет только одному процессу запрашивать строку за раз, чтобы предотвратить конфликты доступа. Если вы проверите, как предложил @KamilCuk, вы обнаружите, что второй процесс получаетошибка, так как строка уже запрошена первым процессом.

Если вам действительно необходимо разделить состояние линии или граничные события между двумя процессами, вам нужно, чтобы один процесс захватывал их и предоставлял их другому.

Другие вопросы по тегам