Files
hexdec/servo_controller/src/digital_in.c
T
2026-10-02 13:08:52 +03:00

65 lines
1.6 KiB
C

#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 -ENODEV;
}
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;
}