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