From 0510cfd8edaa3cf44e7e2ec986b8d8be4f319769 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 11 Nov 2014 12:41:58 +0100 Subject: Add NXP PCA9548A 8-channel switch I2C driver --- cpukit/dev/Makefile.am | 2 + cpukit/dev/i2c/switch-nxp-pca9548a.c | 99 ++++++++++++++++++++++++ cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h | 68 ++++++++++++++++ cpukit/dev/preinstall.am | 4 + 4 files changed, 173 insertions(+) create mode 100644 cpukit/dev/i2c/switch-nxp-pca9548a.c create mode 100644 cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h (limited to 'cpukit/dev') diff --git a/cpukit/dev/Makefile.am b/cpukit/dev/Makefile.am index 93737f987a..47a158511c 100644 --- a/cpukit/dev/Makefile.am +++ b/cpukit/dev/Makefile.am @@ -9,6 +9,7 @@ include_dev_i2c_HEADERS = include_dev_i2c_HEADERS += include/dev/i2c/eeprom.h include_dev_i2c_HEADERS += include/dev/i2c/gpio-nxp-pca9535.h include_dev_i2c_HEADERS += include/dev/i2c/i2c.h +include_dev_i2c_HEADERS += include/dev/i2c/switch-nxp-pca9548a.h include_linuxdir = $(includedir)/linux include_linux_HEADERS = @@ -22,6 +23,7 @@ libdev_a_SOURCES += i2c/eeprom.c libdev_a_SOURCES += i2c/gpio-nxp-pca9535.c libdev_a_SOURCES += i2c/i2c-bus.c libdev_a_SOURCES += i2c/i2c-dev.c +libdev_a_SOURCES += i2c/switch-nxp-pca9548a.c include $(srcdir)/preinstall.am include $(top_srcdir)/automake/local.am diff --git a/cpukit/dev/i2c/switch-nxp-pca9548a.c b/cpukit/dev/i2c/switch-nxp-pca9548a.c new file mode 100644 index 0000000000..50e546fd47 --- /dev/null +++ b/cpukit/dev/i2c/switch-nxp-pca9548a.c @@ -0,0 +1,99 @@ +/** + * @file + * + * @brief Switch NXP PCA9548A Driver Implementation + * + * @ingroup I2CSWITCHNXPPCA9548A + */ + +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include + +static int switch_nxp_pca9548a_do_get_control( + i2c_dev *dev, + uint8_t *val +) +{ + i2c_msg msg = { + .addr = dev->address, + .flags = I2C_M_RD, + .len = (uint16_t) sizeof(*val), + .buf = val + }; + + return i2c_bus_transfer(dev->bus, &msg, 1); +} + +static int switch_nxp_pca9548a_do_set_control( + i2c_dev *dev, + uint8_t val +) +{ + i2c_msg msg = { + .addr = dev->address, + .flags = 0, + .len = (uint16_t) sizeof(val), + .buf = &val + }; + + return i2c_bus_transfer(dev->bus, &msg, 1); +} + +static int switch_nxp_pca9548a_ioctl( + i2c_dev *dev, + ioctl_command_t command, + void *arg +) +{ + uint8_t v8 = (uint8_t)(uintptr_t) arg; + int err; + + switch (command) { + case SWITCH_NXP_PCA9548A_GET_CONTROL: + err = switch_nxp_pca9548a_do_get_control(dev, arg); + break; + case SWITCH_NXP_PCA9548A_SET_CONTROL: + err = switch_nxp_pca9548a_do_set_control(dev, v8); + break; + default: + err = -ENOTTY; + break; + } + + return err; +} + +int i2c_dev_register_switch_nxp_pca9548a( + const char *bus_path, + const char *dev_path, + uint16_t address +) +{ + i2c_dev *dev; + + dev = i2c_dev_alloc_and_init(sizeof(*dev), bus_path, address); + if (dev == NULL) { + return -1; + } + + dev->ioctl = switch_nxp_pca9548a_ioctl; + + return i2c_dev_register(dev, dev_path); +} diff --git a/cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h b/cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h new file mode 100644 index 0000000000..ce8ef2c809 --- /dev/null +++ b/cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h @@ -0,0 +1,68 @@ +/** + * @file + * + * @brief Switch NXP PCA9548A Driver API + * + * @ingroup I2CSWITCHNXPPCA9548A + */ + +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef _DEV_I2C_SWITCH_NXP_PCA9548A_H +#define _DEV_I2C_SWITCH_NXP_PCA9548A_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup I2CSWITCHNXPPCA9548A Switch NXP PCA9535 Driver + * + * @ingroup I2CDevice + * + * @brief Driver for NXP PCA9548A 8-channel switch device. + * + * @{ + */ + +int i2c_dev_register_switch_nxp_pca9548a( + const char *bus_path, + const char *dev_path, + uint16_t address +); + +#define SWITCH_NXP_PCA9548A_GET_CONTROL (I2C_DEV_IO_CONTROL + 0) + +#define SWITCH_NXP_PCA9548A_SET_CONTROL (I2C_DEV_IO_CONTROL + 1) + +static inline int switch_nxp_pca9548a_get_control(int fd, uint8_t *val) +{ + return ioctl(fd, SWITCH_NXP_PCA9548A_GET_CONTROL, val); +} + +static inline int switch_nxp_pca9548a_set_control(int fd, uint8_t val) +{ + return ioctl(fd, SWITCH_NXP_PCA9548A_SET_CONTROL, (void *)(uintptr_t) val); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _DEV_I2C_SWITCH_NXP_PCA9548A_H */ diff --git a/cpukit/dev/preinstall.am b/cpukit/dev/preinstall.am index 28e361b5e5..f73107b209 100644 --- a/cpukit/dev/preinstall.am +++ b/cpukit/dev/preinstall.am @@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/dev/i2c/i2c.h: include/dev/i2c/i2c.h $(PROJECT_INCLUDE)/dev/i $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/dev/i2c/i2c.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/dev/i2c/i2c.h +$(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h: include/dev/i2c/switch-nxp-pca9548a.h $(PROJECT_INCLUDE)/dev/i2c/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h + $(PROJECT_INCLUDE)/linux/$(dirstamp): @$(MKDIR_P) $(PROJECT_INCLUDE)/linux @: > $(PROJECT_INCLUDE)/linux/$(dirstamp) -- cgit v1.2.3