/** **************************************************************************************************** * Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved. **************************************************************************************************** * @file test_mode.h * @brief test mode definition. * @author Serval Li * @date 2017-08-29 * @version v1.0 **************************************************************************************************** */ #ifndef _TEST_MODE_H_ #define _TEST_MODE_H_ #include #include #include "rtl876x.h" #include "rtl876x_wdg.h" #include "patch_header_check.h" #include "flash_device.h" #include "trace.h" #ifdef __cplusplus extern "C" { #endif /** @defgroup TEST_MODE Test Mode * @{ */ /*============================================================================* * Macros *============================================================================*/ /** @defgroup TEST_MODE_Exported_Macros Test Mode Exported Macros * @brief * @{ */ /* ascii value of "test" */ #define TEST_MODE_FLAG_DEFAULT 0x74657374 #define TEST_MODE_FLAG_DISABLE 0x50245150 /* General Purpose FW register */ #define BTAON_FAST_TEST_MODE 0x16 /** End of TEST_MODE_Exported_Macros * @} */ /*============================================================================* * Types *============================================================================*/ /** @defgroup TEST_MODE_Exported_Types Test Mode Exported Types * @brief * @{ */ /* 0x16 (BTAON_FAST_TEST_MODE) */ typedef union { uint16_t d16; struct { uint8_t is_nanwang_dfu_mode : 1; /* bit[0]: customized for nanwang dfu mode */ uint8_t rsvd : 4; /* bit[4:1]: reserved for ROM code */ uint8_t test_mode : 3; /* bit[7:5]: test mode */ uint8_t reset_reason : 8; /* bit[15:8]: reset reason */ } s; } T_BTAON_FAST_TEST_MODE_TYPE; typedef enum { NOT_TEST_MODE = 0, DIRECT_TEST_MODE = 1, SINGLE_TONE_MODE = 2, AUTO_PAIR_WITH_FIX_ADDR_MODE = 3, DATA_UART_TEST_MODE = 4, WRISTBAND_TEST_MODE = 5, MOUSE_TEST_MODE = 6, //add more } T_TEST_MODE; /** End of TEST_MODE_Exported_Types * @} */ /*============================================================================* * Functions *============================================================================*/ /** @defgroup TEST_MODE_Exported_Functions Test Mode Exported Functions * @brief * @{ */ static inline bool dfu_check_nw_dfu_mode_flag(void) { T_BTAON_FAST_TEST_MODE_TYPE nFastBoot; nFastBoot.d16 = btaon_fast_read_safe(BTAON_FAST_TEST_MODE); DFU_PRINT_INFO1("dfu_check_nw_dfu_mode_flag: ota(%d)", nFastBoot.s.is_nanwang_dfu_mode); return nFastBoot.s.is_nanwang_dfu_mode ? true : false; } static inline void dfu_set_nw_dfu_mode_flag(bool enable) { T_BTAON_FAST_TEST_MODE_TYPE nFastBoot; nFastBoot.d16 = btaon_fast_read_safe(BTAON_FAST_TEST_MODE); if (enable) { nFastBoot.s.is_nanwang_dfu_mode = 1; } else { nFastBoot.s.is_nanwang_dfu_mode = 0; } btaon_fast_write_safe(BTAON_FAST_TEST_MODE, nFastBoot.d16); DFU_PRINT_INFO1("dfu_set_nw_dfu_mode_flag ota(%d)", nFastBoot.s.is_nanwang_dfu_mode); } static inline T_TEST_MODE get_test_mode(void) { T_BTAON_FAST_TEST_MODE_TYPE aon; aon.d16 = btaon_fast_read_safe(BTAON_FAST_TEST_MODE); return (T_TEST_MODE)(aon.s.test_mode); } static inline void switch_to_test_mode(T_TEST_MODE test_mode) { T_BTAON_FAST_TEST_MODE_TYPE aon; aon.d16 = btaon_fast_read_safe(BTAON_FAST_TEST_MODE); aon.s.test_mode = test_mode; btaon_fast_write_safe(BTAON_FAST_TEST_MODE, aon.d16); WDG_SystemReset(RESET_ALL_EXCEPT_AON, SWITCH_TEST_MODE); } static inline void reset_test_mode(void) { T_BTAON_FAST_TEST_MODE_TYPE aon; aon.d16 = btaon_fast_read_safe(BTAON_FAST_TEST_MODE); aon.s.test_mode = NOT_TEST_MODE; btaon_fast_write_safe(BTAON_FAST_TEST_MODE, aon.d16); } static inline bool is_test_mode_enable(void) { uint32_t start_addr = flash_get_bank_addr(FLASH_BKP_DATA1); if (start_addr) { uint32_t r_data = 0; flash_auto_read_locked(start_addr, &r_data); return r_data == TEST_MODE_FLAG_DEFAULT; } return false; } static inline bool test_mode_disable(void) { bool retval = false; uint32_t start_addr = flash_get_bank_addr(FLASH_BKP_DATA1); if (start_addr) { retval = flash_auto_write_locked(start_addr, TEST_MODE_FLAG_DISABLE); } return retval; } void set_hci_mode_flag(bool enable); bool check_hci_mode_flag(void); static inline void switch_to_hci_mode(void) { set_hci_mode_flag(true); WDG_SystemReset(RESET_ALL_EXCEPT_AON, SWITCH_HCI_MODE); } #if (BUILD_DATATRANS == 1) void set_datatrans_patch_flag(bool enable); bool check_datatrans_patch_flag(void); #endif /** @} */ /* End of group TEST_MODE_Exported_Functions*/ /** @} */ /* End of group TEST_MODE*/ #ifdef __cplusplus } #endif #endif /* _TEST_MODE_H_ */