summaryrefslogtreecommitdiffstats
path: root/testsuites/libtests/i2c01/init.c
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 /testsuites/libtests/i2c01/init.c
parentAdd NXP PCA9535 16-bit GPIO I2C driver (diff)
downloadrtems-0510cfd8edaa3cf44e7e2ec986b8d8be4f319769.tar.bz2
Add NXP PCA9548A 8-channel switch I2C driver
Diffstat (limited to '')
-rw-r--r--testsuites/libtests/i2c01/init.c80
1 files changed, 79 insertions, 1 deletions
diff --git a/testsuites/libtests/i2c01/init.c b/testsuites/libtests/i2c01/init.c
index e6f2eb3437..20059afd14 100644
--- a/testsuites/libtests/i2c01/init.c
+++ b/testsuites/libtests/i2c01/init.c
@@ -19,6 +19,7 @@
#include <dev/i2c/i2c.h>
#include <dev/i2c/eeprom.h>
#include <dev/i2c/gpio-nxp-pca9535.h>
+#include <dev/i2c/switch-nxp-pca9548a.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
@@ -42,6 +43,8 @@ const char rtems_test_name[] = "I2C 1";
#define DEVICE_GPIO_NXP_PCA9535 (2UL << SPARE_ADDRESS_BITS)
+#define DEVICE_SWITCH_NXP_PCA9548A (3UL << SPARE_ADDRESS_BITS)
+
#define EEPROM_SIZE 512
typedef struct test_device test_device;
@@ -73,12 +76,18 @@ typedef struct {
} test_device_eeprom;
typedef struct {
+ test_device base;
+ uint8_t control;
+} test_device_switch_nxp_pca9548a;
+
+typedef struct {
i2c_bus base;
unsigned long clock;
- test_device *devices[3];
+ test_device *devices[4];
test_device_simple_read_write simple_read_write;
test_device_gpio_nxp_pca9535 gpio_nxp_pca9535;
test_device_eeprom eeprom;
+ test_device_switch_nxp_pca9548a switch_nxp_pca9548a;
} test_bus;
static const char bus_path[] = "/dev/i2c-0";
@@ -87,6 +96,9 @@ static const char gpio_nxp_pca9535_path[] = "/dev/i2c-0.gpio-nxp-pc9535-0";
static const char eeprom_path[] = "/dev/i2c-0.eeprom-0";
+static const char switch_nxp_pca9548a_path[] =
+ "/dev/i2c-0.switch-nxp-pca9548a-0";
+
static void cyclic_inc(unsigned *val, unsigned cycle)
{
unsigned v = *val;
@@ -217,6 +229,34 @@ static int test_eeprom_transfer(
return 0;
}
+static int test_switch_nxp_pca9548a_transfer(
+ i2c_bus *bus,
+ i2c_msg *msgs,
+ uint32_t msg_count,
+ test_device *base
+)
+{
+ test_device_switch_nxp_pca9548a *dev = (test_device_switch_nxp_pca9548a *) base;
+ uint32_t i;
+
+ for (i = 0; i < msg_count; ++i) {
+ i2c_msg *msg = &msgs[i];
+ int j;
+
+ if ((msg->flags & I2C_M_RD) != 0) {
+ for (j = 0; j < msg->len; ++j) {
+ msg->buf[j] = dev->control;
+ }
+ } else {
+ for (j = 0; j < msg->len; ++j) {
+ dev->control = msg->buf[j];
+ }
+ }
+ }
+
+ return 0;
+}
+
static int test_transfer(i2c_bus *base, i2c_msg *msgs, uint32_t msg_count)
{
test_bus *bus = (test_bus *) base;
@@ -438,6 +478,40 @@ static void test_eeprom(void)
rtems_test_assert(rv == 0);
}
+static void test_switch_nxp_pca9548a(void)
+{
+ int rv;
+ int fd;
+ uint8_t val;
+
+ rv = i2c_dev_register_switch_nxp_pca9548a(
+ &bus_path[0],
+ &switch_nxp_pca9548a_path[0],
+ DEVICE_SWITCH_NXP_PCA9548A
+ );
+ rtems_test_assert(rv == 0);
+
+ fd = open(&switch_nxp_pca9548a_path[0], O_RDWR);
+ rtems_test_assert(fd >= 0);
+
+ rv = switch_nxp_pca9548a_get_control(fd, &val);
+ rtems_test_assert(rv == 0);
+ rtems_test_assert(val == 0);
+
+ rv = switch_nxp_pca9548a_set_control(fd, 0xa5);
+ rtems_test_assert(rv == 0);
+
+ rv = switch_nxp_pca9548a_get_control(fd, &val);
+ rtems_test_assert(rv == 0);
+ rtems_test_assert(val == 0xa5);
+
+ rv = close(fd);
+ rtems_test_assert(rv == 0);
+
+ rv = unlink(&switch_nxp_pca9548a_path[0]);
+ rtems_test_assert(rv == 0);
+}
+
static void test(void)
{
rtems_resource_snapshot snapshot;
@@ -465,6 +539,9 @@ static void test(void)
bus->gpio_nxp_pca9535.base.transfer = test_gpio_nxp_pca9535_transfer;
bus->devices[2] = &bus->gpio_nxp_pca9535.base;
+ bus->switch_nxp_pca9548a.base.transfer = test_switch_nxp_pca9548a_transfer;
+ bus->devices[3] = &bus->switch_nxp_pca9548a.base;
+
rv = i2c_bus_register(&bus->base, &bus_path[0]);
rtems_test_assert(rv == 0);
@@ -533,6 +610,7 @@ static void test(void)
test_simple_read_write(bus, fd);
test_eeprom();
test_gpio_nxp_pca9535();
+ test_switch_nxp_pca9548a();
rv = close(fd);
rtems_test_assert(rv == 0);