First implementation of digital input interrupt
This commit is contained in:
@@ -22,6 +22,7 @@ typedef enum {
|
|||||||
ADC_READ,
|
ADC_READ,
|
||||||
ADC_READ_ALL,
|
ADC_READ_ALL,
|
||||||
ADC_SET_READ,
|
ADC_SET_READ,
|
||||||
|
DIGITAL_IN,
|
||||||
|
|
||||||
// Keep last
|
// Keep last
|
||||||
NUM_COMMANDS,
|
NUM_COMMANDS,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "servo.h"
|
#include "servo.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
#include "digital_in.h"
|
||||||
|
|
||||||
#include <zephyr/logging/log.h>
|
#include <zephyr/logging/log.h>
|
||||||
LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
|
LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
|
||||||
@@ -38,5 +39,12 @@ int main(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DIGITAL IN init
|
||||||
|
ret = digital_in_init();
|
||||||
|
if (ret != 0) {
|
||||||
|
LOG_ERR("Failed to enable DIGITAL IN");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user