1 #ifndef __FW_HEADER_H__
2 #define __FW_HEADER_H__
3 
4 #include "stdint.h"
5 #include "stdio.h"
6 
7 struct __attribute__((packed, aligned(4))) spi_flash_cfg_t {
8     uint8_t ioMode;               /*!< Serail flash interface mode,bit0-3:IF mode,bit4:unwrap */
9     uint8_t cReadSupport;         /*!< Support continuous read mode,bit0:continuous read mode support,bit1:read mode cfg */
10     uint8_t clkDelay;             /*!< SPI clock delay,bit0-3:delay,bit4-6:pad delay */
11     uint8_t clkInvert;            /*!< SPI clock phase invert,bit0:clck invert,bit1:rx invert,bit2-4:pad delay,bit5-7:pad delay */
12     uint8_t resetEnCmd;           /*!< Flash enable reset command */
13     uint8_t resetCmd;             /*!< Flash reset command */
14     uint8_t resetCreadCmd;        /*!< Flash reset continuous read command */
15     uint8_t resetCreadCmdSize;    /*!< Flash reset continuous read command size */
16     uint8_t jedecIdCmd;           /*!< JEDEC ID command */
17     uint8_t jedecIdCmdDmyClk;     /*!< JEDEC ID command dummy clock */
18     uint8_t enter32BitsAddrCmd;   /*!< Enter 32-bits addr command */
19     uint8_t exit32BitsAddrCmd;    /*!< Exit 32-bits addr command */
20     uint8_t sectorSize;           /*!< *1024bytes */
21     uint8_t mid;                  /*!< Manufacturer ID */
22     uint16_t pageSize;            /*!< Page size */
23     uint8_t chipEraseCmd;         /*!< Chip erase cmd */
24     uint8_t sectorEraseCmd;       /*!< Sector erase command */
25     uint8_t blk32EraseCmd;        /*!< Block 32K erase command,some Micron not support */
26     uint8_t blk64EraseCmd;        /*!< Block 64K erase command */
27     uint8_t writeEnableCmd;       /*!< Need before every erase or program */
28     uint8_t pageProgramCmd;       /*!< Page program cmd */
29     uint8_t qpageProgramCmd;      /*!< QIO page program cmd */
30     uint8_t qppAddrMode;          /*!< QIO page program address mode */
31     uint8_t fastReadCmd;          /*!< Fast read command */
32     uint8_t frDmyClk;             /*!< Fast read command dummy clock */
33     uint8_t qpiFastReadCmd;       /*!< QPI fast read command */
34     uint8_t qpiFrDmyClk;          /*!< QPI fast read command dummy clock */
35     uint8_t fastReadDoCmd;        /*!< Fast read dual output command */
36     uint8_t frDoDmyClk;           /*!< Fast read dual output command dummy clock */
37     uint8_t fastReadDioCmd;       /*!< Fast read dual io comamnd */
38     uint8_t frDioDmyClk;          /*!< Fast read dual io command dummy clock */
39     uint8_t fastReadQoCmd;        /*!< Fast read quad output comamnd */
40     uint8_t frQoDmyClk;           /*!< Fast read quad output comamnd dummy clock */
41     uint8_t fastReadQioCmd;       /*!< Fast read quad io comamnd */
42     uint8_t frQioDmyClk;          /*!< Fast read quad io comamnd dummy clock */
43     uint8_t qpiFastReadQioCmd;    /*!< QPI fast read quad io comamnd */
44     uint8_t qpiFrQioDmyClk;       /*!< QPI fast read QIO dummy clock */
45     uint8_t qpiPageProgramCmd;    /*!< QPI program command */
46     uint8_t writeVregEnableCmd;   /*!< Enable write reg */
47     uint8_t wrEnableIndex;        /*!< Write enable register index */
48     uint8_t qeIndex;              /*!< Quad mode enable register index */
49     uint8_t busyIndex;            /*!< Busy status register index */
50     uint8_t wrEnableBit;          /*!< Write enable bit pos */
51     uint8_t qeBit;                /*!< Quad enable bit pos */
52     uint8_t busyBit;              /*!< Busy status bit pos */
53     uint8_t wrEnableWriteRegLen;  /*!< Register length of write enable */
54     uint8_t wrEnableReadRegLen;   /*!< Register length of write enable status */
55     uint8_t qeWriteRegLen;        /*!< Register length of contain quad enable */
56     uint8_t qeReadRegLen;         /*!< Register length of contain quad enable status */
57     uint8_t releasePowerDown;     /*!< Release power down command */
58     uint8_t busyReadRegLen;       /*!< Register length of contain busy status */
59     uint8_t readRegCmd[4];        /*!< Read register command buffer */
60     uint8_t writeRegCmd[4];       /*!< Write register command buffer */
61     uint8_t enterQpi;             /*!< Enter qpi command */
62     uint8_t exitQpi;              /*!< Exit qpi command */
63     uint8_t cReadMode;            /*!< Config data for continuous read mode */
64     uint8_t cRExit;               /*!< Config data for exit continuous read mode */
65     uint8_t burstWrapCmd;         /*!< Enable burst wrap command */
66     uint8_t burstWrapCmdDmyClk;   /*!< Enable burst wrap command dummy clock */
67     uint8_t burstWrapDataMode;    /*!< Data and address mode for this command */
68     uint8_t burstWrapData;        /*!< Data to enable burst wrap */
69     uint8_t deBurstWrapCmd;       /*!< Disable burst wrap command */
70     uint8_t deBurstWrapCmdDmyClk; /*!< Disable burst wrap command dummy clock */
71     uint8_t deBurstWrapDataMode;  /*!< Data and address mode for this command */
72     uint8_t deBurstWrapData;      /*!< Data to disable burst wrap */
73     uint16_t timeEsector;         /*!< 4K erase time */
74     uint16_t timeE32k;            /*!< 32K erase time */
75     uint16_t timeE64k;            /*!< 64K erase time */
76     uint16_t timePagePgm;         /*!< Page program time */
77     uint16_t timeCe;              /*!< Chip erase time in ms */
78     uint8_t pdDelay;              /*!< Release power down command delay time for wake up */
79     uint8_t qeData;               /*!< QE set data */
80 };
81 
82 struct __attribute__((packed, aligned(4))) boot_flash_cfg_t {
83     uint32_t magiccode;
84     struct spi_flash_cfg_t cfg;
85     uint32_t crc32;
86 };
87 
88 struct __attribute__((packed, aligned(4))) sys_clk_cfg_t {
89     uint8_t xtal_type;
90     uint8_t mcu_clk;
91     uint8_t mcu_clk_div;
92     uint8_t mcu_bclk_div;
93 
94     uint8_t mcu_pbclk_div;
95     uint8_t emi_clk;
96     uint8_t emi_clk_div;
97     uint8_t flash_clk_type;
98 
99     uint8_t flash_clk_div;
100     uint8_t wifipll_pu;
101     uint8_t aupll_pu;
102     uint8_t rsvd0;
103 };
104 
105 struct __attribute__((packed, aligned(4))) boot_clk_cfg_t {
106     uint32_t magiccode;
107     struct sys_clk_cfg_t cfg;
108     uint32_t crc32;
109 };
110 
111 struct __attribute__((packed, aligned(4))) boot_basic_cfg_t {
112     uint32_t sign_type          : 2; /* [1: 0]   for sign */
113     uint32_t encrypt_type       : 2; /* [3: 2]   for encrypt */
114     uint32_t key_sel            : 2; /* [5: 4]   key slot */
115     uint32_t xts_mode           : 1; /* [6]      for xts mode */
116     uint32_t aes_region_lock    : 1; /* [7]      rsvd */
117     uint32_t no_segment         : 1; /* [8]      no segment info */
118     uint32_t rsvd_0             : 1; /* [9]      boot2 enable(rsvd_0) */
119     uint32_t rsvd_1             : 1; /* [10]     boot2 rollback(rsvd_1) */
120     uint32_t cpu_master_id      : 4; /* [14: 11] master id */
121     uint32_t notload_in_bootrom : 1; /* [15]     notload in bootrom */
122     uint32_t crc_ignore         : 1; /* [16]     ignore crc */
123     uint32_t hash_ignore        : 1; /* [17]     hash ignore */
124     uint32_t power_on_mm        : 1; /* [18]     power on mm */
125     uint32_t em_sel             : 3; /* [21: 19] em_sel */
126     uint32_t cmds_en            : 1; /* [22]     command spliter enable */
127     uint32_t cmds_wrap_mode     : 2; /* [24: 23] cmds wrap mode */
128     uint32_t cmds_wrap_len      : 4; /* [28: 25] cmds wrap len */
129     uint32_t icache_invalid     : 1; /* [29] icache invalid */
130     uint32_t dcache_invalid     : 1; /* [30] dcache invalid */
131     uint32_t rsvd_3             : 1; /* [31] rsvd_3 */
132 
133     uint32_t group_image_offset; /* flash controller offset */
134     uint32_t aes_region_len;     /* aes region length */
135 
136     uint32_t img_len_cnt;  /* image length or segment count */
137     uint32_t hash[32 / 4]; /* hash of the image */
138 };
139 
140 struct __attribute__((packed, aligned(4))) boot_cpu_cfg_t {
141     uint8_t config_enable;     /* coinfig this cpu */
142     uint8_t halt_cpu;          /* halt this cpu */
143     uint8_t cache_enable  : 1; /* cache setting */
144     uint8_t cache_wa      : 1; /* cache setting */
145     uint8_t cache_wb      : 1; /* cache setting */
146     uint8_t cache_wt      : 1; /* cache setting */
147     uint8_t cache_way_dis : 4; /* cache setting */
148     uint8_t rsvd;
149 
150     uint32_t image_address_offset; /* image_address_offset */
151     uint32_t rsvd1;                /* rsvd */
152     uint32_t msp_val;              /* msp value */
153 };
154 
155 struct __attribute__((packed, aligned(4))) aesiv_cfg_t {
156     uint8_t aesiv[16];
157     uint32_t crc32;
158 };
159 
160 struct __attribute__((packed, aligned(4))) pkey_cfg_t {
161     uint8_t eckeyx[32]; /* ec key in boot header */
162     uint8_t eckeyy[32]; /* ec key in boot header */
163     uint32_t crc32;
164 };
165 
166 struct __attribute__((packed, aligned(4))) sign_cfg_t {
167     uint32_t sig_len;
168     uint8_t signature[32];
169     uint32_t crc32;
170 };
171 
172 struct __attribute__((packed, aligned(4))) bootheader_t {
173     uint32_t magiccode; /* 4 */
174     uint32_t rivison;   /* 4 */
175 
176     struct boot_flash_cfg_t flash_cfg; /* 4 + 84 + 4 */
177     struct boot_clk_cfg_t clk_cfg;     /* 4 + 12 + 4 */
178 
179     struct boot_basic_cfg_t basic_cfg; /* 4 + 4 + 4 + 4 + 4*8 */
180 
181     struct boot_cpu_cfg_t cpu_cfg; /* 16 */
182 
183     uint32_t boot2_pt_table_0_rsvd; /* address of partition table 0 */ /* 4 */
184     uint32_t boot2_pt_table_1_rsvd; /* address of partition table 1 */ /* 4 */
185 
186     uint32_t flash_cfg_table_addr; /* address of flashcfg table list */ /* 4 */
187     uint32_t flash_cfg_table_len; /* flashcfg table list len */         /* 4 */
188 
189     uint32_t rsvd0[6]; /* rsvd */
190     uint32_t rsvd1[6]; /* rsvd */
191 
192     uint32_t rsvd; /* 4 */
193 
194     uint32_t crc32; /* 4 */
195 };
196 
197 #endif
198