I want to use several GPIOs for different purposes.
for example,
- motion detection interrupt by accelerometer
- low battery alert interrupt by battery gauge.
However, it doesn't work. Any help?
This is my code below. When I configure second GPIO in the line of gpio_fake_interrupt = device_get_binding("GPIO_1"), it causes error. Why?
#include <zephyr.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <gpio.h> #include <i2c.h> #include <device.h> /* for accelerometer */ #define I2C_ACCEL_ADDR (0x32 >> 1) #define GPIO_IN_ACCEL_INT GPIO_OUT_PIN11_Pos #define DEV "dev" struct device *i2c_accel; struct device *gpio_accel_interrupt; struct gpio_callback gpio_cb; bool is_move = false; void accel_interrupt(struct device *gpio, struct gpio_callback *cb, u32_t pins) { is_move = true; } u8_t init_accelerometer() { i2c_accel = device_get_binding("I2C_1"); if (!i2c_accel) { return -1; } /* Configure accelerometer */ . . /* end */ return 0; } u8_t init_accel_interrupt_gpio() { int8_t ret; gpio_accel_interrupt = device_get_binding("GPIO_0"); if (!gpio_accel_interrupt) { printk("gpio_accel_interrupt init error\r\n"); return -1; } ret = gpio_pin_configure(gpio_accel_interrupt, GPIO_IN_ACCEL_INT, (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH)); if (ret) { printk("Error configuring %lu!\n", GPIO_IN_ACCEL_INT); return -1; } gpio_init_callback(&gpio_cb, accel_interrupt, BIT(GPIO_IN_ACCEL_INT)); ret = gpio_add_callback(gpio_accel_interrupt, &gpio_cb); if (ret){ printk("Cannot setup callback!\n"); return -1; } ret = gpio_pin_enable_callback(gpio_accel_interrupt, GPIO_IN_ACCEL_INT); if (ret){ printk("Error enabling callback!\n"); return -1; } return 0; } #if defined(DEV) #define GPIO_IN_FAKE_INT GPIO_OUT_PIN18_Pos struct device *gpio_fake_interrupt; struct gpio_callback gpio_fake_cb; void fake_interrupt(struct device *gpio, struct gpio_callback *cb, u32_t pins) { printk("fake_interrupt\r\n"); } u8_t init_fake_interrupt_gpio() { int8_t ret; gpio_fake_interrupt = device_get_binding("GPIO_1"); if (!gpio_fake_interrupt) { printk("gpio_fake_interrupt init error\r\n"); // ERROR OCCURS HERE !!! return -1; } ret = gpio_pin_configure(gpio_fake_interrupt, GPIO_IN_FAKE_INT, (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH)); if (ret) { printk("Error configuring %lu! gpio_fake_interrupt\n", GPIO_IN_FAKE_INT); return -1; } gpio_init_callback(&gpio_fake_cb, fake_interrupt, BIT(GPIO_IN_FAKE_INT)); ret = gpio_add_callback(gpio_fake_interrupt, &gpio_fake_cb); if (ret){ printk("Cannot setup callback! gpio_fake_interrupt\n"); return -1; } ret = gpio_pin_enable_callback(gpio_fake_interrupt, GPIO_IN_FAKE_INT); if (ret){ printk("Error enabling callback! gpio_fake_interrupt\n"); return -1; } return 0; } #endif void main(void) { if(init_accelerometer() != 0) { sys_reboot(); } if (init_accel_interrupt_gpio() != 0) { sys_reboot(); } #if defined(DEV) if (init_fake_interrupt_gpio() != 0) { printk("init_fake_interrupt_gpio fails!); } #endif while (1) { k_cpu_idle(); printk("is_move = %u\n", is_move); } }