First implementation of digital input interrupt

This commit is contained in:
Your Name
2026-10-01 23:39:46 +03:00
parent 8e58af1741
commit d1e4beac16
4 changed files with 83 additions and 0 deletions
+1
View File
@@ -22,6 +22,7 @@ typedef enum {
ADC_READ,
ADC_READ_ALL,
ADC_SET_READ,
DIGITAL_IN,
// Keep last
NUM_COMMANDS,
+64
View File
@@ -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;
}
+10
View File
@@ -0,0 +1,10 @@
#ifndef DIGITAL_IN_H
#define DIGITAL_IN_H
#define DIGITAL_IN_CHANNELS 6
int digital_in_init();
#endif // DIGITAL_IN_H
+8
View File
@@ -2,6 +2,7 @@
#include "usb.h"
#include "servo.h"
#include "adc.h"
#include "digital_in.h"
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
@@ -38,5 +39,12 @@ int main(void) {
return 0;
}
// DIGITAL IN init
ret = digital_in_init();
if (ret != 0) {
LOG_ERR("Failed to enable DIGITAL IN");
return 0;
}
return 0;
}