diff options
author | Pete Johanson <peter@peterjohanson.com> | 2021-01-28 22:54:44 -0500 |
---|---|---|
committer | Pete Johanson <peter@peterjohanson.com> | 2021-09-14 20:48:28 -0400 |
commit | 647110e5e5adef98a133f5f65b212110e614309b (patch) | |
tree | 2295ff9a2135fc495db41da977459b1a86f19380 /app/drivers/gpio/gpio_mcp23017.h | |
parent | 2f0ad4cc8c7c4a4b0344206bce638a8241b85b95 (diff) |
feat(drivers): Add mcp23017 driver based on upstream mcp23s17 one.
* Upstream Zephyr has in progress driver, so doing this locally here,
until we can move over to that driver.
Diffstat (limited to 'app/drivers/gpio/gpio_mcp23017.h')
-rw-r--r-- | app/drivers/gpio/gpio_mcp23017.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h new file mode 100644 index 0000000..026565c --- /dev/null +++ b/app/drivers/gpio/gpio_mcp23017.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Geanix ApS, Pete Johanson + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file Header file for the MCP23017 driver. + */ + +#ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ +#define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ + +#include <kernel.h> + +#include <drivers/gpio.h> +#include <drivers/i2c.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* Register definitions */ +#define REG_IODIR_PORTA 0x00 +#define REG_IODIR_PORTB 0x01 +#define REG_IPOL_PORTA 0x02 +#define REG_IPOL_PORTB 0x03 +#define REG_GPINTEN_PORTA 0x04 +#define REG_GPINTEN_PORTB 0x05 +#define REG_DEFVAL_PORTA 0x06 +#define REG_DEFVAL_PORTB 0x07 +#define REG_INTCON_PORTA 0x08 +#define REG_INTCON_PORTB 0x09 +#define REG_GPPU_PORTA 0x0C +#define REG_GPPU_PORTB 0x0D +#define REG_INTF_PORTA 0x0E +#define REG_INTF_PORTB 0x0F +#define REG_INTCAP_PORTA 0x10 +#define REG_INTCAP_PORTB 0x11 +#define REG_GPIO_PORTA 0x12 +#define REG_GPIO_PORTB 0x13 +#define REG_OLAT_PORTA 0x14 +#define REG_OLAT_PORTB 0x15 + +#define MCP23017_ADDR 0x40 +#define MCP23017_READBIT 0x01 + +/** Configuration data */ +struct mcp23017_config { + /* gpio_driver_data needs to be first */ + struct gpio_driver_config common; + + const char *const i2c_dev_name; + const uint16_t slave; +}; + +/** Runtime driver data */ +struct mcp23017_drv_data { + /* gpio_driver_data needs to be first */ + struct gpio_driver_config data; + + /** Master SPI device */ + const struct device *i2c; + + 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; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ */ |