Changeset 67ac69fc in rtems for testsuites/libtests/i2c01


Ignore:
Timestamp:
Nov 7, 2014, 12:50:01 PM (5 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, master
Children:
0510cfd8
Parents:
cce46780
git-author:
Sebastian Huber <sebastian.huber@…> (11/07/14 12:50:01)
git-committer:
Sebastian Huber <sebastian.huber@…> (11/20/14 09:30:12)
Message:

Add NXP PCA9535 16-bit GPIO I2C driver

File:
1 edited

Legend:

Unmodified
Added
Removed
  • testsuites/libtests/i2c01/init.c

    rcce46780 r67ac69fc  
    1919#include <dev/i2c/i2c.h>
    2020#include <dev/i2c/eeprom.h>
     21#include <dev/i2c/gpio-nxp-pca9535.h>
    2122
    2223#include <sys/ioctl.h>
     
    3940
    4041#define DEVICE_EEPROM (1UL << SPARE_ADDRESS_BITS)
     42
     43#define DEVICE_GPIO_NXP_PCA9535 (2UL << SPARE_ADDRESS_BITS)
    4144
    4245#define EEPROM_SIZE 512
     
    6063typedef struct {
    6164  test_device base;
     65  unsigned current_reg;
     66  uint8_t regs[8];
     67} test_device_gpio_nxp_pca9535;
     68
     69typedef struct {
     70  test_device base;
    6271  unsigned current_address;
    6372  uint8_t data[EEPROM_SIZE];
     
    6776  i2c_bus base;
    6877  unsigned long clock;
    69   test_device *devices[2];
     78  test_device *devices[3];
    7079  test_device_simple_read_write simple_read_write;
     80  test_device_gpio_nxp_pca9535 gpio_nxp_pca9535;
    7181  test_device_eeprom eeprom;
    7282} test_bus;
    7383
    7484static const char bus_path[] = "/dev/i2c-0";
     85
     86static const char gpio_nxp_pca9535_path[] = "/dev/i2c-0.gpio-nxp-pc9535-0";
    7587
    7688static const char eeprom_path[] = "/dev/i2c-0.eeprom-0";
     
    104116    return -EIO;
    105117  }
     118}
     119
     120static int test_gpio_nxp_pca9535_transfer(
     121  i2c_bus *bus,
     122  i2c_msg *msgs,
     123  uint32_t msg_count,
     124  test_device *base
     125)
     126{
     127  test_device_gpio_nxp_pca9535 *dev = (test_device_gpio_nxp_pca9535 *) base;
     128  i2c_msg *first = &msgs[0];
     129  i2c_msg *second = &msgs[1];
     130  int i;
     131
     132  /* Get command byte */
     133  if (
     134    msg_count < 1
     135      || (first->flags & I2C_M_RD) != 0
     136      || first->len < 1
     137  ) {
     138    return -EIO;
     139  }
     140
     141  dev->current_reg = first->buf[0];
     142
     143  if (first->len > 1) {
     144    /* Write */
     145
     146    if (msg_count != 1) {
     147      return -EIO;
     148    }
     149
     150    for (i = 1; i < first->len; ++i) {
     151      dev->regs[dev->current_reg] = first->buf[i];
     152
     153      /* Output is input */
     154      if (dev->current_reg == 2) {
     155        dev->regs[0] = first->buf[i];
     156      } else if (dev->current_reg == 3) {
     157        dev->regs[1] = first->buf[i];
     158      }
     159
     160      cyclic_inc(&dev->current_reg, 2);
     161    }
     162  } else {
     163    /* Read */
     164
     165    if (msg_count != 2) {
     166      return -EIO;
     167    }
     168
     169    for (i = 0; i < second->len; ++i) {
     170      second->buf[i] = dev->regs[dev->current_reg];
     171      cyclic_inc(&dev->current_reg, 2);
     172    }
     173  }
     174
     175  return 0;
    106176}
    107177
     
    222292}
    223293
     294static void test_gpio_nxp_pca9535(void)
     295{
     296  int rv;
     297  int fd;
     298  uint16_t val;
     299
     300  rv = i2c_dev_register_gpio_nxp_pca9535(
     301    &bus_path[0],
     302    &gpio_nxp_pca9535_path[0],
     303    DEVICE_GPIO_NXP_PCA9535
     304  );
     305  rtems_test_assert(rv == 0);
     306
     307  fd = open(&gpio_nxp_pca9535_path[0], O_RDWR);
     308  rtems_test_assert(fd >= 0);
     309
     310  rv = gpio_nxp_pca9535_get_input(fd, &val);
     311  rtems_test_assert(rv == 0);
     312  rtems_test_assert(val == 0);
     313
     314  rv = gpio_nxp_pca9535_get_output(fd, &val);
     315  rtems_test_assert(rv == 0);
     316  rtems_test_assert(val == 0);
     317
     318  rv = gpio_nxp_pca9535_set_output(fd, 0xa5ef);
     319  rtems_test_assert(rv == 0);
     320
     321  rv = gpio_nxp_pca9535_get_input(fd, &val);
     322  rtems_test_assert(rv == 0);
     323  rtems_test_assert(val == 0xa5ef);
     324
     325  rv = gpio_nxp_pca9535_get_output(fd, &val);
     326  rtems_test_assert(rv == 0);
     327  rtems_test_assert(val == 0xa5ef);
     328
     329  rv = gpio_nxp_pca9535_clear_and_set_output(fd, 0x0ff0, 0x0170);
     330  rtems_test_assert(rv == 0);
     331
     332  rv = gpio_nxp_pca9535_get_polarity_inversion(fd, &val);
     333  rtems_test_assert(rv == 0);
     334  rtems_test_assert(val == 0);
     335
     336  rv = gpio_nxp_pca9535_set_polarity_inversion(fd, 0x5afe);
     337  rtems_test_assert(rv == 0);
     338
     339  rv = gpio_nxp_pca9535_get_config(fd, &val);
     340  rtems_test_assert(rv == 0);
     341  rtems_test_assert(val == 0);
     342
     343  rv = gpio_nxp_pca9535_set_config(fd, 0x2bcd);
     344  rtems_test_assert(rv == 0);
     345
     346  rv = gpio_nxp_pca9535_get_input(fd, &val);
     347  rtems_test_assert(rv == 0);
     348  rtems_test_assert(val == 0xa17f);
     349
     350  rv = gpio_nxp_pca9535_get_output(fd, &val);
     351  rtems_test_assert(rv == 0);
     352  rtems_test_assert(val == 0xa17f);
     353
     354  rv = gpio_nxp_pca9535_get_polarity_inversion(fd, &val);
     355  rtems_test_assert(rv == 0);
     356  rtems_test_assert(val == 0x5afe);
     357
     358  rv = gpio_nxp_pca9535_get_config(fd, &val);
     359  rtems_test_assert(rv == 0);
     360  rtems_test_assert(val == 0x2bcd);
     361
     362  rv = close(fd);
     363  rtems_test_assert(rv == 0);
     364
     365  rv = unlink(&gpio_nxp_pca9535_path[0]);
     366  rtems_test_assert(rv == 0);
     367}
     368
    224369static void test_eeprom(void)
    225370{
     
    318463  bus->devices[1] = &bus->eeprom.base;
    319464
     465  bus->gpio_nxp_pca9535.base.transfer = test_gpio_nxp_pca9535_transfer;
     466  bus->devices[2] = &bus->gpio_nxp_pca9535.base;
     467
    320468  rv = i2c_bus_register(&bus->base, &bus_path[0]);
    321469  rtems_test_assert(rv == 0);
     
    385533  test_simple_read_write(bus, fd);
    386534  test_eeprom();
     535  test_gpio_nxp_pca9535();
    387536
    388537  rv = close(fd);
Note: See TracChangeset for help on using the changeset viewer.