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/i2c/switch-nxp-pca9548a.c | 99 ++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 cpukit/dev/i2c/switch-nxp-pca9548a.c (limited to 'cpukit/dev/i2c') 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); +} -- cgit v1.2.3