131 lines
4.3 KiB
C
131 lines
4.3 KiB
C
/*
|
|
* 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
|