INT2 working but INT1 is not

Please find below my config for handling Interrupt calls.

I've tested on another sensor dev board that the sensor I use is properly set up and is sending INT1 and INT2. 

I also tried switching the outputs of the sensor and when I did so I got a response on INT2 (that should have been triggered on INT1) and vice versa. 

I also tried switching the INT pins in the device tree and that worked.

I cant seem to get INT1 to work while int@ works as desired. The configuration is the same, there are no conflicts in any error messages or device tree.

	buttons {
		compatible = "gpio-keys";
		button1: button_1 {
			gpios = <&gpio1 13 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button 2";
		};
		int1: int_1 {
			status = "okay";
			gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
			label = "interrupt 1";
		};
		int2: int_2 {
			status = "okay";
			gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
			label = "interrupt 2";
		};
	};


#define INT1_NODE            DT_ALIAS(int1)
#define INT1_GPIO_CONTROLLER DEVICE_DT_GET(DT_GPIO_CTLR(INT1_NODE, gpios))
#define INT1_GPIO_PIN        DT_GPIO_PIN(INT1_NODE, gpios)
#define INT1_GPIO_FLAGS      (DT_GPIO_FLAGS(INT1_NODE, gpios) | GPIO_INPUT)

#define INT2_NODE            DT_ALIAS(int2)
#define INT2_GPIO_CONTROLLER DEVICE_DT_GET(DT_GPIO_CTLR(INT2_NODE, gpios))
#define INT2_GPIO_PIN        DT_GPIO_PIN(INT2_NODE, gpios)
#define INT2_GPIO_FLAGS      (DT_GPIO_FLAGS(INT2_NODE, gpios) | GPIO_INPUT)


struct k_work idleDetected_work;
struct k_work int1_work;

void idleDetected_work_handler(struct k_work* item) {
  printk("Idle detected\n");
}

void int1_work_handler(struct k_work* item) {
  printk("INT2\n");
}

void int1_callback(const struct device* dev, struct gpio_callback* cb, uint32_t pins) {
  k_work_submit(&idleDetected_work);
}

void int2_callback(const struct device* dev, struct gpio_callback* cb, uint32_t pins) {
  k_work_submit(&int1_work);
}

int configure_gpio(const struct device* gpio_dev, gpio_pin_t pin, gpio_flags_t flags) {
  int ret;

  /* Ensure the GPIO device is ready */
  if (!device_is_ready(gpio_dev)) {
    printk("Error: %s device not ready\n", gpio_dev->name);
    return -1;
  }

  /* Configure the GPIO pin */
  ret = gpio_pin_configure(gpio_dev, pin, flags);
  if (ret != 0) {
    printk("Failed to configure GPIO pin %d: %d\n", pin, ret);
    return ret;
  }

  /* Configure the GPIO pin interrupt */
  ret = gpio_pin_interrupt_configure(gpio_dev, pin, GPIO_INT_EDGE_TO_ACTIVE);
  if (ret != 0) {
    printk("Failed to configure GPIO pin interrupt %d: %d\n", pin, ret);
    return ret;
  }

  return 0;
}

int setup_gpio_callback(const struct device* gpio_dev, gpio_pin_t pin, struct gpio_callback* cb, gpio_callback_handler_t handler) {
  int ret;

  /* Initialize and add the GPIO callback */
  gpio_init_callback(cb, handler, BIT(pin));
  ret = gpio_add_callback(gpio_dev, cb);
  if (ret != 0) {
    printk("Failed to add GPIO callback for pin %d: %d\n", pin, ret);
    return ret;
  }

  return 0;
}

int setup_irq_init(const struct i2c_dt_spec* dev) {
  int status;

  status = configure_gpio(INT1_GPIO_CONTROLLER, INT1_GPIO_PIN, INT1_GPIO_FLAGS);
  check_error(status, "configure_gpio1");

  status = setup_gpio_callback(INT1_GPIO_CONTROLLER, INT1_GPIO_PIN, &int1_cb_data, int1_callback);
  check_error(status, "setup_gpio_callback1");

  status = configure_gpio(INT2_GPIO_CONTROLLER, INT2_GPIO_PIN, INT2_GPIO_FLAGS);
  check_error(status, "configure_gpio2");

  status = setup_gpio_callback(INT2_GPIO_CONTROLLER, INT2_GPIO_PIN, &int2_cb_data, int2_callback);
  check_error(status, "setup_gpio_callback2");

  k_work_init(&int1_work, int1_work_handler);
  k_work_init(&idleDetected_work, idleDetected_work_handler);

  return 0; // Success
}

What am I doing wrong?

Related