Vastly simplify property.h and remove its unused parts.

This commit is contained in:
László Monda
2017-04-11 23:20:43 +02:00
parent 01a348453f
commit 604d354072

View File

@@ -1,362 +1,96 @@
#ifndef _property_h
#define _property_h
#ifndef __PROPERTY_H__
#define __PROPERTY_H__
#include <stdint.h>
#include "bootloader_common.h"
#include "packet/command_packet.h"
#if !defined(BOOTLOADER_HOST)
#include "fsl_device_registers.h"
#include "utilities/vector_table_info.h"
#endif
//! @addtogroup property
//! @{
////////////////////////////////////////////////////////////////////////////////
// Declarations
////////////////////////////////////////////////////////////////////////////////
//! @name Command Availability
//@{
//! Sets a bit in the available commands property value to indicate a command with
//! the given tag is available.
#define HAS_CMD(tag) (1 << ((tag)-kFirstCommandTag))
//! Checks whether a command with the specified tag is present in the provided command
//! availability mask.
#define IS_CMD_AVAILABLE(mask, tag) (((mask)&HAS_CMD(tag)) != 0)
enum _available_commands
{
kAvailableCommands = (
#if !BL_FEATURE_MIN_PROFILE
HAS_CMD(kCommandTag_FlashEraseAll) | HAS_CMD(kCommandTag_FlashEraseRegion) | HAS_CMD(kCommandTag_WriteMemory)
#if BL_FEATURE_FLASH_SECURITY
|
HAS_CMD(kCommandTag_FlashSecurityDisable)
#endif // BL_FEATURE_ERASEALL_UNSECURE
|
HAS_CMD(kCommandTag_GetProperty) | HAS_CMD(kCommandTag_Execute) | HAS_CMD(kCommandTag_Reset) |
HAS_CMD(kCommandTag_SetProperty) | HAS_CMD(kCommandTag_ReadMemory) | HAS_CMD(kCommandTag_FillMemory) |
HAS_CMD(kCommandTag_ReceiveSbFile) | HAS_CMD(kCommandTag_Call)
#if BL_FEATURE_ERASEALL_UNSECURE
|
HAS_CMD(kCommandTag_FlashEraseAllUnsecure)
#endif // BL_FEATURE_ERASEALL_UNSECURE
|
HAS_CMD(kCommandTag_FlashReadOnce) | HAS_CMD(kCommandTag_FlashProgramOnce) |
HAS_CMD(kCommandTag_FlashReadResource)
#if BL_FEATURE_QSPI_MODULE
|
HAS_CMD(kCommandTag_ConfigureQuadSpi)
#endif // BL_FEATURE_QSPI_MODULE
#if BL_FEATURE_RELIABLE_UPDATE
|
HAS_CMD(kCommandTag_ReliableUpdate)
#endif // BL_FEATURE_RELIABLE_UPDATE
#else // BL_FEATURE_MIN_PROFILE
HAS_CMD(kCommandTag_FlashEraseAll) | HAS_CMD(kCommandTag_FlashEraseRegion) | HAS_CMD(kCommandTag_WriteMemory)
#if BL_FEATURE_FLASH_SECURITY
|
HAS_CMD(kCommandTag_FlashSecurityDisable)
#endif // BL_FEATURE_FLASH_SECURITY
|
HAS_CMD(kCommandTag_GetProperty) | HAS_CMD(kCommandTag_Execute) | HAS_CMD(kCommandTag_Reset) |
HAS_CMD(kCommandTag_SetProperty)
#if BL_FEATURE_READ_MEMORY
|
HAS_CMD(kCommandTag_ReadMemory)
#endif // BL_FEATURE_READ_MEMORY
#if BL_FEATURE_FILL_MEMORY
|
HAS_CMD(kCommandTag_FillMemory)
#endif // BL_FEATURE_FILL_MEMORY
#if BL_FEATURE_ERASEALL_UNSECURE
|
HAS_CMD(kCommandTag_FlashEraseAllUnsecure)
#endif // BL_FEATURE_ERASEALL_UNSECURE
#endif // BL_FEATURE_MIN_PROFILE
)
};
//@}
//! @brief Property store status codes.
enum _property_errors
{
kStatus_UnknownProperty = MAKE_STATUS(kStatusGroup_PropertyStore, 0),
kStatus_ReadOnlyProperty = MAKE_STATUS(kStatusGroup_PropertyStore, 1), //!< Property is read-only.
kStatus_InvalidPropertyValue = MAKE_STATUS(kStatusGroup_PropertyStore, 2) //!< Property value is out of range.
};
//! @brief Property tags.
//! @note Do not change any tag values. Add tags at the end.
enum _property_tag
{
kPropertyTag_ListProperties = 0x00,
kPropertyTag_BootloaderVersion = 0x01,
kPropertyTag_AvailablePeripherals = 0x02,
kPropertyTag_FlashStartAddress = 0x03,
kPropertyTag_FlashSizeInBytes = 0x04,
kPropertyTag_FlashSectorSize = 0x05,
kPropertyTag_FlashBlockCount = 0x06,
kPropertyTag_AvailableCommands = 0x07,
kPropertyTag_CrcCheckStatus = 0x08,
kPropertyTag_Reserved9 = 0x09,
kPropertyTag_VerifyWrites = 0x0a,
kPropertyTag_MaxPacketSize = 0x0b,
kPropertyTag_ReservedRegions = 0x0c,
kPropertyTag_Reserved13 = 0x0d,
kPropertyTag_RAMStartAddress = 0x0e,
kPropertyTag_RAMSizeInBytes = 0x0f,
kPropertyTag_SystemDeviceId = 0x10,
kPropertyTag_FlashSecurityState = 0x11,
kPropertyTag_UniqueDeviceId = 0x12,
kPropertyTag_FacSupport = 0x13,
kPropertyTag_FlashAccessSegmentSize = 0x14,
kPropertyTag_FlashAccessSegmentCount = 0x15,
kPropertyTag_FlashReadMargin = 0x16,
kPropertyTag_QspiInitStatus = 0x17,
kPropertyTag_TargetVersion = 0x18,
kPropertyTag_ExternalMemoryAttributes = 0x19,
kPropertyTag_ReliableUpdateStatus = 0x1a,
kPropertyTag_InvalidProperty = 0xFF,
};
//! @brief Property constants.
enum _property_constants
{
enum _property_constants {
kProperty_ReservedRegionsCount = 2,
kProperty_FlashReservedRegionIndex = 0,
kProperty_RamReservedRegionIndex = 1,
kProperty_FlashVersionIdSizeInBytes = 8,
};
//! @brief Bit positions for clock flags in configuration data.
enum _clock_flags
{
kClockFlag_HighSpeed = (1 << 0)
};
//! @brief Bit positions for boot flags in configuration data
enum _boot_flags
{
kBootFlag_DirectBoot = (1 << 0)
};
#if !defined(BOOTLOADER_HOST)
//! @brief Flash constants.
enum _flash_constants
{
//! @brief The bootloader configuration data location .
//!
//! A User Application should populate a BootloaderConfigurationData
//! struct at 0x3c0 from the beginning of the application image which must
//! be the User Application vector table for the flash-resident bootloader
//! collaboration.
kBootloaderConfigAreaAddress = (uint32_t)(APP_VECTOR_TABLE) + 0x3c0
};
#endif // BOOTLOADER_HOST
//! @brief Format of bootloader configuration data on Flash.
typedef struct BootloaderConfigurationData
{
uint32_t tag; //!< [00:03] Tag value used to validate the bootloader configuration data. Must be set to 'kcfg'.
uint32_t crcStartAddress; //!< [04:07]
uint32_t crcByteCount; //!< [08:0b]
uint32_t crcExpectedValue; //!< [0c:0f]
uint8_t enabledPeripherals; //!< [10:10]
uint8_t i2cSlaveAddress; //!< [11:11]
uint16_t peripheralDetectionTimeoutMs; //!< [12:13] Timeout in milliseconds for peripheral detection before jumping
//! to application code
uint16_t usbVid; //!< [14:15]
uint16_t usbPid; //!< [16:17]
uint32_t usbStringsPointer; //!< [18:1b]
uint8_t clockFlags; //!< [1c:1c] High Speed and other clock options
uint8_t clockDivider; //!< [1d:1d] One's complement of clock divider, zero divider is divide by 1
uint8_t bootFlags; //!< [1e:1e] One's complemnt of direct boot flag, 0xFE represents direct boot
uint8_t pad0; //!< [1f:1f] Reserved, set to 0xFF
uint32_t mmcauConfigPointer; //!< [20:23] Holds a pointer value to the MMCAU configuration
uint32_t keyBlobPointer; //!< [24:27] Holds a pointer value to the key blob array used to configure OTFAD
uint8_t pad1; //!< [28:28] reserved
uint8_t canConfig1; //!< [29:29] ClkSel[1], PropSeg[3], SpeedIndex[4]
uint16_t canConfig2; //!< [2a:2b] Pdiv[8], Pseg1[3], Pseg2[3], rjw[2]
uint16_t canTxId; //!< [2c:2d] txId
uint16_t canRxId; //!< [2e:2f] rxId
uint32_t qspi_config_block_pointer; //!< [30:33] QSPI config block pointer.
typedef struct BootloaderConfigurationData {
uint32_t tag; // [00:03] Tag value used to validate the bootloader configuration data. Must be set to 'kcfg'.
uint32_t crcStartAddress; // [04:07]
uint32_t crcByteCount; // [08:0b]
uint32_t crcExpectedValue; // [0c:0f]
uint8_t enabledPeripherals; // [10:10]
uint8_t i2cSlaveAddress; // [11:11]
uint16_t peripheralDetectionTimeoutMs; // [12:13] Timeout in milliseconds for peripheral detection before jumping to application code
uint16_t usbVid; // [14:15]
uint16_t usbPid; // [16:17]
uint32_t usbStringsPointer; // [18:1b]
uint8_t clockFlags; // [1c:1c] High Speed and other clock options
uint8_t clockDivider; // [1d:1d] One's complement of clock divider, zero divider is divide by 1
uint8_t bootFlags; // [1e:1e] One's complemnt of direct boot flag, 0xFE represents direct boot
uint8_t pad0; // [1f:1f] Reserved, set to 0xFF
uint32_t mmcauConfigPointer; // [20:23] Holds a pointer value to the MMCAU configuration
uint32_t keyBlobPointer; // [24:27] Holds a pointer value to the key blob array used to configure OTFAD
uint8_t pad1; // [28:28] reserved
uint8_t canConfig1; // [29:29] ClkSel[1], PropSeg[3], SpeedIndex[4]
uint16_t canConfig2; // [2a:2b] Pdiv[8], Pseg1[3], Pseg2[3], rjw[2]
uint16_t canTxId; // [2c:2d] txId
uint16_t canRxId; // [2e:2f] rxId
uint32_t qspi_config_block_pointer; // [30:33] QSPI config block pointer.
} bootloader_configuration_data_t;
//! @brief Structure of a reserved regions entry.
typedef struct ReservedRegion
{
typedef struct ReservedRegion {
uint32_t startAddress;
uint32_t endAddress;
} reserved_region_t;
//! @brief Structure of a unique device id.
typedef struct UniqueDeviceId
{
typedef struct UniqueDeviceId {
uint32_t uidl;
uint32_t uidml;
uint32_t uidmh;
#if defined(BOOTLOADER_HOST) | defined(SIM_UIDH)
uint32_t uidh;
#endif
} unique_device_id_t;
//! @brief External Memory Properties tag
enum _external_memory_property_tags
{
kExternalMemoryPropertyTag_InitStatus = 0, //!< Init status tag
kExternalMemoryPropertyTag_StartAddress = 1, //!< Start address tag
kExternalMemoryPropertyTag_MemorySizeInKbytes = 2, //!< Memory size tag
kExternalMemoryPropertyTag_PageSize = 3, //!< Pag size tag
kExternalMemoryPropertyTag_SectorSize = 4, //!< Sector size tag
kExternalMemoryPropertyTag_BlockSize = 5, //!< Block size tag
kExternalMemoryPropertyTag_Start = kExternalMemoryPropertyTag_StartAddress,
kExternalMemoryPropertyTag_End = kExternalMemoryPropertyTag_BlockSize,
};
//! @brief Exernal Memory attribute store
typedef struct
{
uint32_t availableAttributesFlag; //!< Available Atrributes, bit map
uint32_t startAddress; //!< start Address of external memory
uint32_t flashSizeInKB; //!< flash size of external memory
uint32_t pageSize; //!< page size of external memory
uint32_t sectorSize; //!< sector size of external memory
uint32_t blockSize; //!< block size of external memory
typedef struct {
uint32_t availableAttributesFlag; // Available Atrributes, bit map
uint32_t startAddress; // start Address of external memory
uint32_t flashSizeInKB; // flash size of external memory
uint32_t pageSize; // page size of external memory
uint32_t sectorSize; // sector size of external memory
uint32_t blockSize; // block size of external memory
} external_memory_property_store_t;
enum _ram_constants
{
#if CPU_IS_ARM_CORTEX_M7
kRAMCount = 3,
#else
enum _ram_constants {
kRAMCount = 1,
#endif
};
//! @brief Structure of property store.
typedef struct PropertyStore
{
standard_version_t bootloaderVersion; //!< Current bootloader version.
standard_version_t serialProtocolVersion; //!< Serial protocol version number.
standard_version_t targetVersion; //!< Target version number.
uint32_t availablePeripherals; //!< The set of peripherals supported available on this chip. See enum
//!_peripheral_types in bl_peripheral.h.
uint32_t flashStartAddress; //!< Start address of program flash.
uint32_t flashSizeInBytes; //!< Size in bytes of program flash.
uint32_t flashSectorSize; //!< The size in bytes of one sector of program flash. This is the minimum erase size.
uint32_t flashBlockSize; //!< The size in bytes of one block of program flash.
uint32_t flashBlockCount; //!< Number of blocks in the flash array.
uint32_t ramStartAddress[kRAMCount]; //!< Start address of RAM
uint32_t ramSizeInBytes[kRAMCount]; //!< Size in bytes of RAM
uint32_t crcCheckStatus; //!< Status code from the last CRC check operation.
uint32_t verifyWrites; //!< Boolean controlling whether the bootloader will verify writes to flash. Non-zero enables
//! verificaton. Writable by host.
uint32_t availableCommands; //!< Bit mask of the available commands.
unique_device_id_t UniqueDeviceId; //!< Unique identification for the device.
uint32_t flashFacSupport; //!< Boolean indicating whether the FAC feature is supported
uint32_t flashAccessSegmentSize; //!< The size in bytes of one segment of flash
uint32_t flashAccessSegmentCount; //!< The count of flash access segment within flash module
uint32_t flashReadMargin; //!< The margin level setting for flash erase and program Verify CMDs
uint32_t qspiInitStatus; //!< Result of QSPI+OTFAD init during bootloader startup
reserved_region_t reservedRegions[kProperty_ReservedRegionsCount]; //!< Flash and Ram reserved regions.
bootloader_configuration_data_t
configurationData; //!< Configuration data from flash address 0x3c0-0x3ff in sector 0 (64 bytes max)
external_memory_property_store_t externalMemoryPropertyStore; //!< Property store for external memory
uint32_t reliableUpdateStatus; //!< Status of reliable update
typedef struct PropertyStore {
standard_version_t bootloaderVersion; // Current bootloader version.
standard_version_t serialProtocolVersion; // Serial protocol version number.
standard_version_t targetVersion; // Target version number.
uint32_t availablePeripherals; // The set of peripherals supported available on this chip. See enum _peripheral_types in bl_peripheral.h.
uint32_t flashStartAddress; // Start address of program flash.
uint32_t flashSizeInBytes; // Size in bytes of program flash.
uint32_t flashSectorSize; // The size in bytes of one sector of program flash. This is the minimum erase size.
uint32_t flashBlockSize; // The size in bytes of one block of program flash.
uint32_t flashBlockCount; // Number of blocks in the flash array.
uint32_t ramStartAddress[kRAMCount]; // Start address of RAM
uint32_t ramSizeInBytes[kRAMCount]; // Size in bytes of RAM
uint32_t crcCheckStatus; // Status code from the last CRC check operation.
uint32_t verifyWrites; // Boolean controlling whether the bootloader will verify writes to flash. Non-zero enables verificaton. Writable by host.
uint32_t availableCommands; // Bit mask of the available commands.
unique_device_id_t UniqueDeviceId; // Unique identification for the device.
uint32_t flashFacSupport; // Boolean indicating whether the FAC feature is supported
uint32_t flashAccessSegmentSize; // The size in bytes of one segment of flash
uint32_t flashAccessSegmentCount; // The count of flash access segment within flash module
uint32_t flashReadMargin; // The margin level setting for flash erase and program Verify CMDs
uint32_t qspiInitStatus; // Result of QSPI+OTFAD init during bootloader startup
reserved_region_t reservedRegions[kProperty_ReservedRegionsCount]; // Flash and Ram reserved regions.
bootloader_configuration_data_t configurationData; // Configuration data from flash address 0x3c0-0x3ff in sector 0 (64 bytes max)
external_memory_property_store_t externalMemoryPropertyStore; // Property store for external memory
uint32_t reliableUpdateStatus; // Status of reliable update
} property_store_t;
enum _property_store_tags
{
//! @brief Tag value used to validate the bootloader configuration data.
kPropertyStoreTag = FOUR_CHAR_CODE('k', 'c', 'f', 'g')
};
//! @brief External Memory properties interface
typedef struct ExternalMemoryPropertyInterface
{
uint32_t memoryId;
status_t (*get)(uint32_t tag, uint32_t *value);
} external_memory_property_interface_t;
//! @brief Interface to property operations.
typedef struct PropertyInterface
{
status_t (*load_user_config)(void); //!< Load the user configuration data
status_t (*init)(void); //!< Initialize
status_t (*get)(uint8_t tag, uint8_t id, const void **value, uint32_t *valueSize); //!< Get property
status_t (*set_uint32)(uint8_t tag, uint32_t value); //!< Set uint32_t property
property_store_t *store; //!< The property store
typedef struct PropertyInterface {
status_t (*load_user_config)(void); // Load the user configuration data
status_t (*init)(void); // Initialize
status_t (*get)(uint8_t tag, uint8_t id, const void **value, uint32_t *valueSize); // Get property
status_t (*set_uint32)(uint8_t tag, uint32_t value); // Set uint32_t property
property_store_t *store; // The property store
} property_interface_t;
////////////////////////////////////////////////////////////////////////////////
// Externs
////////////////////////////////////////////////////////////////////////////////
//! @brief Property interface.
extern const property_interface_t g_propertyInterface;
////////////////////////////////////////////////////////////////////////////////
// Prototypes
////////////////////////////////////////////////////////////////////////////////
#if __cplusplus
extern "C" {
#endif
//! @name Property Store
//@{
//! @brief Early initialization function to get user configuration data
status_t bootloader_property_load_user_config(void);
//! @brief Initialize the property store.
status_t bootloader_property_init(void);
//! @brief Get a property.
//!
//! Example calling sequence for uint32_t property:
//! @code
//! void * value;
//! uint32_t valueSize;
//! status_t status = bootloader_property_get(sometag, &value, &valueSize);
//! uint32_t result = *(uint32_t *)value;
//! @endcode
//!
//! @param tag Tag of the requested property
//! @param memoryId Id for specified external memory, for example: 1 represent QuadSPI 0
//! @param value Pointer to where to write a pointer to the result, may be NULL
//! @param valueSize Size in bytes of the property value, may be NULL
//!
//! @retval kStatus_Success
//! @retval kStatus_UnknownProperty
status_t bootloader_property_get(uint8_t tag, uint8_t memoryId, const void **value, uint32_t *valueSize);
//! @brief Set a property.
//!
//! Only uint32_t properties can be set with this function.
//!
//! @param tag Tag of the property to set
//! @param value New property value
//!
//! @retval kStatus_Success
//! @retval kStatus_UnknownProperty
//! @retval kStatus_ReadOnlyProperty
status_t bootloader_property_set_uint32(uint8_t tag, uint32_t value);
//@}
#if __cplusplus
}
#endif
//! @}
#endif // _property_h