/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#ifndef __HAL_BOOTMODE_H__
#define __HAL_BOOTMODE_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"

#define HAL_HW_BOOTMODE_MASK                    (0xF << 0)
#define HAL_SW_BOOTMODE_MASK                    (0x0FFFFFFF << 4)

// SW_BOOTMODE_START                            (1 << 4)
#define HAL_SW_BOOTMODE_READ_ENABLED            (1 << 4)
#define HAL_SW_BOOTMODE_WRITE_ENABLED           (1 << 5)
#define HAL_SW_BOOTMODE_JTAG_ENABLED            (1 << 6)
#define HAL_SW_BOOTMODE_FORCE_USB_DLD           (1 << 7)
#define HAL_SW_BOOTMODE_FORCE_UART_DLD          (1 << 8)
#define HAL_SW_BOOTMODE_DLD_TRANS_UART          (1 << 9)
#define HAL_SW_BOOTMODE_SKIP_FLASH_BOOT         (1 << 10)
#define HAL_SW_BOOTMODE_CHIP_TEST               (1 << 11)
#define HAL_SW_BOOTMODE_FACTORY                 (1 << 12)
#define HAL_SW_BOOTMODE_CALIB                   (1 << 13)
#define HAL_SW_BOOTMODE_ROM_RESERVED_14         (1 << 14)
#define HAL_SW_BOOTMODE_FLASH_BOOT              (1 << 15)
#define HAL_SW_BOOTMODE_REBOOT                  (1 << 16)
#define HAL_SW_BOOTMODE_ROM_RESERVED_17         (1 << 17)
#define HAL_SW_BOOTMODE_FORCE_USB_PLUG_IN       (1 << 18)
#define HAL_SW_BOOTMODE_POWER_DOWN_WAKEUP       (1 << 19)

// APP_BOOTMODE_START                           (1 << 20)
// Add new application bootmodes here (from highest bit to lowest bit)

#define HAL_SW_BOOTMODE_TEST_MASK               (7 << 20)
#define HAL_SW_BOOTMODE_TEST_MODE               (1 << 20)
#define HAL_SW_BOOTMODE_TEST_SIGNALINGMODE      (1 << 21)
#define HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE    (1 << 22)

#define HAL_SW_BOOTMODE_ENTER_HIDE_BOOT         (1 << 23)

#define HAL_SW_BOOTMODE_RESERVED_BIT24          (1 << 24)
#define HAL_SW_BOOTMODE_REBOOT_FROM_CRASH       (1 << 25)
#define HAL_SW_BOOTMODE_SINGLE_LINE_DOWNLOAD    (1 << 26)

#ifdef __USB_COMM__
#define HAL_SW_BOOTMODE_CDC_COMM                (1 << 28)
#endif
#ifdef ANC_APP
#define HAL_SW_BOOTMODE_REBOOT_BT_ON            (1 << 29)
#define HAL_SW_BOOTMODE_REBOOT_ANC_ON           (1 << 30)
#endif

#ifdef USER_REBOOT_PLAY_MUSIC_AUTO
#define HAL_SW_BOOTMODE_LOCAL_PLAYER            (1 << 31)
#endif

// APP_BOOTMODE_END                             (1 << 31)
// SW_BOOTMODE_END                              (1 << 31)

union HAL_HW_BOOTMODE_T {
    struct {
        uint8_t watchdog    : 1;
        uint8_t global      : 1;
        uint8_t rtc         : 1;
        uint8_t charger     : 1;
    };
    uint8_t reg;
};

union HAL_HW_BOOTMODE_T hal_rom_hw_bootmode_get(void);

union HAL_HW_BOOTMODE_T hal_hw_bootmode_get(void);

void hal_hw_bootmode_init(void);

uint32_t hal_sw_bootmode_get(void);

void hal_sw_bootmode_set(uint32_t bm);

void hal_sw_bootmode_clear(uint32_t bm);

#ifdef __cplusplus
}
#endif

#endif

