2016-01-15 3 views
2

как названия государства, у меня есть проблема портирования некоторых прерываний пользовательских пространство код из другого ARMv7 Embedded Linux платформы на Raspberry Pi 2 Model B.опроса() на малиновом GPIO (sysfs) малине

Я нахожусь осознавая библиотеку wiringPi (и заставил ее работать таким образом), но по причинам оценки я хочу сделать как можно больше одинакового кода на обеих платформах. По этой причине мне приходится взаимодействовать с sysfs вручную.

Итак, вот соответствующий фрагмент кода

#define GPIO_TRIGGER_MODE "rising" 
#define SYS_GPIO_PIN  "2" 
#define SYS_GPIO_DIRECTION "/sys/class/gpio/gpio2/direction" 
#define SYS_GPIO_EDGE  "/sys/class/gpio/gpio2/edge" 
#define SYS_GPIO_VALUE  "/sys/class/gpio/gpio2/value" 
static int fd_gpio; 

{...} 

//Setup sysfs-Pin 
if ((fd_gpio = open("/sys/class/gpio/export", O_WRONLY)) < 0) { 
    exit(-1); 
} else { 
    write(fd_gpio, SYS_GPIO_PIN, strlen((char*) SYS_GPIO_PIN)); 
    close(fd_gpio); 
    if ((fd_gpio = open(SYS_GPIO_DIRECTION, O_WRONLY)) < 0) { 
     exit(-1); 
    } else { 
     write(fd_gpio, "in", strlen("in")); 
     close(fd_gpio); 

     if ((fd_gpio = open(SYS_GPIO_EDGE, O_WRONLY)) < 0) { 
      exit(-1); 
     } else { 
      write(fd_gpio, GPIO_TRIGGER_MODE, strlen((char*) GPIO_TRIGGER_MODE)); 
      close(fd_gpio); 
     } 
    } 
} 

static int fd_gpio_value; 
struct pollfd *fd_poll; 

if ((fd_gpio_value = open(SYS_GPIO_VALUE, O_RDWR)) < 0) { 
     exit(-1); 
} else { 
    fd_poll = malloc(sizeof (*fd_poll)); 
    fd_poll->fd = fd_gpio_value; 
    fd_poll->events = POLLPRI; 

    char buf; 
    while (1) { 
     read(fd_gpio_value, &buf, 1); 
     if (poll(fd_poll, 1, -1) == -1) { 
      exit(-1); 
     } else { 
       some_logging_occurs(); 
     } 
    } 

Так, Что рабочая является установка на Pin: (кат/SYS/класс/GPIO/gpio2/$ материал повторяет правильные настройки). Пока нет триггера, программа ждет правильно (по запросу(), как и предполагалось).

После того, как появился первый передний фронт, poll() всегда возвращается немедленно и, таким образом, выполняет мою функцию регистрации каждый раз не только по нарастающим фронтам.

Что меня озадачивает, то, что тот же самый код работает точно так же, как и на другой платформе, и это тот же интерфейс с GPIO.

ответ

1

наконец нашел ответ: простой

lseek(fd_gpio_value,0,SEEK_SET); 

отсутствовал до чтения()

Смежные вопросы