White Papers

10
pin = map_to_chip_pin(i);
gc->pins[pin].mode = GPIO_MODE_OUTPUT;
// we do not allow user to change mode so restrict the pin cap to
// be output only
gc->pins[pin].capability = GPIO_CAP_OUTPUT;
}
// Pin 14~19 on connector are input pins
for ( i = PIN_DI0 ; i <= PIN_DI5 ; i++ ) {
pin = map_to_chip_pin(i);
gc->pins[pin].mode = GPIO_MODE_INPUT;
bmp_dir |= (1 << pin);
// we do not allow user to change mode so restrict the pin cap to
// be input only
gc->pins[pin].capability = GPIO_CAP_INPUT;
}
if ( _smbus_write_word(gc->fd, TCA9555_REG_DIRECTION, bmp_dir) ) {
fprintf(stderr, "%s: failed to set pin directions", __FUNCTION__);
goto exit_on_access_error;
}
return gc;
exit_on_access_error:
exit_on_ioctl_error:
close(gc->fd);
exit_on_open_error:
free(gc);
return NULL;
}
void gpio_exit(gpio_controller *gc)
{
if ( gc == NULL )
return;
if ( gc->fd >= 0 ) {
close(gc->fd);
gc->fd = -1;
}
free(gc);
}
int gpio_pin_set_level(gpio_controller *gc, int pin, int level)
{
int rc, chip_pin;
__u16 bmp;
chip_pin = map_to_chip_pin(pin);
if ( chip_pin < 0 ) {
fprintf(stderr, "%s: pin number %d is invalid\n", __FUNCTION__, pin);
return -EINVAL;
}
if (gc->pins[chip_pin].mode != GPIO_MODE_OUTPUT) {
fprintf(stderr, "%s: pin %d not a output pin\n", __FUNCTION__, pin);
return -EINVAL;
}
rc = _smbus_read_word(gc->fd, TCA9555_REG_OUTPUT, &bmp);
if ( rc ) {
fprintf(stderr, "%s: failed to access controller\n", __FUNCTION__);