White Papers
9
else if ( pin >= PIN_DI0 && pin <= PIN_DI5 )
chip_pin = pin - 14 + 8;
return chip_pin;
}
// TI TCA9555: chip-specfic data
#define TCA9555_REG_INPUT 0
#define TCA9555_REG_OUTPUT 2
#define TCA9555_REG_DIRECTION 6
#define GPIO_CAP_OUTPUT 1
#define GPIO_CAP_INPUT 2
#define GPIO_CAP_INOUT (GPIO_CAP_OUTPUT|GPIO_CAP_INPUT)
#define GPIO_MODE_UNKNOWN 0
#define GPIO_MODE_OUTPUT 1
#define GPIO_MODE_INPUT 2
typedef struct {
int capability;
int mode;
} gpio_pin;
typedef struct {
int fd;
gpio_pin pins[16];
} gpio_controller;
gpio_controller *gpio_initialize(char *platform)
{
gpio_controller *gc;
char *adapter_name = I2C_ADAPTER;
int slave_addr = TCA9555_ADDRESS;
int i, pin, rc;
gc = malloc(sizeof(*gc));
if ( !gc ) {
fprintf(stderr, "%s: no memory error\n", __FUNCTION__);
return NULL;
}
gc->fd = open(adapter_name, O_RDWR);
if ( gc->fd < 0 ) {
fprintf(stderr, "%s: failed to open i2c adapter file \"%s\": %s\n",
__FUNCTION__, adapter_name, strerror(errno));
goto exit_on_open_error;
}
if (ioctl(gc->fd, I2C_SLAVE, slave_addr) < 0) {
fprintf(stderr, "%s: failed to change slave address to 0x%X: %s\n",
__FUNCTION__, slave_addr, strerror(errno));
goto exit_on_ioctl_error;
}
// Setup controller-level pin variables
for ( i = 0 ; i < 16 ; i++ ) {
gc->pins[i].mode = GPIO_MODE_UNKNOWN;
gc->pins[i].capability = GPIO_CAP_INOUT;
}
// Apply board-level contraints to pins
// Pin 1~6 on connector are output pins
int bmp_dir = 0;
for ( i = PIN_DO0 ; i <= PIN_DO5 ; i++ ) {