| /* Copyright 2018 SiFive, Inc */ |
| /* SPDX-License-Identifier: Apache-2.0 */ |
| |
| #ifndef METAL__BUTTON_H |
| #define METAL__BUTTON_H |
| |
| /*! |
| * @file button.h |
| * API for interfacing with physical buttons |
| */ |
| |
| #include <metal/interrupt.h> |
| |
| struct metal_button; |
| |
| struct metal_button_vtable { |
| int (*button_exist)(struct metal_button *button, char *label); |
| struct metal_interrupt* (*interrupt_controller)(struct metal_button *button); |
| int (*get_interrupt_id)(struct metal_button *button); |
| }; |
| |
| /*! |
| * @brief A button device handle |
| * |
| * A `struct metal_button` is an implementation-defined object which represents |
| * a button on a development board. |
| */ |
| struct metal_button { |
| const struct metal_button_vtable *vtable; |
| }; |
| |
| /*! |
| * @brief Get a reference to a button |
| * |
| * @param label The DeviceTree label for the button |
| * @return A handle for the button |
| */ |
| struct metal_button* metal_button_get(char *label); |
| |
| |
| /*! |
| * @brief Get the interrupt controller for a button |
| * |
| * @param button The handle for the button |
| * @return A pointer to the interrupt controller responsible for handling |
| * button interrupts. |
| */ |
| inline struct metal_interrupt* |
| metal_button_interrupt_controller(struct metal_button *button) { return button->vtable->interrupt_controller(button); } |
| |
| /*! |
| * @brief Get the interrupt id for a button |
| * |
| * @param button The handle for the button |
| * @return The interrupt id corresponding to a button. |
| */ |
| inline int metal_button_get_interrupt_id(struct metal_button *button) { return button->vtable->get_interrupt_id(button); } |
| |
| #endif |