diff options
Diffstat (limited to 'cts/interrupt')
-rw-r--r-- | cts/interrupt/cts.testlist | 44 | ||||
-rw-r--r-- | cts/interrupt/dut.c | 184 | ||||
-rw-r--r-- | cts/interrupt/th.c | 78 |
3 files changed, 0 insertions, 306 deletions
diff --git a/cts/interrupt/cts.testlist b/cts/interrupt/cts.testlist deleted file mode 100644 index 0fdaf6fca2..0000000000 --- a/cts/interrupt/cts.testlist +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright 2016 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* Test interrupt_enable/disable */ -CTS_TEST(test_interrupt_enable,,,,) -CTS_TEST(test_interrupt_disable,,,,) - -/* Test task_wait_for_event */ -CTS_TEST(test_task_wait_event,,,,) - -/* Test task_disable_irq */ -CTS_TEST(test_task_disable_irq,,,,) - -/* Test nested interrupt. Lower priority IRQ is fired, followed by - * higher priority IRQ. Handler executions should be nested. - * - * P1 *-----* - * / \ - * P2 *----* *----* - * / \ - * task_cts ----* *---- - * A B C D - */ -CTS_TEST(test_nested_interrupt_low_high,,,,) - -/* Test nested interrupt. Higher priority IRQ is fired, followed by - * lower priority IRQ. Handlers should be executed sequentially. - * - * P1 *-----* - * / \ - * P2 / *-----* - * / \ - * task_cts ----* *---- - * B C A D - */ -CTS_TEST(test_nested_interrupt_high_low,,,,) - -/* - * Other ideas - * - * Test back-to-back interrupts, NVIC, Priorities - */
\ No newline at end of file diff --git a/cts/interrupt/dut.c b/cts/interrupt/dut.c deleted file mode 100644 index 3c83e5701f..0000000000 --- a/cts/interrupt/dut.c +++ /dev/null @@ -1,184 +0,0 @@ -/* Copyright 2016 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include <string.h> -#include "common.h" -#include "cts_common.h" -#include "gpio.h" -#include "registers.h" -#include "task.h" -#include "timer.h" -#include "watchdog.h" - -static int got_interrupt; -static int wake_me_up; -static int state_index; -static char state[4]; - -/* - * Raw busy loop. Returns 1 if loop finishes before interrupt is triggered. - * Loop length is controlled by busy_loop_timeout. It has to be set to the - * value which makes the loop last longer than CTS_INTERRUPT_TRIGGER_DELAY_US. - */ -static int busy_loop(void) -{ - /* TODO: Derive a proper value from clock speed */ - const uint32_t busy_loop_timeout = 0xfffff; - uint32_t counter = 0; - - while (counter++ < busy_loop_timeout) { - if (got_interrupt) - break; - watchdog_reload(); - } - if (counter > busy_loop_timeout) - return 1; - - return 0; -} - -/* - * Interrupt handler. - */ -void cts_irq1(enum gpio_signal signal) -{ - state[state_index++] = 'B'; - - got_interrupt = in_interrupt_context(); - - /* Wake up the CTS task */ - if (wake_me_up) - task_wake(TASK_ID_CTS); - - busy_loop(); - - state[state_index++] = 'C'; -} - -void cts_irq2(enum gpio_signal signal) -{ - state[state_index++] = 'A'; - busy_loop(); - state[state_index++] = 'D'; -} - -void clean_state(void) -{ - uint32_t *event; - - interrupt_enable(); - got_interrupt = 0; - wake_me_up = 0; - state_index = 0; - memset(state, '_', sizeof(state)); - event = task_get_event_bitmap(TASK_ID_CTS); - *event = 0; -} - -enum cts_rc test_task_wait_event(void) -{ - uint32_t event; - - wake_me_up = 1; - - /* Sleep and wait for interrupt. This shouldn't time out. */ - event = task_wait_event(CTS_INTERRUPT_TRIGGER_DELAY_US * 2); - if (event != TASK_EVENT_WAKE) { - CPRINTS("Woken up by unexpected event: 0x%08x", event); - return CTS_RC_FAILURE; - } - if (!got_interrupt) { - CPRINTS("Interrupt context not detected"); - return CTS_RC_TIMEOUT; - } - - return CTS_RC_SUCCESS; -} - -enum cts_rc test_task_disable_irq(void) -{ - uint32_t event; - - wake_me_up = 1; - - task_disable_irq(CTS_IRQ_NUMBER); - /* Sleep and wait for interrupt. This should time out. */ - event = task_wait_event(CTS_INTERRUPT_TRIGGER_DELAY_US * 2); - if (event != TASK_EVENT_TIMER) { - CPRINTS("Woken up by unexpected event: 0x%08x", event); - return CTS_RC_FAILURE; - } - task_enable_irq(CTS_IRQ_NUMBER); - - return CTS_RC_SUCCESS; -} - -enum cts_rc test_interrupt_enable(void) -{ - if (busy_loop()) { - CPRINTS("Timeout before interrupt"); - return CTS_RC_TIMEOUT; - } - return CTS_RC_SUCCESS; -} - -enum cts_rc test_interrupt_disable(void) -{ - interrupt_disable(); - if (!busy_loop()) { - CPRINTS("Expected timeout but didn't"); - return CTS_RC_FAILURE; - } - return CTS_RC_SUCCESS; -} - -enum cts_rc test_nested_interrupt_low_high(void) -{ - uint32_t event; - - event = task_wait_event(CTS_INTERRUPT_TRIGGER_DELAY_US * 4); - if (event != TASK_EVENT_TIMER) { - CPRINTS("Woken up by unexpected event: 0x%08x", event); - return CTS_RC_FAILURE; - } - if (!got_interrupt) { - CPRINTS("Interrupt context not detected"); - return CTS_RC_TIMEOUT; - } - if (memcmp(state, "ABCD", sizeof(state))) { - CPRINTS("State transition differs from expectation"); - return CTS_RC_FAILURE; - } - - return CTS_RC_SUCCESS; -} - -enum cts_rc test_nested_interrupt_high_low(void) -{ - uint32_t event; - - event = task_wait_event(CTS_INTERRUPT_TRIGGER_DELAY_US * 4); - if (event != TASK_EVENT_TIMER) { - CPRINTS("Woken up by unexpected event: 0x%08x", event); - return CTS_RC_FAILURE; - } - - if (memcmp(state, "BCAD", sizeof(state))) { - CPRINTS("State transition differs from expectation"); - return CTS_RC_FAILURE; - } - - return CTS_RC_SUCCESS; -} - -#include "cts_testlist.h" - -void cts_task(void) -{ - gpio_enable_interrupt(GPIO_CTS_IRQ1); - gpio_enable_interrupt(GPIO_CTS_IRQ2); - cts_main_loop(tests, "Interrupt"); - task_wait_event(-1); -} diff --git a/cts/interrupt/th.c b/cts/interrupt/th.c deleted file mode 100644 index 1639a1868c..0000000000 --- a/cts/interrupt/th.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright 2016 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "common.h" -#include "cts_common.h" -#include "gpio.h" -#include "task.h" -#include "timer.h" -#include "watchdog.h" - -void clean_state(void) -{ - gpio_set_level(GPIO_OUTPUT_TEST, 1); - gpio_set_level(GPIO_CTS_IRQ2, 1); -} - -static void trigger_interrupt1(void) -{ - usleep(CTS_INTERRUPT_TRIGGER_DELAY_US); - gpio_set_level(GPIO_OUTPUT_TEST, 0); - usleep(CTS_INTERRUPT_TRIGGER_DELAY_US); -} - -static void trigger_interrupt2(void) -{ - usleep(CTS_INTERRUPT_TRIGGER_DELAY_US); - gpio_set_level(GPIO_CTS_IRQ2, 0); - usleep(CTS_INTERRUPT_TRIGGER_DELAY_US); -} - -enum cts_rc test_task_wait_event(void) -{ - trigger_interrupt1(); - return CTS_RC_SUCCESS; -} - -enum cts_rc test_task_disable_irq(void) -{ - trigger_interrupt1(); - return CTS_RC_SUCCESS; -} - -enum cts_rc test_interrupt_enable(void) -{ - trigger_interrupt1(); - return CTS_RC_SUCCESS; -} - -enum cts_rc test_interrupt_disable(void) -{ - trigger_interrupt1(); - return CTS_RC_SUCCESS; -} - -enum cts_rc test_nested_interrupt_low_high(void) -{ - trigger_interrupt2(); - trigger_interrupt1(); - return CTS_RC_SUCCESS; -} - -enum cts_rc test_nested_interrupt_high_low(void) -{ - trigger_interrupt1(); - trigger_interrupt2(); - return CTS_RC_SUCCESS; -} - -#include "cts_testlist.h" - -void cts_task(void) -{ - gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_HIGH); - cts_main_loop(tests, "Interrupt"); - task_wait_event(-1); -} |