zephyr/drivers/gpio/gpio_mcp23xxx.h

91 lines
2.0 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 <kernel.h>
#include <drivers/gpio.h>
#ifdef CONFIG_GPIO_MCP230XX
#include <drivers/i2c.h>
#endif /* CONFIG_GPIO_MCP230XX */
#ifdef CONFIG_GPIO_MCP23SXX
#include <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_IKAT 0x0A
#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;
uint8_t ngpios;
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;
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_ */