summaryrefslogtreecommitdiffstats
path: root/cpukit/dev/i2c
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/i2c
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/i2c')
-rw-r--r--cpukit/dev/i2c/switch-nxp-pca9548a.c99
1 files changed, 99 insertions, 0 deletions
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);
+}