Как я могу получать пограничные события через GPIO в Linux без цикла занятости?

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

Внутри находится микросхема AT91SAM9G20, и некоторые выводы вынесены наружу.

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

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

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

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

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

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

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


person Tom Mekken    schedule 09.12.2011    source источник


Ответы (1)


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

person Thomas Petazzoni    schedule 09.12.2011
comment
даже когда нет файла края, чтобы написать, следует ли листать восходящие или нисходящие фланги? Я могу просто использовать опрос, чтобы меня прервали? - person Tom Mekken; 16.12.2011
comment
хорошо, теперь я попробовал пример с опросом, но, как я ожидал, произошла ошибка, потому что файл края не существует, и сразу после того, как я запустил программу, в подсказке говорится: произошло прерывание poll () GPIO 82 (даже если я не щелкнул выключатель). Но после этого запроса больше ничего не происходит, даже когда я нажимаю кнопку, которую я подключил к GPIO 82 (нет запроса о дальнейших прерываниях). Это из-за кромочного файла? Могу ли я легко его создать? - person Tom Mekken; 19.12.2011
comment
Link-mosltly ответ теперь испытал гниение ссылок. - person rolfl; 19.12.2016
comment
@ThomasPetazzoni, не могли бы вы подумать об обновлении этого ответа, чтобы он был полезен сам по себе (так, чтобы он был полезным вкладом в базу знаний, даже если ссылки не работают)? - person Charles Duffy; 18.07.2019