|  | /* | 
|  | * 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 |