static mraa_result_t mraa_ftdi_ft4222_gpio_wait_interrupt_replace(mraa_gpio_context dev) { int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev); mraa_boolean_t is_internal_pin = mraa_ftdi_ft4222_is_internal_gpio(dev->pin); mraa_boolean_t interrupt_detected = FALSE; // INT pin of i2c PCA9672 GPIO expander is connected to FT4222 GPIO #3 // We use INT to detect any expander GPIO level change while (!dev->isr_thread_terminating && !interrupt_detected) { if (is_internal_pin) { interrupt_detected = mraa_ftdi_ft4222_has_internal_gpio_triggered(dev->phy_pin); } else { mraa_boolean_t gpio_activity_detected = mraa_ftdi_ft4222_has_internal_gpio_triggered(GPIO_PORT_IO_INT); if (gpio_activity_detected) { int level = mraa_ftdi_ft4222_gpio_read_replace(dev); if (level != prev_level) { interrupt_detected = TRUE; } } } if (!interrupt_detected) mraa_ftdi_ft4222_sleep_ms(20); } return MRAA_SUCCESS; }
static void* mraa_ftdi_ft4222_gpio_interrupt_handler_replace(mraa_gpio_context dev) { int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev); while (1) { int level = mraa_ftdi_ft4222_gpio_read_replace(dev); if (level != prev_level) { dev->isr(dev->isr_args); prev_level = level; } // printf("mraa_ftdi_ft4222_gpio_interrupt_handler_replace\n"); mraa_ftdi_ft4222_sleep_ms(100); } return NULL; }
static mraa_result_t mraa_ftdi_ft4222_gpio_wait_interrupt_replace(mraa_gpio_context dev) { int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev); ft4222_gpio_type gpio_type = mraa_ftdi_ft4222_get_gpio_type(dev->pin); mraa_boolean_t interrupt_detected = FALSE; while (!dev->isr_thread_terminating && !interrupt_detected) { switch (gpio_type) { case GPIO_TYPE_BUILTIN: interrupt_detected = mraa_ftdi_ft4222_has_internal_gpio_triggered(dev->phy_pin); break; case GPIO_TYPE_PCA9672: case GPIO_TYPE_PCA9555: interrupt_detected = mraa_ftdi_ft4222_gpio_monitor_is_interrupt_detected(dev->phy_pin); break; default:; } if (!interrupt_detected) mraa_ftdi_ft4222_sleep_ms(20); } if (dev->isr_thread_terminating) mraa_ftdi_ft4222_gpio_monitor_remove_pin(dev->phy_pin); return MRAA_SUCCESS; }
static void* mraa_ftdi_ft4222_gpio_interrupt_handler_replace(mraa_gpio_context dev) { #ifdef USE_FT4222_GPIO_TRIGGER // FIXME: Use big buffer; shouldn't be more than this many events to read GPIO_Trigger event_buf[256]; int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev); while (1) { uint16 num_events = 0; FT4222_STATUS status = FT4222_GPIO_GetTriggerStatus(ftHandleGpio, GPIO_PORT_IO_STATUS, &num_events); if (status != FT4222_OK) printf("FT4222_GPIO_GetTriggerStatus failed with code %d\n", status); printf("%u: FT4222_GPIO_GetTriggerStatus Events = %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), num_events); if (num_events > 0) { int level = mraa_ftdi_ft4222_gpio_read_replace(dev); uint16 num_events_read; FT4222_GPIO_ReadTriggerQueue(ftHandleGpio, GPIO_PORT_IO_STATUS, event_buf, num_events, &num_events_read); // printf("%u: FT4222_GPIO_ReadTriggerQueue Events= %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), num_events_read); printf("%u: level = %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), level); if (level != prev_level) { dev->isr(dev->isr_args); prev_level = level; } } mraa_ftdi_ft4222_sleep_ms(20); // int level = mraa_ftdi_ft4222_gpio_read_replace(dev); // printf("level = %d\n", level); } #else int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev); while (1) { int level = mraa_ftdi_ft4222_gpio_read_replace(dev); // MRAA_GPIO_EDGE_BOTH if (level != prev_level) { dev->isr(dev->isr_args); prev_level = level; } mraa_ftdi_ft4222_sleep_ms(100); } #endif return NULL; }