/* * Copyright (c) 2018 Oticon A/S * * SPDX-License-Identifier: Apache-2.0 */ #ifndef _BSTESTS_ENTRY_H #define _BSTESTS_ENTRY_H #include "bs_types.h" #ifdef __cplusplus extern "C" { #endif /** * TEST HOOKS: * * You may register some of these functions in your testbench * * Note that you can overwrite this function pointers on the fly */ /* * Will be called with the command line arguments for the testcase. * This is BEFORE any SW has run, and before the HW has been initialized * This is also before a possible initialization delay. * Note that this function can be used for test pre-initialization steps * like opening the back-channels. But you should not interact yet with the * test ticker or other HW models. */ typedef void (*bst_test_args_t)(int, char**); /* It will be called (in the HW models thread) before the CPU is booted, * after the HW models have been initialized. Note that a possible delayed * initialization may delay the execution of this function vs other devices * tests pre-initialization */ typedef void (*bst_test_pre_init_t)(void); /* * It will be called (in the HW models thread) when the CPU goes to sleep * for the first time */ typedef void (*bst_test_post_init_t)(void); /* It will be called (in the HW models thread) each time the bst_timer ticks */ typedef void (*bst_test_tick_t)(bs_time_t time); /* * It will be called (in the HW models thread) when the execution is being * terminated (clean up memory and close your files here) */ typedef void (*bst_test_delete_t)(void); /* * It will be called (in SW context) when a HW interrupt is raised. * If it returns true, the normal interrupt handler will NOT be called and * Zephyr will only see a spurious wake * Note: Use this only to perform special tasks, like sniffing interrupts, * or any other interrupt related cheat, but not as a normal interrupt handler */ typedef bool (*bst_test_irq_sniffer_t)(int irq_number); /* * This function will be called (in SW context) as a Zephyr PRE_KERNEL_1 * device driver initialization function * Note that the app's main() has not executed yet, and the kernel is not yet * fully ready => You canNOT spawn new threads without wait time yet (or it * will crash) */ typedef void (*bst_test_fake_ddriver_prekernel_t)(void); /* * This function will be called (in SW context) as a Zephyr POST_KERNEL * device driver initialization function * You may spawn any test threads you may need here. * Note that the app main() has not executed yet. */ typedef void (*bst_test_fake_ddriver_postkernel_t)(void); /* * This function will be called (in SW context) as the Zephyr application main */ typedef void (*bst_test_main_t)(void); struct bst_test_instance { char *test_id; char *test_descr; bst_test_args_t test_args_f; bst_test_pre_init_t test_pre_init_f; bst_test_post_init_t test_post_init_f; bst_test_tick_t test_tick_f; bst_test_delete_t test_delete_f; bst_test_irq_sniffer_t test_irq_sniffer_f; bst_test_fake_ddriver_prekernel_t test_fake_ddriver_prekernel_f; bst_test_fake_ddriver_postkernel_t test_fake_ddriver_postkernel_f; bst_test_main_t test_main_f; }; #define BSTEST_END_MARKER \ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} struct bst_test_list { struct bst_test_instance *test_instance; struct bst_test_list *next; }; typedef struct bst_test_list *(*bst_test_install_t)(struct bst_test_list *test_tail); struct bst_test_list *bst_add_tests(struct bst_test_list *tests, const struct bst_test_instance *test_def); void bst_set_testapp_mode(char *test_id); void bst_pass_args(int argc, char **argv); void bst_pre_init(void); void bst_post_init(void); void bst_main(void); void bst_tick(bs_time_t Absolute_device_time); bool bst_irq_sniffer(int irq_number); uint8_t bst_delete(void); /* These return codes need to fit in a uint8_t (0..255), where 0 = successful */ enum bst_result_t {Passed = 0, In_progress = 1, Failed = 2}; void bst_print_testslist(void); /** * Interface for the fake HW device (timer) dedicated to the tests */ void bst_ticker_set_period(bs_time_t tick_period); void bst_ticker_set_next_tick_absolute(bs_time_t absolute_time); void bst_ticker_set_next_tick_delta(bs_time_t absolute_time); void bst_awake_cpu_asap(void); #ifdef __cplusplus } #endif #endif