First implementation of digital input interrupt
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
#include "digital_in.h"
|
||||
#include "usb.h"
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/devicetree.h>
|
||||
#include <zephyr/logging/log.h>
|
||||
#include <zephyr/drivers/gpio.h>
|
||||
|
||||
LOG_MODULE_REGISTER(digital_in, LOG_LEVEL_INF);
|
||||
|
||||
|
||||
#define DIGITAL_IN_MACRO(node_id) GPIO_DT_SPEC_GET(node_id, gpios),
|
||||
|
||||
static const struct gpio_dt_spec digital_inputs[] = {
|
||||
DT_FOREACH_CHILD(DT_NODELABEL(digital_inputs), DIGITAL_IN_MACRO)
|
||||
};
|
||||
static struct gpio_callback digital_in_cb_data;
|
||||
|
||||
|
||||
void digital_in_irq_handler(const struct device *dev, struct gpio_callback *cb, uint32_t pins) {
|
||||
// TODO: what happens
|
||||
struct command_message_t *msg = usb_get_next_tx_buf();
|
||||
command_create_message(msg, sizeof(pins), DIGITAL_IN, (uint8_t *)&pins);
|
||||
usb_send_command(msg);
|
||||
}
|
||||
|
||||
int digital_in_pin_init(const struct gpio_dt_spec *gpio, uint32_t *bitmask) {
|
||||
int ret;
|
||||
|
||||
if (!gpio_is_ready_dt(gpio)) {
|
||||
LOG_ERR("GPIO device %s is not ready\n", gpio->port->name);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ret = gpio_pin_configure_dt(gpio, GPIO_INPUT);
|
||||
if (ret != 0) {
|
||||
LOG_ERR("Failed to configure %s pin %d\n", gpio->port->name, gpio->pin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = gpio_pin_interrupt_configure_dt(gpio, GPIO_INT_EDGE_TO_ACTIVE);
|
||||
if (ret != 0) {
|
||||
LOG_ERR("Failed to configure interrupt on %s pin %d\n", gpio->port->name, gpio->pin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*bitmask |= BIT(gpio->pin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int digital_in_init() {
|
||||
uint32_t bitmask = 0;
|
||||
|
||||
for (int i = 0; i < DIGITAL_IN_CHANNELS; i++) {
|
||||
digital_in_pin_init(&digital_inputs[i], &bitmask);
|
||||
}
|
||||
|
||||
gpio_init_callback(&digital_in_cb_data, digital_in_irq_handler, bitmask);
|
||||
gpio_add_callback(digital_inputs[0].port, &digital_in_cb_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user