summaryrefslogtreecommitdiffstats
path: root/cpukit/dev
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-11 12:41:58 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-20 10:30:17 +0100
commit0510cfd8edaa3cf44e7e2ec986b8d8be4f319769 (patch)
tree945f21efb4da1665d485c192b36fae00eccd146d /cpukit/dev
parentAdd NXP PCA9535 16-bit GPIO I2C driver (diff)
downloadrtems-0510cfd8edaa3cf44e7e2ec986b8d8be4f319769.tar.bz2
Add NXP PCA9548A 8-channel switch I2C driver
Diffstat (limited to 'cpukit/dev')
-rw-r--r--cpukit/dev/Makefile.am2
-rw-r--r--cpukit/dev/i2c/switch-nxp-pca9548a.c99
-rw-r--r--cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h68
-rw-r--r--cpukit/dev/preinstall.am4
4 files changed, 173 insertions, 0 deletions
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
+ * <rtems@embedded-brains.de>
+ *
+ * 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 <dev/i2c/switch-nxp-pca9548a.h>
+
+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
+ * <rtems@embedded-brains.de>
+ *
+ * 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 <dev/i2c/i2c.h>
+
+#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)