1 /***************************************************************************/ /** 2 * @file rsi_qspi.h 3 ******************************************************************************* 4 * # License 5 * <b>Copyright 2024 Silicon Laboratories Inc. www.silabs.com</b> 6 ******************************************************************************* 7 * 8 * SPDX-License-Identifier: Zlib 9 * 10 * The licensor of this software is Silicon Laboratories Inc. 11 * 12 * This software is provided 'as-is', without any express or implied 13 * warranty. In no event will the authors be held liable for any damages 14 * arising from the use of this software. 15 * 16 * Permission is granted to anyone to use this software for any purpose, 17 * including commercial applications, and to alter it and redistribute it 18 * freely, subject to the following restrictions: 19 * 20 * 1. The origin of this software must not be misrepresented; you must not 21 * claim that you wrote the original software. If you use this software 22 * in a product, an acknowledgment in the product documentation would be 23 * appreciated but is not required. 24 * 2. Altered source versions must be plainly marked as such, and must not be 25 * misrepresented as being the original software. 26 * 3. This notice may not be removed or altered from any source distribution. 27 * 28 ******************************************************************************/ 29 30 // Include Files 31 32 #include "rsi_ccp_common.h" 33 #include "base_types.h" 34 #include "stdint.h" 35 #include "rsi_qspi_proto.h" 36 37 #ifndef RSI_QSPI_H 38 #define RSI_QSPI_H 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 // QSPI defines 45 #define TA_QSPI_BASE_ADDRESS 0x10000000 46 #define M4_QSPI_BASE_ADDRESS 0x12000000 47 #define M4_QSPI_2_BASE_ADDRESS 0x12040000 48 #define TA_QSPI_AUTOM_CHIP0_ADDRESS 0x04000000 49 #define M4_QSPI_AUTOM_CHIP0_ADDRESS 0x08000000 50 51 #define NWP_FSM_BASE_ADDR 0x41300000 52 #define MCU_NPSS_BASE_ADDR 0x24048000 53 #define MCU_FSM_BASE_ADDR MCU_NPSS_BASE_ADDR + 0x100 54 #define M4_BBFF_STORAGE1 *(volatile uint32_t *)(MCU_NPSS_BASE_ADDR + 0x0580) 55 #define M4_BBFF_STORAGE2 *(volatile uint32_t *)(MCU_NPSS_BASE_ADDR + 0x0584) 56 #define MCURET_BOOTSTATUS_REG *(volatile uint32_t *)(MCU_NPSS_BASE_ADDR + 0x604) 57 #define TA_BBFF_STORAGE1 *(volatile uint32_t *)(NWP_FSM_BASE_ADDR + 0x580) 58 #define TA_BBFF_STORAGE2 *(volatile uint32_t *)(NWP_FSM_BASE_ADDR + 0x584) 59 60 // This structure contains qspi registers 61 #if !defined(SLI_SI917B0) && !defined(SLI_SI915) 62 struct qspi_reg_s { 63 volatile uint32_t QSPI_CLK_CONFIG_REG; // qspi reg 64 volatile uint32_t QSPI_BUS_MODE_REG; // qspi reg 65 volatile uint32_t QSPI_AUTO_CTRL_CONFIG_1_REG; // qspi reg 66 volatile uint32_t QSPI_AUTO_CTRL_CONFIG_2_REG; // qspi reg 67 volatile uint32_t QSPI_MANUAL_CONFIG_REG; // qspi reg 68 volatile uint32_t QSPI_MANUAL_CONFIG_2_REG; // qspi reg 69 70 volatile uint32_t RESERVED_1; // qspi reg 71 volatile uint32_t QSPI_FIFO_THRESHOLD_REG; // qspi reg 72 volatile uint32_t QSPI_STATUS_REG; // qspi reg 73 volatile uint32_t QSPI_INTR_MASK_REG; // qspi reg 74 volatile uint32_t QSPI_INTR_UNMASK_REG; // qspi reg 75 volatile uint32_t QSPI_INTR_STS_REG; // qspi reg 76 volatile uint32_t QSPI_INTR_ACK_REG; // qspi reg 77 volatile uint32_t QSPI_STS_MC_REG; // qspi reg 78 volatile uint32_t QSPI_AUTO_CONFIG_1_CSN1_REG; // qspi reg 79 volatile uint32_t QSPI_AUTO_CONFIG_2_CSN1_REG; // qspi reg 80 volatile uint32_t QSPI_MANUAL_RD_WR_DATA_REG; // qspi reg 81 volatile uint32_t RESERVED_2[15]; // qspi reg 82 volatile uint32_t QSPI_MANUAL_WRITE_DATA_2_REG; // qspi reg 83 volatile uint32_t RESERVED_3[3]; // qspi reg 84 volatile uint32_t QSPI_AUTO_CONFIG3; 85 volatile uint32_t QSPI_AUTO_CONFIG3_CSN1; 86 volatile uint32_t RESERVED_4[6]; // qspi reg 87 volatile uint32_t OCTA_SPI_BUS_CONTROLLER; // qspi reg :2c 88 volatile uint32_t QSPI_AUTO_BASE_ADDR_UNMASK_CSN0; 89 volatile uint32_t RESERVED_7[3]; // qspi reg 90 volatile uint32_t OCTA_SPI_BUS_CONTROLLER2; // qspi reg:31 91 #if defined(SLI_SI917) || defined(SLI_SI915) 92 volatile uint32_t QSPI_AES_CONFIG; // qspi reg 93 volatile uint32_t QSPI_AES_KEY_IV_VALID; // qspi reg 94 volatile uint32_t QSPI_AES_IV1_0_3; // qspi reg 95 volatile uint32_t QSPI_AES_IV1_4_7; // qspi reg 96 volatile uint32_t QSPI_AES_IV1_8_B; // qspi reg 97 volatile uint32_t QSPI_AES_IV1_C_F; // qspi reg 98 volatile uint32_t RESERVED_8; // qspi reg 99 #else 100 volatile uint32_t QSPI_AES_KEY_0_3; // qspi reg 101 volatile uint32_t QSPI_AES_KEY_4_7; // qspi reg 102 volatile uint32_t QSPI_AES_KEY_8_B; // qspi reg 103 volatile uint32_t QSPI_AES_KEY_C_F; // qspi reg 104 volatile uint32_t QSPI_AES_NONCE_0_3; // qspi reg 105 volatile uint32_t QSPI_AES_NONCE_4_7; // qspi reg 106 volatile uint32_t QSPI_AES_NONCE_8_B; // qspi reg 107 #endif 108 volatile uint32_t QSPI_AES_SEC_SEG_ADDR[4 * 2]; // qspi reg 109 volatile uint32_t RESERVED_6[6]; // qspi reg 110 volatile uint32_t QSPI_SEMI_AUTO_ADDR_REG; 111 volatile uint32_t QSPI_SEMI_AUTO_MODE_CONFIG_REG; 112 volatile uint32_t QSPI_SEMI_AUTO_MODE_CONFIG2_REG; 113 volatile uint32_t QSPI_BUS_MODE2_REG; 114 volatile uint32_t QSPI_AES_SEC_KEY_FRM_KH; 115 volatile uint32_t QSPI_AUTO_CONITNUE_FETCH_CTRL_REG; // qspi reg 116 #if defined(SLI_SI917) || defined(SLI_SI915) 117 volatile uint32_t QSPI_AES_KEY1_0_3; // qspi reg 118 volatile uint32_t QSPI_AES_KEY1_4_7; // qspi reg 119 volatile uint32_t QSPI_AES_KEY1_8_B; // qspi reg 120 volatile uint32_t QSPI_AES_KEY1_C_F; // qspi reg 121 volatile uint32_t QSPI_AES_KEY1_10_13; // qspi reg 122 volatile uint32_t QSPI_AES_KEY1_14_17; // qspi reg 123 volatile uint32_t QSPI_AES_KEY1_18_1B; // qspi reg 124 volatile uint32_t QSPI_AES_KEY1_1C_1F; // qspi reg 125 volatile uint32_t QSPI_AES_KEY2_0_3; // qspi reg 126 volatile uint32_t QSPI_AES_KEY2_4_7; // qspi reg 127 volatile uint32_t QSPI_AES_KEY2_8_B; // qspi reg 128 volatile uint32_t QSPI_AES_KEY2_C_F; // qspi reg 129 volatile uint32_t QSPI_AES_KEY2_10_13; // qspi reg 130 volatile uint32_t QSPI_AES_KEY2_14_17; // qspi reg 131 volatile uint32_t QSPI_AES_KEY2_18_1B; // qspi reg 132 volatile uint32_t QSPI_AES_KEY2_1C_1F; // qspi reg 133 volatile uint32_t QSPI_AES_IV2_0_3; // qspi reg 134 volatile uint32_t QSPI_AES_IV2_4_7; // qspi reg 135 volatile uint32_t QSPI_AES_IV2_8_B; // qspi reg 136 volatile uint32_t QSPI_AES_IV2_C_F; // qspi reg 137 volatile uint32_t QSPI_AES_CTXOUT_IV1_0_3; // qspi reg 138 volatile uint32_t QSPI_AES_CTXOUT_IV1_4_7; // qspi reg 139 volatile uint32_t QSPI_AES_CTXOUT_IV1_8_B; // qspi reg 140 volatile uint32_t QSPI_AES_CTXOUT_IV1_C_F; // qspi reg 141 volatile uint32_t QSPI_AES_CTXOUT_IV2_0_3; // qspi reg 142 volatile uint32_t QSPI_AES_CTXOUT_IV2_4_7; // qspi reg 143 volatile uint32_t QSPI_AES_CTXOUT_IV2_8_B; // qspi reg 144 volatile uint32_t QSPI_AES_CTXOUT_IV2_C_F; // qspi reg 145 #endif 146 }; 147 148 #else 149 struct qspi_reg_s { 150 volatile uint32_t QSPI_CLK_CONFIG_REG; // qspi reg 0x00 151 volatile uint32_t QSPI_BUS_MODE_REG; // qspi reg 0x04 152 volatile uint32_t QSPI_AUTO_CTRL_CONFIG_1_REG; // qspi reg 0x08 153 volatile uint32_t QSPI_AUTO_CTRL_CONFIG_2_REG; // qspi reg 0x0C 154 volatile uint32_t QSPI_MANUAL_CONFIG_REG; // qspi reg 0x10 155 volatile uint32_t QSPI_MANUAL_CONFIG_2_REG; // qspi reg 0x14 156 157 volatile uint32_t RESERVED_1; // qspi reg 0x18 158 volatile uint32_t QSPI_FIFO_THRESHOLD_REG; // qspi reg 0x1c 159 volatile uint32_t QSPI_STATUS_REG; // qspi reg 0x20 160 volatile uint32_t QSPI_INTR_MASK_REG; // qspi reg 0x24 161 volatile uint32_t QSPI_INTR_UNMASK_REG; // qspi reg 0x28 162 volatile uint32_t QSPI_INTR_STS_REG; // qspi reg 0x2C 163 volatile uint32_t QSPI_INTR_ACK_REG; // qspi reg 0x30 164 volatile uint32_t QSPI_STS_MC_REG; // qspi reg 0x34 165 volatile uint32_t QSPI_AUTO_CONFIG_1_CSN1_REG; // qspi reg 0x38 166 volatile uint32_t QSPI_AUTO_CONFIG_2_CSN1_REG; // qspi reg 0x3C 167 volatile uint32_t QSPI_MANUAL_RD_WR_DATA_REG; // qspi reg 0x40 168 volatile uint32_t RESERVED_2[15]; // qspi reg -0x7c 169 volatile uint32_t QSPI_MANUAL_WRITE_DATA_2_REG; // qspi reg 0x80 170 volatile uint32_t RESERVED_3[3]; // qspi reg -0x8C 171 volatile uint32_t QSPI_AUTO_CONFIG3; // qspi reg 0x90 172 volatile uint32_t QSPI_AUTO_CONFIG3_CSN1; // qspi reg 0x94 173 volatile uint32_t RESERVED_4[2]; // qspi reg -0x9C 174 175 volatile uint32_t QSPI_AUTO_BASE_ADDR_CSN0; // qspi reg 0xA0 176 volatile uint32_t QSPI_AUTO_BASE_ADDR_CSN1; // qspi reg 0xA4 177 178 volatile uint32_t RESERVED_5[2]; // qspi reg -0xAC 179 180 volatile uint32_t OCTA_SPI_BUS_CONTROLLER; // qspi reg 0xB0 181 volatile uint32_t QSPI_AUTO_BASE_ADDR_UNMASK_CSN0; // qspi reg 0xB4 182 183 volatile uint32_t QSPI_AUTO_BASE_ADDR_UNMASK_CSN1; // qspi reg 0xB8 184 185 volatile uint32_t RESERVED_6[2]; // qspi reg -0xC0 186 volatile uint32_t OCTA_SPI_BUS_CONTROLLER2; // qspi reg 0xC4 187 188 volatile uint32_t QSPI_AES_CONFIG; // qspi reg 0xC8 189 volatile uint32_t QSPI_AES_KEY_IV_VALID; // qspi reg 0xCC 190 191 volatile uint32_t QSPI_CMNFLASH_STS; // qspi reg 0xD0 192 193 volatile uint32_t QSPI_AES_LB_DATA_0_3; // qspi reg 0xD4 194 volatile uint32_t QSPI_AES_LB_DATA_4_7; // qspi reg 0xD8 195 volatile uint32_t QSPI_AES_LB_DATA_8_B; // qspi reg 0xDC 196 volatile uint32_t QSPI_AES_LB_DATA_C_F; // qspi reg 0xE0 197 198 volatile uint32_t QSPI_AES_SEC_SEG_ADDR[4 * 2]; // qspi reg -0x100 199 200 volatile uint32_t QSPI_SRAM_CTRL_CSN0_REG; // qspi reg 0x104 201 volatile uint32_t QSPI_SRAM_CTRL_CSN1_REG; // qspi reg 0x108 202 volatile uint32_t QSPI_SRAM_CTRL_CSN2_REG; // qspi reg 0x10C 203 volatile uint32_t QSPI_SRAM_CTRL_CSN3_REG; // qspi reg 0x110 204 205 volatile uint32_t CCMP_LBK_CTRL_REG; // qspi reg 0x114 206 volatile uint32_t RESERVED_7; // qspi reg -0x118 207 208 volatile uint32_t QSPI_SEMI_AUTO_ADDR_REG; // qspi reg 0x11C 209 volatile uint32_t QSPI_SEMI_AUTO_MODE_CONFIG_REG; // qspi reg 0x120 210 volatile uint32_t QSPI_SEMI_AUTO_MODE_CONFIG2_REG; // qspi reg 0x124 211 volatile uint32_t QSPI_BUS_MODE2_REG; // qspi reg 0x128 212 volatile uint32_t QSPI_AES_SEC_KEY_FRM_KH; // qspi reg 0x12C 213 volatile uint32_t QSPI_AUTO_CONITNUE_FETCH_CTRL_REG; // qspi reg 0x130 214 215 volatile uint32_t QSPI_AES_KEY1_0_3; // qspi reg 0x134 216 volatile uint32_t QSPI_AES_KEY1_4_7; // qspi reg 0x138 217 volatile uint32_t QSPI_AES_KEY1_8_B; // qspi reg 0x13C 218 volatile uint32_t QSPI_AES_KEY1_C_F; // qspi reg 0x140 219 volatile uint32_t QSPI_AES_KEY1_10_13; // qspi reg 0x144 220 volatile uint32_t QSPI_AES_KEY1_14_17; // qspi reg 0x148 221 volatile uint32_t QSPI_AES_KEY1_18_1B; // qspi reg 0x14C 222 volatile uint32_t QSPI_AES_KEY1_1C_1F; // qspi reg 0x150 223 volatile uint32_t QSPI_AES_KEY2_0_3; // qspi reg 0x154 224 volatile uint32_t QSPI_AES_KEY2_4_7; // qspi reg 0x158 225 volatile uint32_t QSPI_AES_KEY2_8_B; // qspi reg 0x15C 226 volatile uint32_t QSPI_AES_KEY2_C_F; // qspi reg 0x160 227 volatile uint32_t QSPI_AES_KEY2_10_13; // qspi reg 0x164 228 volatile uint32_t QSPI_AES_KEY2_14_17; // qspi reg 0x168 229 volatile uint32_t QSPI_AES_KEY2_18_1B; // qspi reg 0x16C 230 volatile uint32_t QSPI_AES_KEY2_1C_1F; // qspi reg 0x170 231 volatile uint32_t QSPI_AES_IV1_0_3; // qspi reg 0x174 232 volatile uint32_t QSPI_AES_IV1_4_7; // qspi reg 0x178 233 volatile uint32_t QSPI_AES_IV1_8_B; // qspi reg 0x17C 234 volatile uint32_t QSPI_AES_IV1_C_F; // qspi reg 0x180 235 volatile uint32_t QSPI_LB_STATUS; // qspi reg 0x184 236 }; 237 #endif 238 239 #define XMAX(x, y) (((x) > (y)) ? (x) : (y)) 240 #define XMIN(x, y) (((x) < (y)) ? (x) : (y)) 241 242 #define QSPI_BASE_ADDRESS 0x12000000 243 #define QSPI_AUTOM_CHIP0_ADDRESS 0x08000000 244 #define QSPI_AUTOM_CHIP1_ADDRESS 0x09000000 245 #define PAD_CONFIGURATION_BASE_ADDR 0x41380000 246 #define TASS_CLK_PWR_CTRL_BASE_ADDR 0x41400000 247 #define GPIO_BASE_ADDR 0x40200000 248 #define DMA_BASE_ADDR 0x21000000 249 #define M4SS_CLK_PWR_CTRL_BASE_ADDR 0x46000000 250 #define M4GPIO_BASE_ADDR 0x46130000 251 #define M4PAD_CONFIGURATION_BASE_ADDR 0x46004000 252 #define M4PAD_SELECTION_BASE_ADDR 0x41300000 253 254 #define MISC_CONFIGURATION_REG 0x46008000 255 #define M4SS_QSPI_OCTA_MODE_CTRL *(volatile uint32_t *)(MISC_CONFIGURATION_REG + 0x1B4) 256 #define M4SS_QSPI_RX_DLL_TEST_REG *(volatile uint32_t *)(MISC_CONFIGURATION_REG + 0x1C0) 257 #define M4SS_QSPI_TX_DLL_TEST_REG *(volatile uint32_t *)(MISC_CONFIGURATION_REG + 0x1BC) 258 259 #define qspi_ddr_data_0 0 260 #define qspi_ddr_data_1 1 261 #define qspi_ddr_data_2 2 262 #define qspi_ddr_data_3 3 263 #define qspi_ddr_data_4 4 264 #define qspi_ddr_data_5 5 265 #define qspi_ddr_data_6 6 266 #define qspi_ddr_data_7 7 267 #define qspi_ddr_csn 8 268 #define qspi_ddr_clk 9 269 #define qspi_ddr_dqs 10 270 #define smih_wp 11 271 272 #define CHNL_21 21 273 #define CHNL_20 20 274 275 // Qspi register defines 276 277 // cmd len will be 8 bits 278 #define CMD_LEN 8 279 // reg bit 280 #define RD_FIFO_EMPTY BIT(7) 281 // reg bit 282 #define Q_QSPI_BUSY BIT(0) 283 // QSPI_MANUAL_CONFIG_REG bits 284 #define FULL_DUPLEX_EN BIT(22) 285 #define TAKE_LEN_FRM_REG BIT(21) 286 #define HW_CTRL_MODE BIT(25) 287 #define READ_TRIGGER BIT(2) 288 #define WRITE_TRIGGER BIT(1) 289 #define CSN_ACTIVE BIT(0) 290 291 // QSPI_MANUAL_CONFIG_2_REG bits 292 #define QSPI_LOOP_BACK_MODE_EN BIT(14) 293 #define QSPI_MANUAL_DDR_PHASSE BIT(15) 294 #define QSPI_DDR_CLK_EN BIT(16) 295 296 // QSPI_CLK_CONFIG_REG bits 297 #define QSPI_DLL_CALIB BIT(28) 298 #define QSPI_DLL_TX_EN BIT(21) 299 #define QSPI_DLL_RX_EN BIT(19) 300 301 // QSPI_AUTO_CTRL_CONFIG_1_REG bits 302 #define EXTRA_BYTE_EN BIT(18) 303 304 // QSPI_AUTO_CTRL_CONFIG_2_REG bits 305 #define AUTO_RD_SWAP BIT(0) 306 307 // QSPI_SEMI_AUTO_MODE_CONFIG2_REG 308 #define SEMI_AUTO_MODE_EN BIT(12) 309 #define QSPI_SEMI_AUTO_RD_BUSY BIT(13) 310 311 #define _1BYTE 0 312 #define _2BYTE 1 313 #define _4BYTE 3 314 315 // QSPI_STATUS_REG bits 316 #define HW_CTRLD_QSPI_MODE_CTRL_SCLK BIT(14) 317 #define AUTO_MODE_ENABLED BIT(12) 318 #define QSPI_AUTO_MODE BIT(11) 319 #define AUTO_MODE_FSM_IDLE_SCLK BIT(10) 320 #define QSPI_MANUAL_RD_CNT BIT(9) 321 #define QSPI_FIFO_AEMPTY_RFIFO_S BIT(8) 322 #define QSPI_FIFO_EMPTY_RFIFO_S BIT(7) 323 #define QSPI_FIFO_AFULL_RFIFO BIT(6) 324 #define QSPI_FIFO_FULL_RFIFO BIT(5) 325 #define QSPI_FIFO_AEMPTY_WFIFO BIT(4) 326 #define QSPI_FIFO_EMPTY_WFIFO BIT(3) 327 #define QSPI_FIFO_AFULL_WFIFO_S BIT(2) 328 #define QSPI_FIFO_FULL_WFIFO_S BIT(1) 329 #define BUSY BIT(0) 330 331 #define QSPI_FIFO_DEPTH 16 332 #define QSPI_FIFO_AFULL_TH 3 333 #define QSPI_FIFO_AEMPTY_TH 3 334 335 // QSPI_BUS_MODE_REG bits 336 #define AUTO_CSN_BASED_ADDR_ENABLE BIT(7) 337 #define AUTO_MODE BIT(6) 338 #define QSPI_WRAP_EN BIT(5) 339 #define QSPI_PREFETCH_EN BIT(4) 340 #define QSPI_ULTRA_HIGH_SPEED_MODE_EN BIT(0) 341 342 // QSPI_AUTO_CONFIG3 bits 343 #define QSPI_RD_INST_CSN0_MSB 24 344 #define QSPI_CMD_SIZE_16BIT_CSN0 BIT(18) 345 #define QSPI_ADR_SIZE_32BIT_AUTO_MODE BIT(19) 346 347 // QSPI_MANUAL_WRITE_DATA_2_REG bits 348 #define USE_PREV_LEN BIT(7) 349 350 // OCTA_SPI_BUS_CONTRLLER_2 bits 351 #define DUAL_FLASH_MODE BIT(3) 352 353 // FLASH CMDS 354 355 // Write enable cmd 356 #define WREN 0x06 357 #define WREN2 0xF9 358 // Write disable cmd 359 #define WRDI 0x04 360 #define WRDI2 0xFB 361 // Read status reg cmd 362 #define RDSR 0x05 363 #define RDSR2 0xFA 364 // chip erase cmd 365 #define CHIP_ERASE 0xC7 366 // block erase cmd 367 #define BLOCK_ERASE 0xD8 368 // sector erase cmd 369 #define SECTOR_ERASE 0x20 370 // high speed rd cmd 371 #define HISPEED_READ 0x0B 372 // rd cmd 373 #define READ 0x03 374 //write config2 375 #define WCFG2 0x72 376 377 // SST25 specific cmds 378 379 // Write status reg cmd 380 #define WRSR 0x01 381 #define WRSR2 0xFE 382 // Enable Write status reg cmd 383 #define EWSR 0x50 384 // Auto address incremental rd cmd 385 #define AAI 0xAF 386 // Byte program cmd 387 #define BYTE_PROGRAM 0x02 388 389 // SST26 specific cmds 390 391 // Enable quad IO 392 #define EQIO 0x38 393 // Reset quad IO 394 #define RSTQIO 0xFF 395 // Enable STR octa 396 #define OPI_ENABLE 0X01 397 // Enable DDR octa 398 #define DOPI_ENABLE 0x02 399 // wrap : set burst 400 #define SET_BURST 0xC0 401 // wrap : read cmd 402 #define READ_BURST 0x0C 403 // Jump : page index read 404 #define READ_PI 0x08 405 // Jump : Index read 406 #define READ_I 0x09 407 // Jump : Block Index read 408 #define READ_BI 0x10 409 // Page program cmd 410 #define PAGE_PROGRAM 0x02 411 // write suspend cmd 412 #define Write_Suspend 0xB0 413 // write resume cmd 414 #define Write_Resume 0x30 415 // read block protection reg 416 #define RBPR 0x72 417 // Write block protection reg 418 #define WBPR 0x42 419 // Lockdown block protection reg 420 #define LBPR 0x8D 421 422 // WINBOND + AT + MACRONIX specific cmds 423 424 // fast read dual output 425 #define FREAD_DUAL_O 0x3B 426 // fast read quad output 427 #define FREAD_QUAD_O 0x6B 428 429 #define FREAD_QUAD_O_EB 0xEB 430 431 // WINBOND + MACRONIX specific cmds 432 433 // fast read dual IO 434 #define FREAD_DUAL_IO 0xBB 435 // fast read quad IO 436 #define FREAD_QUAD_IO 0xEB 437 438 // WINBOND specific cmds 439 440 // Octal word read (A7-A0 must be 00) 441 #define OCTAL_WREAD 0xE3 442 // Enable high performance cmd 443 #define HI_PERFMNC 0xA3 444 445 // ATMEL specific cmds 446 447 // write config reg 448 #define WCON 0x3E 449 // read config reg 450 #define RCON 0x3F 451 // supported upto 100MHz 452 #define HI_FREQ_SPI_READ 0x1B 453 454 #define ATMEL_QEN BIT(7) 455 456 // MACRONIX specific write cmds 457 458 // Address and data in quad 459 #define QUAD_PAGE_PROGRAM 0x38 460 #define DDR_DATA 16 461 #define DDR_EXTRA_BYTE 15 462 #define DDR_DUMMY 14 463 #define DDR_ADDR 13 464 #define DDR_CMD 17 465 466 #define OCTA_DDR_READ 0xEE 467 #define OCTA_DDR_READ_CMD2 0x11 468 469 #define OCTA_SDR_READ 0xEC 470 #define OCTA_SDR_READ_CMD2 0x13 471 472 // ATMEL + WINBOND specific write cmds 473 474 // Only data in quad mode 475 #define QUAD_IN_PAGE_PROGRAM 0x32 476 477 // ATMEL specific write cmds 478 479 // Data in dual 480 #define DUAL_IN_PAGE_PROGRAM 0xA2 481 482 // MICRON specific cmds 483 #define RD_LOCK_REG 0xE8 484 #define WR_LOCK_REG 0xE5 485 #define RD_FLAG_STS_REG 0x70 486 #define CLR_FLAG_STS_REG 0x50 487 #define RD_NONVOL_CON_REG 0xB5 488 #define WR_NONVOL_CON_REG 0xB1 489 #define RD_VOL_CON_REG 0x85 490 #define WR_VOL_CON_REG 0x81 491 #define RD_ENHN_VOL_CON_REG 0x65 492 #define WR_ENHN_VOL_CON_REG 0x61 493 #define DIS_XIP BIT(3) 494 #define XIP_MODE 0 495 496 // ADESTO specific cmds 497 498 #define STS_BYT2 0x31 499 #define STS_CTRL 0x71 500 501 #define ADEST_PROTECT_CMD 0x36 502 #define ADEST_UNPROTECT_CMD 0x39 503 504 // Defines for arguments 505 506 // disable hw ctrl 507 #define DIS_HW_CTRL 1 508 // donot disable hw ctrl 509 #define DNT_DIS_HW_CTRL 0 510 511 // 32bit hsize 512 #define _32BIT 3 513 // 24bit hsize is not supported, so reserved 514 // reserved 2 515 // 16bit hsize 516 #define _16BIT 1 517 // 8bit hsize 518 #define _8BIT 0 519 520 // cmd len will be 8 bits 521 #define QSPI_8BIT_LEN 8 522 // cmd + 1 byte len 523 #define QSPI_16BIT_LEN 16 524 // cmd + 24bit addr len 525 #define QSPI_32BIT_LEN 0 526 527 // OCTA_SPI_BUS_CONTROLLER2 bits 528 // initialises NONCE 529 #define NONCE_INIT BIT(1) 530 // enables global security 531 #define EN_SECURITY BIT(2) 532 // enables of sec per segment 533 #define EN_SEG_SEC 12 534 // enable qspi to use key from kh 535 #define EN_KH_KEY BIT(18) 536 537 // QSPI AES SEC KEY FROM KH bits 538 // secure key loading interval 539 #define LOAD_SEC_KEY_FRM_KH BIT(0) 540 541 // LIST OF MACRO USED 542 543 // Macro to Deassert CS 544 #define DEASSERT_CSN qspi_reg->QSPI_MANUAL_CONFIG_REG = ((qspi_reg->QSPI_MANUAL_CONFIG_REG & (~0x1FFFU)) | 0x1) 545 546 // Macro to check Quad mode 547 #define CHK_QUAD_MODE (spi_config->spi_config_1.data_mode == QUAD_MODE) 548 // Macro to check DUAL mode 549 #define CHK_DUAL_MODE (spi_config->spi_config_1.data_mode == DUAL_MODE) 550 #define CHK_OCTA_MODE (spi_config->spi_config_1.data_mode == OCTA_MODE) 551 552 // Macro to provide protection byte for SST 553 #define SST_PROTECTION ((spi_config->spi_config_2.protection == EN_WR_PROT) ? 0xFF : 0) 554 // Macro to provide protection byte for WB 555 #define WB_PROT ((spi_config->spi_config_2.protection == EN_WR_PROT) ? 0x1C00 : 0) 556 // Macro to provide protection byte for MX 557 #define MX_PROT ((spi_config->spi_config_2.protection == EN_WR_PROT) ? 0x3C : 0) 558 // Macro to provide protection byte for AT 559 #define AT_PROT ((spi_config->spi_config_2.protection == EN_WR_PROT) ? 0xC : 0) 560 // Macro to get the position for D2 line data 561 #define GET_POS \ 562 ((spi_config->spi_config_2.cs_no == CHIP_THREE) ? 30 \ 563 : (spi_config->spi_config_2.cs_no == CHIP_TWO) ? 26 \ 564 : (spi_config->spi_config_2.cs_no == CHIP_ONE) ? 14 \ 565 : 10) 566 567 #define GET_POS_D7_D4 \ 568 ((spi_config->spi_config_2.cs_no == CHIP_THREE) ? 24 \ 569 : (spi_config->spi_config_2.cs_no == CHIP_TWO) ? 16 \ 570 : (spi_config->spi_config_2.cs_no == CHIP_ONE) ? 8 \ 571 : 0) 572 // Macro to mask the d3 and d2 data bits 573 #define MASK_D3_D2(_POS) ~(0x3 << _POS) 574 #define MASK_D7_D4(_POS) ~(0xf << _POS) 575 // for 0xEB 0xE3 and 0xBB, 7th bit will be high so check for it 576 #define HI_PERFORMANCE_REQ (spi_config->spi_config_1.read_cmd & BIT(7)) 577 578 // Macro to trigger QSPI to read from flash 579 #ifdef CHIP_9118 580 #define READ_4M_FLASH(_NUM_BYTES, _CS_NO, Hsize) \ 581 qspi_reg->QSPI_MANUAL_CONFIG_REG = (qspi_reg->QSPI_MANUAL_CONFIG_REG & ~0xF8387FFF) | READ_TRIGGER | (_CS_NO << 13) \ 582 | ((_NUM_BYTES & 0x3FF) << 3) | (((_NUM_BYTES >> 10) & 0x1F) << 27) \ 583 | ((spi_config->spi_config_3.ddr_mode_en == 1) ? (BIT(21) | (Hsize << 19)) : 0) 584 #else 585 #define READ_4M_FLASH(_NUM_BYTES, _CS_NO, Hsize) \ 586 qspi_reg->QSPI_MANUAL_CONFIG_REG = (qspi_reg->QSPI_MANUAL_CONFIG_REG & ~0xF8387FFF) | READ_TRIGGER | (_CS_NO << 13) \ 587 | ((_NUM_BYTES & 0x3FF) << 3) | (((_NUM_BYTES >> 10) & 0x1F) << 27) \ 588 | (Hsize << 19) 589 590 #endif 591 // Macro to return A8 bit in case 9bit addressing is required 592 #define A8_BIT ((spi_config->spi_config_2.addr_width == _9BIT_ADDR) ? ((addr & BIT(8)) << 3) : 0) 593 594 // Macro to RETURN QSPI_BUS_SIZE from manual regs 595 #define QSPI_MANUAL_BUS_SIZE(_CHIP_SELECT) \ 596 (_CHIP_SELECT == CHIP_ZERO) ? ((qspi_reg->QSPI_BUS_MODE_REG & 0x6) >> 1) \ 597 : ((qspi_reg->QSPI_MANUAL_CONFIG_2_REG >> (8 + ((_CHIP_SELECT - 1) * 2))) & 0x3) 598 #ifdef CHIP_9118 599 #define QSPI_CMD_DDR_MODE \ 600 (spi_config->spi_config_2.cs_no ? (qspi_reg->QSPI_AUTO_CONFIG3_CSN1 & BIT(DDR_CMD)) \ 601 : (qspi_reg->QSPI_AUTO_CONFIG3 & BIT(DDR_CMD))) 602 #define QSPI_DATA_DDR_MODE \ 603 (spi_config->spi_config_2.cs_no ? (qspi_reg->QSPI_AUTO_CONFIG3_CSN1 & BIT(DDR_CMD)) \ 604 : (qspi_reg->QSPI_AUTO_CONFIG3 & BIT(DDR_DATA))) 605 #define QSPI_DUAL_FLASH_MODE (qspi_reg->OCTA_SPI_BUS_CONTROLLER2 & DUAL_FLASH_MODE) 606 #else 607 #define QSPI_CMD_DDR_MODE 0 608 #define QSPI_DATA_DDR_MODE 0 609 #define QSPI_DUAL_FLASH_MODE 0 610 #endif 611 // Macro to compute address width for manual mode based upon the addressing specified 612 #define ADDR_LEN (spi_config->spi_config_2.addr_width ? (spi_config->spi_config_2.addr_width * 8) : 8) 613 #define QSPI_32BIT_ADDR 32 614 #define QSPI_8BIT_ADDR 8 615 // Macro to compute address width for auto mode based upon addressing specified 616 #define AUTO_ADDR_WIDTH (((spi_config->spi_config_2.addr_width + 1) & 0x1) << 1) 617 618 // Macro to check whether the addr violates page boundary 619 #define ODD_PAGE_BOUNDARY (addr & (page_size - 1)) 620 621 // EXTRA_BYTE is currently hardcoded to 0xA0 622 #define EXTRA_BYTE ((spi_config->spi_config_1.continuous) ? 0xA0 : 0x00) 623 624 // number of dummy bytes required by the flash during a wrap/burst read command 625 #define NUM_DUMMY_BYTES_WRAP 1 626 #define PROT_FROM_TOP BIT(3) 627 628 #define HIGH_PERF_MODE BIT(1) 629 #define HSIZE_IN_BITS ((hsize + 1) * 8) 630 631 // QSPI AES Decryption Defines 632 #define KEY_LEN_128 16 633 #define KEY_LEN_256 32 634 #if defined(SLI_SI917) || defined(SLI_SI915) 635 #define CTR_MODE 0x04 636 #define XTS_MODE 0x80 637 #if !defined(SLI_SI917B0) && !defined(SLI_SI915) 638 #define IV_VALID (0xf << 16) 639 #define KEY1_VALID (0xf << 0) 640 #define KEY2_VALID (0xf << 8) 641 #else 642 #define LB_IV_VALID (0xf << 8) 643 #define KEY1_VALID_128 (0xf0 << 0) //128-bit 644 #define KEY2_VALID_128 (0xf0 << 12) //128-bit 645 #define KEY1_VALID_256 (0xff << 0) //256-bit 646 #define KEY2_VALID_256 (0xff << 12) //256-bit 647 #endif 648 #define DECRYPT_KEY_CAL BIT(9) 649 #define KEY_FLIP_FOR_REG_INTF BIT(10) 650 #define KEY_FLIP_FOR_KH_INTF BIT(11) 651 #define SR2_READ 0x35 652 #define QUAD_EN BIT(1) 653 #define EN_STANDALONE_AES BIT(15) 654 #define FLIP_IN_LB BIT(13) 655 #define QSPI_AES_DIN_READY BIT(2) 656 #define QSPI_AES_DOUT_VALID BIT(1) 657 #if defined(SLI_SI917B0) || defined(SLI_SI915) 658 #define KEY_SIZE_MASK (0x40000) 659 #define KEY_SIZE_256 BIT(16) 660 #define QSPI_KEY_SIZE_256 BIT(16) 661 662 #define DEFAULT_AES_CONFIG (0x80) 663 #define DEFAULT_AES_SEC_KEY_FRM_KH (0x9 << 1) 664 #define DEFAULT_AES_KEY_IV_VALID (0x00) 665 #endif 666 667 //XMC Flash 668 #define SR3_READ 0x15 669 #define SR1_WRITE 0x1 670 #define SR2_WRITE 0x31 671 #define SR3_WRITE 0x11 672 #endif 673 674 #ifdef __cplusplus 675 } 676 #endif 677 void initialise_m4_efuse_in_io_mode(); 678 void rsi_cmemcpy(uint8_t *dst, uint8_t *src, uint32_t len); 679 void RSI_QSPI_GPDMA_Init(uint32_t hsize, uint32_t ch_no, uint32_t mode); 680 void RSI_QSPI_GPDMA_ReadFromFifo(uint32_t src, uint32_t dst, uint32_t len, uint32_t ch_no); 681 void RSI_QSPI_ReadFromFifo(uint32_t udma_read, void *udmaHandle, void *gpdmaHandle, uint32_t ch_no); 682 void RSI_QSPI_AutoModeEn(qspi_reg_t *qspi_reg); 683 void RSI_QSPI_ConfigQspiDll(spi_config_t *spi_config, qspi_reg_t *qspi_reg); 684 void RSI_QSPI_TIMER_Config(void); 685 void qspi_semi_auto_mode_config(qspi_reg_t *qspi_reg, uint32_t addr, uint32_t hsize, uint32_t bsize, uint32_t length); 686 void RSI_QSPI_ProtectAdesto(spi_config_t *spi_config, qspi_reg_t *qspi_reg, uint32_t protection, uint32_t cs_no); 687 688 #endif // RSI_QSPI_H 689