You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.3 KiB
103 lines
2.3 KiB
/* |
|
* 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_ */
|
|
|