static mraa_result_t mraa_ftdi_ft4222_gpio_dir_replace(mraa_gpio_context dev, mraa_gpio_dir_t dir) { switch (dir) { case MRAA_GPIO_IN: if (mraa_ftdi_ft4222_is_internal_gpio(dev->pin)) return ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_INPUT); else return mraa_ftdi_ft4222_gpio_write_replace(dev, 1); case MRAA_GPIO_OUT: if (mraa_ftdi_ft4222_is_internal_gpio(dev->pin)) return ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT); else return MRAA_SUCCESS; case MRAA_GPIO_OUT_HIGH: if (mraa_ftdi_ft4222_is_internal_gpio(dev->pin)) { if (ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; } return mraa_ftdi_ft4222_gpio_write_replace(dev, 1); case MRAA_GPIO_OUT_LOW: if (mraa_ftdi_ft4222_is_internal_gpio(dev->pin)) { if (ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; } return mraa_ftdi_ft4222_gpio_write_replace(dev, 0); default: return MRAA_ERROR_INVALID_PARAMETER; } }
static mraa_result_t mraa_ftdi_ft4222_gpio_dir_replace(mraa_gpio_context dev, mraa_gpio_dir_t dir) { switch (mraa_ftdi_ft4222_get_gpio_type(dev->pin)) { case GPIO_TYPE_BUILTIN: switch (dir) { case MRAA_GPIO_IN: return ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_INPUT); case MRAA_GPIO_OUT: return ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT); case MRAA_GPIO_OUT_HIGH: if (ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 1); case MRAA_GPIO_OUT_LOW: if (ftdi_ft4222_set_internal_gpio_dir(dev->phy_pin, GPIO_OUTPUT) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 0); default: return MRAA_ERROR_INVALID_PARAMETER; } case GPIO_TYPE_PCA9672: switch (dir) { case MRAA_GPIO_IN: case MRAA_GPIO_OUT: return mraa_ftdi_ft4222_gpio_set_pca9672_dir(dev->phy_pin, dir); case MRAA_GPIO_OUT_HIGH: if (mraa_ftdi_ft4222_gpio_set_pca9672_dir(dev->phy_pin, dir) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 1); case MRAA_GPIO_OUT_LOW: if (mraa_ftdi_ft4222_gpio_set_pca9672_dir(dev->phy_pin, dir) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 0); default: return MRAA_ERROR_INVALID_PARAMETER; } case GPIO_TYPE_PCA9555: switch (dir) { case MRAA_GPIO_IN: case MRAA_GPIO_OUT: return mraa_ftdi_ft4222_gpio_set_pca9555_dir(dev->phy_pin, dir); case MRAA_GPIO_OUT_HIGH: if (mraa_ftdi_ft4222_gpio_set_pca9555_dir(dev->phy_pin, dir) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 1); case MRAA_GPIO_OUT_LOW: if (mraa_ftdi_ft4222_gpio_set_pca9555_dir(dev->phy_pin, dir) != MRAA_SUCCESS) return MRAA_ERROR_UNSPECIFIED; return mraa_ftdi_ft4222_gpio_write_replace(dev, 0); default: return MRAA_ERROR_INVALID_PARAMETER; } default: return MRAA_ERROR_INVALID_RESOURCE; } }
static mraa_result_t mraa_ftdi_ft4222_gpio_interrupt_handler_init_replace(mraa_gpio_context dev) { if (mraa_ftdi_ft4222_is_internal_gpio(dev->pin)) { mraa_ftdi_ft4222_has_internal_gpio_triggered(dev->phy_pin); } else { ftdi_ft4222_set_internal_gpio_dir(GPIO_PORT_IO_INT, GPIO_INPUT); ftdi_ft4222_set_internal_gpio_trigger(GPIO_PORT_IO_INT, GPIO_TRIGGER_FALLING); mraa_ftdi_ft4222_has_internal_gpio_triggered(GPIO_PORT_IO_INT); } return MRAA_SUCCESS; }
static mraa_result_t mraa_ftdi_ft4222_gpio_interrupt_handler_init_replace(mraa_gpio_context dev) { switch (mraa_ftdi_ft4222_get_gpio_type(dev->pin)) { case GPIO_TYPE_BUILTIN: mraa_ftdi_ft4222_has_internal_gpio_triggered(dev->phy_pin); break; case GPIO_TYPE_PCA9672: case GPIO_TYPE_PCA9555: ftdi_ft4222_set_internal_gpio_dir(GPIO_PORT_IO_INT, GPIO_INPUT); ftdi_ft4222_set_internal_gpio_trigger(GPIO_PORT_IO_INT, GPIO_TRIGGER_FALLING); mraa_ftdi_ft4222_has_internal_gpio_triggered(GPIO_PORT_IO_INT); mraa_ftdi_ft4222_gpio_monitor_add_pin(dev->phy_pin); break; } return MRAA_SUCCESS; }