White Papers

8
APPENDIX: FULL SOURCE CODE OF AN EXAMPLE PROGRAM
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <fcntl.h>
// Embedded PC 3000: board-specific data and functions
#define I2C_ADAPTER "/dev/i2c-7"
#define TCA9555_ADDRESS 0x20
#define PIN_DO0 1
#define PIN_DO5 6
#define PIN_DI0 14
#define PIN_DI5 19
static int _smbus_write_word(int fd, int reg, __u16 word)
{
union i2c_smbus_data data;
struct i2c_smbus_ioctl_data ioctl_data;
int rc;
ioctl_data.read_write = I2C_SMBUS_WRITE;
ioctl_data.command = reg;
ioctl_data.size = I2C_SMBUS_WORD_DATA;
ioctl_data.data = &data;
data.word = word;
rc = ioctl(fd, I2C_SMBUS, &ioctl_data);
if (rc)
fprintf(stderr, "Failed to write word to SMBUS: %s\n", strerror(errno));
return rc;
}
static int _smbus_read_word(int fd, int reg, __u16 *word)
{
union i2c_smbus_data data;
struct i2c_smbus_ioctl_data ioctl_data;
int rc;
ioctl_data.read_write = I2C_SMBUS_READ;
ioctl_data.command = reg;
ioctl_data.size = I2C_SMBUS_WORD_DATA;
ioctl_data.data = &data;
rc = ioctl(fd, I2C_SMBUS, &ioctl_data);
if (rc)
fprintf(stderr, "Failed to read word from SMBUS: %s\n", strerror(errno));
else
*word = data.word;
return rc;
}
static int map_to_chip_pin(int pin)
{
// "pin" specifies the pin number on connector
int chip_pin = -1;
if ( pin >= PIN_DO0 && pin <= PIN_DO5 )
chip_pin = pin - 1;