1 /*
2 * Copyright 2021 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7 #include "fsl_flash.h"
8 #include "fsl_flash_ffr.h"
9 #include "fsl_flexspi_nor_flash.h"
10 #include "fsl_runbootloader.h"
11
12 /*! @brief Component ID definition, used by tools. */
13 #ifndef FSL_COMPONENT_ID
14 #define FSL_COMPONENT_ID "platform.drivers.runBootloader"
15 #endif
16
17 /*******************************************************************************
18 * Definitions
19 ******************************************************************************/
20 #define BOOTLOADER_API_TREE_POINTER ((bootloader_tree_t *)0x1302FC00U)
21
22 /*!
23 * @name flash, ffr, flexspi nor flash Structure
24 * @{
25 */
26
27 typedef union functionCommandOption
28 {
29 uint32_t commandAddr;
30 status_t (*isFlashAreaReadable)(flash_config_t *config, uint32_t startAddress, uint32_t lengthInBytes);
31 status_t (*isFlashAreaModifiable)(flash_config_t *config, uint32_t startAddress, uint32_t lengthInBytes);
32 } function_command_option_t;
33
34 /*!
35 * @brief Structure of version property.
36 *
37 * @ingroup bl_core
38 */
39 typedef union StandardVersion
40 {
41 struct
42 {
43 uint8_t bugfix; /*!< bugfix version [7:0] */
44 uint8_t minor; /*!< minor version [15:8] */
45 uint8_t major; /*!< major version [23:16] */
46 char name; /*!< name [31:24] */
47 };
48 uint32_t version; /*!< combined version numbers */
49 } standard_version_t;
50
51 /*! @brief Interface for the flash driver.*/
52 typedef struct FlashDriverInterface
53 {
54 standard_version_t version; /*!< flash driver API version number. */
55 /* Flash driver */
56 status_t (*flash_init)(flash_config_t *config);
57 status_t (*flash_erase)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key);
58 status_t (*flash_program)(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes);
59 status_t (*flash_verify_erase)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes);
60 status_t (*flash_verify_program)(flash_config_t *config,
61 uint32_t start,
62 uint32_t lengthInBytes,
63 const uint8_t *expectedData,
64 uint32_t *failedAddress,
65 uint32_t *failedData);
66 status_t (*flash_get_property)(flash_config_t *config, flash_property_tag_t whichProperty, uint32_t *value);
67
68 status_t (*flash_erase_with_checker)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key);
69 status_t (*flash_program_with_checker)(flash_config_t *config,
70 uint32_t start,
71 uint8_t *src,
72 uint32_t lengthInBytes);
73 status_t (*flash_verify_program_with_checker)(flash_config_t *config,
74 uint32_t start,
75 uint32_t lengthInBytes,
76 const uint8_t *expectedData,
77 uint32_t *failedAddress,
78 uint32_t *failedData);
79 /*!< Flash FFR driver */
80 status_t (*ffr_init)(flash_config_t *config);
81 status_t (*ffr_lock)(flash_config_t *config);
82 status_t (*ffr_cust_factory_page_write)(flash_config_t *config, uint8_t *page_data, bool seal_part);
83 status_t (*ffr_get_uuid)(flash_config_t *config, uint8_t *uuid);
84 status_t (*ffr_get_customer_data)(flash_config_t *config, uint8_t *pData, uint32_t offset, uint32_t len);
85 status_t (*ffr_cust_keystore_write)(flash_config_t *config, ffr_key_store_t *pKeyStore);
86 status_t reserved0;
87 status_t reserved1;
88 status_t (*ffr_infield_page_write)(flash_config_t *config, uint8_t *page_data, uint32_t valid_len);
89 status_t (*ffr_get_customer_infield_data)(flash_config_t *config, uint8_t *pData, uint32_t offset, uint32_t len);
90 status_t (*flash_read)(flash_config_t *config, uint32_t start, uint8_t *dest, uint32_t lengthInBytes);
91 status_t (*ffr_seclib_init)(flash_config_t *config, uint32_t *context);
92 status_t (*flash_get_cust_keystore)(flash_config_t *config, uint8_t *pData, uint32_t offset, uint32_t len);
93 status_t (*flash_erase_non_blocking)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key);
94 status_t (*flash_get_command_state)(flash_config_t *config);
95 } flash_driver_interface_t;
96
97 /*! @brief FLEXSPI Flash driver API Interface */
98 typedef struct
99 {
100 uint32_t version;
101 status_t (*init)(uint32_t instance, flexspi_nor_config_t *config);
102 status_t (*page_program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t dstAddr, const uint32_t *src);
103 status_t (*erase_all)(uint32_t instance, flexspi_nor_config_t *config);
104 status_t (*erase)(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t length);
105 status_t (*erase_sector)(uint32_t instance, flexspi_nor_config_t *config, uint32_t address);
106 status_t (*erase_block)(uint32_t instance, flexspi_nor_config_t *config, uint32_t address);
107 status_t (*get_config)(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option);
108 status_t (*read)(uint32_t instance, flexspi_nor_config_t *config, uint32_t *dst, uint32_t start, uint32_t bytes);
109 status_t (*xfer)(uint32_t instance, flexspi_xfer_t *xfer);
110 status_t (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, uint32_t numberOfSeq);
111 status_t (*set_clock_source)(uint32_t clockSrc);
112 void (*config_clock)(uint32_t instance, uint32_t freqOption, uint32_t sampleClkMode);
113 } flexspi_nor_flash_driver_t;
114
115 /*! @}*/
116
117 /*!
118 * @brief Root of the bootloader API tree.
119 *
120 * An instance of this struct resides in read-only memory in the bootloader. It
121 * provides a user application access to APIs exported by the bootloader.
122 *
123 * @note The order of existing fields must not be changed.
124 */
125 typedef struct BootloaderTree
126 {
127 void (*runBootloader)(void *arg); /*!< Function to start the bootloader executing.*/
128 standard_version_t version; /*!< Bootloader version number.*/
129 const char *copyright; /*!< Copyright string.*/
130 const uint32_t reserved0; /*!< reserved*/
131 const flash_driver_interface_t *flashDriver; /*!< Internal Flash driver API.*/
132 const uint32_t reserved1[5]; /*!< reserved*/
133 const uint32_t nbootDriver; /*!< Please refer to "fsl_nboot.h" */
134 const flexspi_nor_flash_driver_t *flexspiNorDriver; /*!< FlexSPI NOR FLASH Driver API.*/
135 const uint32_t reserved2; /*!< reserved*/
136 const uint32_t memoryInterface; /*!< Please refer to "fsl_mem_interface.h" */
137 } bootloader_tree_t;
138
139 /*******************************************************************************
140 * API
141 ******************************************************************************/
142
bootloader_user_entry(void * arg)143 void bootloader_user_entry(void *arg)
144 {
145 assert(BOOTLOADER_API_TREE_POINTER);
146 BOOTLOADER_API_TREE_POINTER->runBootloader(arg);
147 }
148