104 lines
2.3 KiB
C
104 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2021 metraTec GmbH
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file Header file for the MCP23Xxx driver.
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23XXX_H_
|
|
#define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23XXX_H_
|
|
|
|
#include <zephyr/kernel.h>
|
|
|
|
#include <zephyr/drivers/gpio.h>
|
|
#ifdef CONFIG_GPIO_MCP230XX
|
|
#include <zephyr/drivers/i2c.h>
|
|
#endif /* CONFIG_GPIO_MCP230XX */
|
|
#ifdef CONFIG_GPIO_MCP23SXX
|
|
#include <zephyr/drivers/spi.h>
|
|
#endif /* CONFIG_GPIO_MCP23SXX */
|
|
|
|
/* Register definitions */
|
|
#define REG_IODIR 0x00
|
|
#define REG_IPOL 0x01
|
|
#define REG_GPINTEN 0x02
|
|
#define REG_DEFVAL 0x03
|
|
#define REG_INTCON 0x04
|
|
#define REG_IOCON 0x05
|
|
#define REG_GPPU 0x06
|
|
#define REG_INTF 0x07
|
|
#define REG_INTCAP 0x08
|
|
#define REG_GPIO 0x09
|
|
#define REG_OLAT 0x0A
|
|
|
|
#define REG_IOCON_MIRROR BIT(6)
|
|
|
|
#define MCP23SXX_ADDR 0x40
|
|
#define MCP23SXX_READBIT 0x01
|
|
|
|
typedef int (*mcp23xxx_read_port_regs)(const struct device *dev, uint8_t reg, uint16_t *buf);
|
|
typedef int (*mcp23xxx_write_port_regs)(const struct device *dev, uint8_t reg, uint16_t value);
|
|
typedef int (*mcp23xxx_bus_is_ready)(const struct device *dev);
|
|
/** Configuration data */
|
|
struct mcp23xxx_config {
|
|
/* gpio_driver_config needs to be first */
|
|
struct gpio_driver_config config;
|
|
|
|
/** I2C device */
|
|
union {
|
|
#ifdef CONFIG_GPIO_MCP230XX
|
|
struct i2c_dt_spec i2c;
|
|
#endif /* CONFIG_GPIO_MCP230XX */
|
|
#ifdef CONFIG_GPIO_MCP23SXX
|
|
struct spi_dt_spec spi;
|
|
#endif /* CONFIG_GPIO_MCP23SXX */
|
|
} bus;
|
|
|
|
struct gpio_dt_spec gpio_int;
|
|
struct gpio_dt_spec gpio_reset;
|
|
|
|
uint8_t ngpios;
|
|
bool is_open_drain;
|
|
mcp23xxx_read_port_regs read_fn;
|
|
mcp23xxx_write_port_regs write_fn;
|
|
mcp23xxx_bus_is_ready bus_fn;
|
|
};
|
|
|
|
/** Runtime driver data */
|
|
struct mcp23xxx_drv_data {
|
|
/* gpio_driver_data needs to be first */
|
|
struct gpio_driver_data data;
|
|
|
|
struct k_sem lock;
|
|
sys_slist_t callbacks;
|
|
const struct device *dev;
|
|
struct gpio_callback int_gpio_cb;
|
|
struct k_work work;
|
|
|
|
uint16_t rising_edge_ints;
|
|
uint16_t falling_edge_ints;
|
|
|
|
struct {
|
|
uint16_t iodir;
|
|
uint16_t ipol;
|
|
uint16_t gpinten;
|
|
uint16_t defval;
|
|
uint16_t intcon;
|
|
uint16_t iocon;
|
|
uint16_t gppu;
|
|
uint16_t intf;
|
|
uint16_t intcap;
|
|
uint16_t gpio;
|
|
uint16_t olat;
|
|
} reg_cache;
|
|
};
|
|
|
|
extern const struct gpio_driver_api gpio_mcp23xxx_api_table;
|
|
|
|
int gpio_mcp23xxx_init(const struct device *dev);
|
|
|
|
#endif /* ZEPHYR_DRIVERS_GPIO_GPIO_MCP23XXX_H_ */
|