Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137962245
D52102.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D52102.diff
View Options
diff --git a/lib/libgpio/Makefile b/lib/libgpio/Makefile
--- a/lib/libgpio/Makefile
+++ b/lib/libgpio/Makefile
@@ -27,6 +27,8 @@
gpio.3 gpio_pin_pulldown.3 \
gpio.3 gpio_pin_invin.3 \
gpio.3 gpio_pin_invout.3 \
- gpio.3 gpio_pin_pulsate.3
+ gpio.3 gpio_pin_pulsate.3 \
+ gpio.3 gpio_configure_events.3 \
+ gpio.3 gpio_fileno.3
.include <bsd.lib.mk>
diff --git a/lib/libgpio/gpio.3 b/lib/libgpio/gpio.3
--- a/lib/libgpio/gpio.3
+++ b/lib/libgpio/gpio.3
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd July 1, 2015
+.Dd September 3, 2025
.Dt GPIO 3
.Os
.Sh NAME
@@ -79,6 +79,10 @@
.Fn gpio_pin_invout "gpio_handle_t handle" "gpio_pin_t pin"
.Ft int
.Fn gpio_pin_pulsate "gpio_handle_t handle" "gpio_pin_t pin"
+.Ft int
+.Fn gpio_configure_events "gpio_handle_t handle" "uint32_t report_type" "uint32_t fifo_size"
+.Ft int
+.Fn gpio_fileno "gpio_handle_t handle"
.Sh DESCRIPTION
The
.Nm libgpio
@@ -125,7 +129,7 @@
variable.
All other structure members will be ignored by this function.
The list of flags can be found in
-.Pa /usr/include/sys/gpio.h .
+.In sys/gpio.h .
.Pp
The get or set the state of a GPIO pin, the functions
.Fn gpio_pin_get
@@ -156,6 +160,66 @@
.Fn gpio_pin_pulsate
are wrappers around
.Fn gpio_pin_set_flags .
+.Pp
+The function
+.Fn gpio_configure_events
+configures the interrupt report type and FIFO size for buffered
+gpio interrupts.
+The report type is specified by one of the following values:
+.Bl -tag -width indent
+.It Dv GPIO_EVENT_REPORT_DETAIL
+Events are reported using
+.Ft struct gpio_event_detail .
+.It Dv GPIO_EVENT_REPORT_SUMMARY
+Events are reported using
+.Ft struct gpio_event_summary .
+.El
+.Pp
+By default, the report type is
+.Dv GPIO_EVENT_REPORT_DETAIL ,
+with a default FIFO size of 2 * number of pins belonging to the
+.Ft gpio_device_t
+instance.
+The FIFO argument is only meaningful when
+.Fa report_type
+is
+.Dv GPIO_EVENT_REPORT_DETAIL .
+The structures associated with each report type are defined in
+.In sys/gpio.h .
+This setting is tracked on a per device instance basis.
+The FIFO size cannot be reduced below the default value,
+nor can it be decreased after it has been increased.
+If any pin on the device has already been configured for interrupts,
+.Fn gpio_configure_events
+fails and returns -1.
+On success 0 is returned.
+.Pp
+The function
+.Fn gpio_fileno
+returns the file descriptor associated with the
+.Ft gpio_handle_t
+instance.
+.Pp
+File operations have the following semantics:
+.Bl -tag -width "read (2)"
+.It Xr read 2
+Read one or more gpio interrupts that have occured
+since the last successful
+.Xr read 2 .
+The results are placed into the output buffer
+of the type previously established via
+.Fn gpio_configure_events .
+If there are no pending interrupts,
+.Xr read 2
+blocks until an interrupt occurs, unless
+.Dv O_NONBLOCK
+is set.
+.It Xr poll 2
+When receiving notification via
+.Xr poll 2
+or similar interfaces, the file descriptor becomes readable when
+one or more gpio interrupts are pending.
+.El
.Sh EXAMPLES
The following example shows how to configure pin 16 as output and then
drive it high:
diff --git a/lib/libgpio/gpio.c b/lib/libgpio/gpio.c
--- a/lib/libgpio/gpio.c
+++ b/lib/libgpio/gpio.c
@@ -274,3 +274,23 @@
{
return (gpio_pin_set_flag(handle, pin, GPIO_PIN_PULSATE));
}
+
+int
+gpio_configure_events(gpio_handle_t handle, uint32_t report_type,
+ uint32_t fifo_size)
+{
+ struct gpio_event_config gpevent_config;
+
+ gpevent_config.gp_report_type = report_type;
+ gpevent_config.gp_fifo_size = fifo_size;
+ if (ioctl(handle, GPIOCONFIGEVENTS, &gpevent_config) < 0)
+ return (-1);
+
+ return (0);
+}
+
+int
+gpio_fileno(gpio_handle_t handle)
+{
+ return (handle);
+}
diff --git a/lib/libgpio/libgpio.h b/lib/libgpio/libgpio.h
--- a/lib/libgpio/libgpio.h
+++ b/lib/libgpio/libgpio.h
@@ -102,6 +102,19 @@
int gpio_pin_invin(gpio_handle_t, gpio_pin_t);
int gpio_pin_invout(gpio_handle_t, gpio_pin_t);
int gpio_pin_pulsate(gpio_handle_t, gpio_pin_t);
+/*
+ * GPIO event reporting configuration
+ *
+ * Set the event reporting type, the default being GPIO_EVENT_REPORT_DETAIL,
+ * and fifo size of 2 * number of pins belonging to the gpioc device instance.
+ * FIFO size can only be changed when report_type is GPIO_EVENT_REPORT_DETAIL.
+ */
+int gpio_configure_events(gpio_handle_t, uint32_t, uint32_t);
+/*
+ * Retrieve the file descriptor associated with gpio_handle_t, which can
+ * be used for gpio interrupts.
+ */
+int gpio_fileno(gpio_handle_t);
__END_DECLS
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 28, 5:31 PM (12 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26291806
Default Alt Text
D52102.diff (4 KB)
Attached To
Mode
D52102: libgpio: Add and document gpio interrupt utility functions
Attached
Detach File
Event Timeline
Log In to Comment