Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}