/**
 *
 * @file bl_boot_config.h
 *
 * @ingroup generic_bootloader_8bit
 *
 * @brief This header file provides the user configuration options for the 8-bit bootloader library.
 *
 * @version BOOTLOADER Driver Version 3.0.0
*/

${disclaimer} 

#ifndef BL_BOOT_CONFIG_H
#define BL_BOOT_CONFIG_H

#include "../system/system.h"

<#if VERIFY == "ECDSA_SHA256_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def APPLICATION_FOOTER_SIZE
 * This is a macro for application footer size.
 */
#define APPLICATION_FOOTER_SIZE     (72)
/**
 * @ingroup generic_bootloader_8bit
 * @def ECDSA_SIGNATURE_LENGTH
 * This is a macro for ECDSA signature length.
 */
#define ECDSA_SIGNATURE_LENGTH      (64)
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_FOOTER_SIZE_WITH_CRC16
 * This is a macro for bootloader footer size with CRC16 algorithm.
 */
#define BL_FOOTER_SIZE_WITH_CRC16   (74)
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_FOOTER_SIZE_WITH_CRC32
 * This is a macro for bootloader footer size with CRC32 algorithm.
 */
#define BL_FOOTER_SIZE_WITH_CRC32   (76)
</#if>

<#if DEVICE_TYPE == "PIC">
/**
 * @ingroup generic_bootloader_8bit
 * @def START_OF_APP
 * This is a macro for application start address.
 */
#define START_OF_APP                (${NEW_RESET_VECTOR_U}U)
/**
 * @ingroup generic_bootloader_8bit
 * @def PROGMEM_PAGE_SIZE_LOW_BYTE
 * This is a macro for low byte of program page size
 */
#define PROGMEM_PAGE_SIZE_LOW_BYTE  ((uint8_t)(PROGMEM_PAGE_SIZE & 0xFFU))
/**
 * @ingroup generic_bootloader_8bit
 * @def PROGMEM_PAGE_SIZE_HIGH_BYTE
 * This is a macro for high byte of program page size
 */
#define PROGMEM_PAGE_SIZE_HIGH_BYTE ((uint8_t)((PROGMEM_PAGE_SIZE >> 8U) & 0xFFU))
<#if VERIFY == "ECDSA_SHA256_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def END_OF_APP
 * This is a macro for application end address.
 */
#define END_OF_APP                  (_ROMSIZE - 1U - BL_FOOTER_SIZE_WITH_CRC16)
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_APPLICATION_FOOTER_START_ADDRESS_CRC16
 * This is a macro for application footer start address in case of CRC16 algorithm.
 */
#define BL_APPLICATION_FOOTER_START_ADDRESS_CRC16 (_ROMSIZE - BL_FOOTER_SIZE_WITH_CRC16) 
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_APPLICATION_FOOTER_START_ADDRESS_CRC32
 * This is a macro for application footer start address in case of CRC32 algorithm..
 */
#define BL_APPLICATION_FOOTER_START_ADDRESS_CRC32 (_ROMSIZE - BL_FOOTER_SIZE_WITH_CRC32) 
</#if>
<#elseif DEVICE_TYPE == "AVR">
/**
 * @ingroup generic_bootloader_8bit
 * @def START_OF_APP
 * This is a macro for application start address.
 */
<#if (BOOT_BLOCK_SIZE_U == "512bytes")>
#define START_OF_APP                (FUSE.BOOTSIZE * PROGMEM_PAGE_SIZE) // 32*512 = 16K 
<#elseif BOOT_BLOCK_SIZE_U == "256bytes">
#define START_OF_APP                (FUSE.BOOTEND * 256U)
</#if> 
<#if VERIFY == "ECDSA_SHA256_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def END_OF_APP
 * This is a macro for application end address.
 */
#define END_OF_APP                  (PROGMEM_END - BL_FOOTER_SIZE_WITH_CRC16)
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_APPLICATION_FOOTER_START_ADDRESS_CRC16
 * This is a macro for application footer start address in case of CRC16 algorithm.
 */
#define BL_APPLICATION_FOOTER_START_ADDRESS_CRC16 (PROGMEM_SIZE - BL_FOOTER_SIZE_WITH_CRC16) 
/**
 * @ingroup generic_bootloader_8bit
 * @def BL_APPLICATION_FOOTER_START_ADDRESS_CRC32
 * This is a macro for application footer start address in case of CRC32 algorithm.
 */
#define BL_APPLICATION_FOOTER_START_ADDRESS_CRC32 (PROGMEM_SIZE - BL_FOOTER_SIZE_WITH_CRC32)
</#if>
</#if> 
<#if VERIFY == "ECDSA_SHA256_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def START_OF_APP_FOOTER
 * This is a macro for starting address of application footer.
 */
#define START_OF_APP_FOOTER         (END_OF_APP + 1U)
</#if>
<#if (VERIFY == "STATUS_BYTE_VERIFICATION")>
/**
 * @ingroup generic_bootloader_8bit
 * @def STATUS_ADDRESS
 * This is a macro for address of bootloader status byte.
 */
<#if (CHIP_TYPE == "PIC18" || DEVICE_TYPE == "AVR")>
#define STATUS_ADDRESS (flash_address_t)(PROGMEM_SIZE - 2U)
</#if>
<#if (CHIP_TYPE == "PIC16")>
#define STATUS_ADDRESS (flash_address_t)(PROGMEM_SIZE - 1U)
</#if>

</#if>
<#if VERIFY == "CRC16_VERIFICATION" || VERIFY == "CRC32_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def CRC_SIZE
 * This is a macro for size of CRC.
 */
#define CRC_SIZE            ${CRC_SIZE_U}U
/**
 * @ingroup generic_bootloader_8bit
 * @def END_OF_APP
 * This is a macro for application end address.
 */
#define END_OF_APP          ((flash_address_t)((PROGMEM_SIZE - 1U) - CRC_SIZE))
/**
 * @ingroup generic_bootloader_8bit
 * @def CRC_STORE_ADDRESS
 * This is a macro for CRC store address.
 */
#define CRC_STORE_ADDRESS   (flash_address_t)(END_OF_APP + 1U)
/**
 * @ingroup generic_bootloader_8bit
 * @def CRC_LENGTH
 * This is a macro for CRC length.
 */
#define CRC_LENGTH          (CRC_STORE_ADDRESS - START_OF_APP)
</#if>

<#if VERIFY == "CHECKSUM_VERIFICATION">
/**
 * @ingroup generic_bootloader_8bit
 * @def CHECKSUM_SIZE
 * This is a macro for checksum size.
 */
#define CHECKSUM_SIZE      ${CHECKSUM_SIZE_U}U
/**
 * @ingroup generic_bootloader_8bit
 * @def END_OF_APP
 * This is a macro for application end address.
 */
#define END_OF_APP          ((flash_address_t)((PROGMEM_SIZE - 1U) - CHECKSUM_SIZE))
/**
 * @ingroup generic_bootloader_8bit
 * @def CHECKSUM_ADDRESS
 * This is a macro for checksum store address.
 */
#define CHECKSUM_ADDRESS    (flash_address_t)(END_OF_APP + 1U)
/**
 * @ingroup generic_bootloader_8bit
 * @def CHECKSUM_LENGTH
 * This is a macro for checksum length.
 */
#define CHECKSUM_LENGTH     (CHECKSUM_ADDRESS - START_OF_APP)
</#if>
#endif //BL_BOOT_CONFIG_H

