Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | /* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /* * @addtogroup test_aon_basic_operations * @{ * @defgroup t_aon_periodic_timer test_aon_periodic_timer * @brief TestPurpose: verify AON timer works well * @details * - Test Steps * -# Start AON timer and wait for the register change to propagate. * -# Set timer to alarm every second. * -# Sleep for a long time to wait for the alarm invoked. * - Expected Results * -# AON counter runs at 32768Hz, which means the counter will decrease * 32768 in one second. Set AONT down counter initial value register to * 32768, so the alarm will be invoked every second. * * Sleep for a little longer than 3 seconds, the timer ISR is expected * to be invoked 3 times. * @} */ #include "test_aon.h" #define ALARM_CNT 32768 /* about 1s */ #define SLEEP_TIME 3050 /* a little longer than 3s */ static volatile int actual_alarm_cnt; static void aon_timer_callback(struct device *dev, void *user_data) { TC_PRINT("Periodic timer callback invoked: %u\n", counter_read(dev)); /* verify counter_get_pending_int() */ if (counter_get_pending_int(dev)) { TC_PRINT("Counter interrupt is pending\n"); actual_alarm_cnt++; } } static int test_timer(void) { u32_t dummy_data = 30; int expected_alarm_cnt = 0; struct device *aon_timer = device_get_binding(AON_TIMER); if (!aon_timer) { TC_PRINT("Cannot get AON Timer device\n"); return TC_FAIL; } /* verify counter_start() */ if (counter_start(aon_timer)) { TC_PRINT("Fail to start AON Timer device\n"); return TC_FAIL; } /* * The AON counter runs from the RTC clock at 32KHz (rather than * the system clock which is 32MHz) so we need to spin for a few cycles * allow the register change to propagate. */ k_sleep(10); TC_PRINT("Always-on timer started\n"); /* verify counter_set_alarm() */ if (counter_set_alarm(aon_timer, aon_timer_callback, ALARM_CNT, (void *)&dummy_data)) { TC_PRINT("Fail to set alarm for AON Timer\n"); return TC_FAIL; } /* long delay for the alarm and callback to happen */ k_sleep(SLEEP_TIME); if (counter_set_alarm(aon_timer, NULL, 0, NULL)) { TC_PRINT("Periodic timer can not turn off\n"); return TC_FAIL; } expected_alarm_cnt = (SLEEP_TIME/1000) / (32768/ALARM_CNT); TC_PRINT("expected_alarm_cnt = %d\n", expected_alarm_cnt); TC_PRINT("actual_alarm_cnt = %d\n", actual_alarm_cnt); if (actual_alarm_cnt != expected_alarm_cnt) { TC_PRINT("actual_alarm_cnt doesn't match expected_alarm_cnt\n"); return TC_FAIL; } /* * arduino_101 loader assumes the counter is running. * If the counter is stopped, the next app you flash in * cannot start without a hard reset or power cycle. * So let's leave the counter in running state. */ return TC_PASS; } void test_aon_periodic_timer(void) { zassert_true(test_timer() == TC_PASS, NULL); } |