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);
}
}