Как я могу получить пограничные события через GPIO в Linux без занятого цикла? - PullRequest
4 голосов
/ 09 декабря 2011

Я работаю в системе со встроенным Linux (Kernel 2.6.31).

Это чип AT91SAM9G20 внутри, и некоторые выводы выводятся наружу.

Теперь я хочу использовать их в качестве входов GPIO.

Я прочитал документацию gpio.txt об использовании GPIO через файловую систему, и это работает очень хорошо, пока здесь.Я подключил некоторые переключатели к gpio-контактам и вижу результат в /sys/class/gpio/gpioX/value.Но теперь я хотел бы отреагировать на изменение, не ожидая зацикливания.(т. е. эхо «Switch1 был нажат»).

Я думаю, мне нужны прерывания здесь, но я не мог понять, как их использовать, не написав свой собственный драйвер ядра.Я относительно новичок в Linux и C (я обычно программирую на Java), поэтому я бы хотел обрабатывать прерывания также через sysfs.Но моя проблема в том, что в моем каталоге GPIO нет файла "edge" (я полагаю, потому что это только начиная с версии ядра 2.6.33+).Это правильно?Вместо «края» у меня есть файл uevent, который не описан в gpio.txt.

В документации по gpio.txt был упомянут стандартный драйвер ядра: «gpio_keys».Можно ли использовать это для моей проблемы?

Полагаю, было бы лучше работать с этим драйвером, чем разрешать программе из пользовательского пространства манипулировать задачами ядра.Я нашел много кодов для написания своего собственного драйвера, но я даже не смог выяснить, какой из 600 gpio.h файлов включить и как обратиться к библиотеке (кросс-компилятор не смог найти gpio.h file).

Извините за вопросы новичка, надеюсь, вы могли бы дать мне несколько советов.

Заранее спасибо

1 Ответ

0 голосов
/ 09 декабря 2011

См. https://www.ridgerun.com/developer/wiki/index.php/Gpio-int-test.c для примера того, как это сделать.По сути, вам не хватает использования системных вызовов select или poll.

...