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 pll_clk;
91     uint8_t hclk_div;
92     uint8_t bclk_div;
93 
94     uint8_t flash_clk_type;
95     uint8_t flash_clk_div;
96     uint8_t rsvd[2];
97 };
98 
99 struct __attribute__((packed, aligned(4))) boot_clk_cfg_t {
100     uint32_t magiccode;
101     struct sys_clk_cfg_t cfg;
102     uint32_t crc32;
103 };
104 
105 struct __attribute__((packed, aligned(4))) aesiv_cfg_t {
106     uint8_t aesiv[16];
107     uint32_t crc32;
108 };
109 
110 struct __attribute__((packed, aligned(4))) pkey_cfg_t {
111     uint8_t eckeyx[32]; /* ec key in boot header */
112     uint8_t eckeyy[32]; /* ec key in boot header */
113     uint32_t crc32;
114 };
115 
116 struct __attribute__((packed, aligned(4))) sign_cfg_t {
117     uint32_t sig_len;
118     uint8_t signature[32];
119     uint32_t crc32;
120 };
121 
122 struct __attribute__((packed, aligned(4))) bootheader_t {
123     uint32_t magiccode;                /* 4 */
124     uint32_t rivison;                  /* 4 */
125     struct boot_flash_cfg_t flash_cfg; /* 4 + 84 + 4 */
126     struct boot_clk_cfg_t clk_cfg;     /* 4 + 8 + 4 */
127     union __attribute__((packed, aligned(1))) {
128         struct __attribute__((packed, aligned(1))) {
129             uint32_t sign               : 2;  /* [1: 0]      for sign*/
130             uint32_t encrypt_type       : 2;  /* [3: 2]      for encrypt */
131             uint32_t key_sel            : 2;  /* [5: 4]      for key sel in boot interface*/
132             uint32_t rsvd6_7            : 2;  /* [7: 6]      for encrypt*/
133             uint32_t no_segment         : 1;  /* [8]         no segment info */
134             uint32_t cache_select       : 1;  /* [9]         for cache */
135             uint32_t notload_in_bootrom : 1;  /* [10]        not load this img in bootrom */
136             uint32_t aes_region_lock    : 1;  /* [11]        aes region lock */
137             uint32_t cache_way_disable  : 4;  /* [15: 12]    cache way disable info*/
138             uint32_t crc_ignore         : 1;  /* [16]        ignore crc */
139             uint32_t hash_ignore        : 1;  /* [17]        hash crc */
140             uint32_t halt_ap            : 1;  /* [18]        halt ap */
141             uint32_t rsvd19_31          : 13; /* [31:19]     rsvd */
142         } bval;
143         uint32_t wval;
144     } boot_cfg; /* 4 */
145 
146     union __attribute__((packed, aligned(1))) {
147         uint32_t segment_cnt;
148         uint32_t img_len;
149     } img_segment_info; /* 4 */
150 
151     uint32_t rsvd0; /* rsvd */
152 
153     union __attribute__((packed, aligned(1))) {
154         uint32_t ramaddr;
155         uint32_t flashoffset;
156     } img_start; /* 4 */
157 
158     uint32_t hash[32 / 4]; /*hash of the image*/
159 
160     uint32_t rsv1;
161     uint32_t rsv2;
162     uint32_t crc32;
163 };
164 
165 #define BFLB_FW_LENGTH_OFFSET 120
166 #define BFLB_FW_HASH_OFFSET   132
167 
168 #endif
169