Interrupt handling and user space notification

后端 未结 2 2033
闹比i
闹比i 2021-01-01 06:31

I have several registered interrupts assigned to gpios, and application in user space. How to notify application about occurred interrupt and which interrupt there was?

相关标签:
2条回答
  • 2021-01-01 06:56

    You don't need fancy kernel to userspace communication. A userspace application has access to GPIOs using Sysfs. Read about it in Documentation/gpio.txt.

    First, export a GPIO pin like this (the actual number depends on your setup):

    # echo 23 > /sys/class/gpio/export
    

    This will export GPIO pin #23, and thus create /sys/class/gpio/gpio23.

    Set its direction:

    # echo in > /sys/class/gpio/gpio23/direction
    

    If the hardware GPIO controller supports interrupts generation, the driver should also support it and you will see /sys/class/gpio/gpio23/edge. Write either rising, falling or both to this file to indicate the signal edge(s) that will create a "userspace interrupt". Now, to get interrupted, use the poll(2) system call on /sys/class/gpio/gpio23/value. Then, when the poll call unblocks, read the new value (/sys/class/gpio/gpio23/value), which will be '0' or '1' (ASCII).

    0 讨论(0)
  • 2021-01-01 07:01

    dinesh provided a C implementation of eepp's proposed solution, which requires that the application block in poll().

    Here is a C++ implementation which abstracts this functionality, and provides callback/interrupt functionality instead. Note the GPIO constructor which takes a callback function as an argument. This provides the capability desired by the OP.

    https://github.com/tweej/HighLatencyGPIO

    0 讨论(0)
提交回复
热议问题