RV32 SoC DS UG
High-Perf RV32 SoC DS UG
RV64 SoC DS UG API and Examples
Embedded IDE UG
Loading...
Searching...
No Matches
spiFlash.h
Go to the documentation of this file.
1
2// Copyright (C) 2013-2026 Efinix Inc. All rights reserved.
3// Full license header bsp/efinix/EfxSapphireSocRV64/include/LICENSE.MD
5
6#ifndef SPI_FLASH_H
7#define SPI_FLASH_H
8
19
20#include <string.h>
21#include "spi/spi.h"
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28// ToDo:
29// Add spiFlash_read that handle multi-read support (Single,Dual,Quad) based on user's struct.
30// Add spiFlash_write that handle multi-write support (Single,Dual,Quad) based on user's struct.
31// Add a safe guard where it set to single line mode when configure flash such as write/read status reg.
32
83
84/* ========================================================================== */
85/* SUB-GROUP : REGISTER DEFINITIONS */
86/* ========================================================================== */
87
94
100 #define CMD_READ_JEDEC_ID 0x9F
101 #define CMD_READ_DEVICE_ID 0xAB
103
109 #define CMD_READ_STATUS_REG_1 0x05
110 #define CMD_READ_STATUS_REG_2 0x35
111 #define CMD_READ_STATUS_REG_3 0x15
112 #define CMD_WRITE_STATUS_REG_1 0x01
113 #define CMD_WRITE_STATUS_REG_2 0x31
114 #define CMD_WRITE_STATUS_REG_3 0x11
116
122 #define CMD_PAGE_PROGRAM 0x02
123 #define CMD_QUAD_PAGE_PROGRAM 0x32
124 #define CMD_WRITE_ENABLE 0x06
125 #define CMD_WRITE_DISABLE 0x04
127
133 #define CMD_READ_DATA 0x03
134 #define CMD_FAST_READ 0x0B
135 #define CMD_DUAL_OUTPUT_READ 0x3B
136 #define CMD_QUAD_OUTPUT_READ 0x6B
138
144 #define CMD_RELEASE_DEEP_POWER_DOWN 0xAB
145 #define CMD_ENABLE_RESET 0x66
146 #define CMD_RESET_DEVICE 0x99
147 #define CMD_GLOBAL_LOCK 0x7E
148 #define CMD_GLOBAL_UNLOCK 0x98
149 #define CMD_ENABLE_QPI 0x38
151
158 #define CMD_ENTER_4B 0xB7
159 #define CMD_EXIT_4B 0xE9
160 #define CMD_EXIT_4B_ISSI 0x29
161 #define CMD_DUAL_OUTPUT_READ_4B 0x3C
162 #define CMD_QUAD_OUTPUT_READ_4B 0x6C
163 #define CMD_READ_4B 0x13
164 #define CMD_PROGRAM_4B 0x12
165 #define CMD_SECTOR_ERASE 0x20
166 #define CMD_ERASE_4K_4B 0x21
167 #define CMD_ERASE_64K_4B 0xDC
169
174 #define QE_BIT6 0x40
175 #define QE_BIT1 0x02
176 #define WEL_BIT 0x02
178 // End of SPI_FLASH_Macros group
180
181
182/* ========================================================================== */
183/* SUB-GROUP : Data Types */
184/* ========================================================================== */
185
204
205 // End of SPI_FLASH_ENUM group
207
208/* ========================================================================== */
209/* SUB-GROUP : DATA STRUCTS */
210/* ========================================================================== */
245 // End of SPI_FLASH_Types group
247
248/* ========================================================================== */
249/* SUB-GROUP: FUNCTIONS */
250/* ========================================================================== */
251
258
276
285 #define spiFlash_register(table) \
286 spiFlash_registerFlash((table), sizeof(table) / sizeof((table)[0]))
287
296 void spiFlash_registerFlash(const spiFlash_info_t *table, size_t count);
297
305
325
327
338
345
357 const spiFlash_info_t * spiFlash_lookup(u32 detected_id);
358
370
378
389
396
406 u8 spiFlash_write_single(spiFlash_instance_t *flash, u32 flashAddress, u8 *src, u32 len);
407
415 void spiFlash_read_single(spiFlash_instance_t *flash, u32 flashAddress, u8 *buffer, u32 len);
416
425 void spiFlash_f2m_single(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
426
436 void spiFlash_f2m_dual(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
437
447 void spiFlash_f2m_quad(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
448
449
451
462
469
475
481
487
493
499
505 void spiFlash_eraseSector(spiFlash_instance_t *flash, u32 flashAddress);
507 // End of SPI_FLASHFunc
509
510
511/* ========================================================================== */
512/* SUB-GROUP: Internal FUNCTIONS */
513/* ========================================================================== */
514
521 static void spiFlash_wake_(spiFlash_instance_t *flash);
522
528 static u8 spiFlash_readId_(spiFlash_instance_t *flash);
534 static u32 spiFlash_readJedecId_(spiFlash_instance_t *flash);
535
540 static void spiFlash_f2m_single_(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
541 static void spiFlash_f2m_dual_(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
542 static void spiFlash_f2m_quad_(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size);
543
544
545#ifdef __cplusplus
546}
547#endif
548 // End of MAIN SPI_FLASH Group
550
551#endif // SPI_FLASH_H
spiFlash_status_t
SPI Flash transfer mode configuration.
Definition spiFlash.h:199
@ SPI_FLASH_OK
Successful Operation.
Definition spiFlash.h:200
@ SPI_FLASH_ERR
Unknown JEDEC ID, Electrical failure (0x00/0xFF).
Definition spiFlash.h:201
@ SPI_FLASH_SKIP
Skip the function.
Definition spiFlash.h:202
u8 spiFlash_write_single(spiFlash_instance_t *flash, u32 flashAddress, u8 *src, u32 len)
Write N byte to Flash using standard write mode via single Data Line.
Definition spiFlash.c:249
void spiFlash_writeStatusReg(spiFlash_instance_t *flash, u8 data)
Write Status Register.
Definition spiFlash.c:313
void spiFlash_eraseSector(spiFlash_instance_t *flash, u32 flashAddress)
Erases a sector of the SPI flash given an address.
Definition spiFlash.c:455
void spiFlash_f2m_dual(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size)
This function read data from FlashAddress and copy to memoryAddress of specific size with dual data l...
Definition spiFlash.c:329
void spiFlash_enableQPI(spiFlash_instance_t *flash)
Set Write Enable Latch and send CMD 0x38 to enable QPI Mode.
Definition spiFlash.c:373
spiFlash_status_t spiFlash_probe(spiFlash_instance_t *flash)
Main wrapper function to initialize the SPI Flash.
Definition spiFlash.c:62
void spiFlash_unlockGlobal(spiFlash_instance_t *flash)
Globally unlocks the SPI flash.
Definition spiFlash.c:427
void spiFlash_applyConfig(spiFlash_instance_t *flash)
Apply stored SPI Flash configuration to hardware.
Definition spiFlash.c:94
spiFlash_status_t spiFlash_verify(spiFlash_instance_t *flash)
Verify spiFlash.
Definition spiFlash.c:164
spiFlash_status_t spiFlash_waitBusy(spiFlash_instance_t *flash)
Wait for spiFlash to be free.
Definition spiFlash.c:436
u8 spiFlash_readId(spiFlash_instance_t *flash)
Select and Read Device ID from spiFlash.
Definition spiFlash.c:125
void spiFlash_read_single(spiFlash_instance_t *flash, u32 flashAddress, u8 *buffer, u32 len)
Read N byte from Flash using standard read mode via single Data Line.
Definition spiFlash.c:270
u8 spiFlash_readStatusReg(spiFlash_instance_t *flash)
Read Status Register.
Definition spiFlash.c:294
void spiFlash_f2m_quad(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size)
This function read data from FlashAddress and copy to memoryAddress of specific size with quad data l...
Definition spiFlash.c:336
void spiFlash_applyQuirks(spiFlash_instance_t *flash)
Handle those spiFlash that have unique register/way.
Definition spiFlash.c:189
u8 spiFlash_exit4ByteAddr(spiFlash_instance_t *flash)
Exit 4-byte addressing.
Definition spiFlash.c:400
void spiFlash_enableWrite(spiFlash_instance_t *flash)
Set Write Enable Latch (WEL) to 1.
Definition spiFlash.c:392
u32 spiFlash_readJedecId(spiFlash_instance_t *flash)
Select and read JEDEC ID from spiFlash.
Definition spiFlash.c:134
const spiFlash_info_t * spiFlash_lookup(u32 detected_id)
Identify SPI Flash by looking up User Flash Table and known flash table.
Definition spiFlash.c:143
void spiFlash_lockGlobal(spiFlash_instance_t *flash)
Globally locks the SPI flash.
Definition spiFlash.c:418
void spiFlash_enableQuadMode(spiFlash_instance_t *flash)
Set Write Enable Latch and set Quad Enable bit to enable Quad Mode.
Definition spiFlash.c:349
void spiFlash_f2m_single(spiFlash_instance_t *flash, u32 flashAddress, uintptr_t memoryAddress, u32 size)
This function read data from FlashAddress and copy to memoryAddress of specific size with single data...
Definition spiFlash.c:322
void spiFlash_registerFlash(const spiFlash_info_t *table, size_t count)
Register Custom Flash to the driver.
Definition spiFlash.c:27
void spiFlash_wake(spiFlash_instance_t *flash)
Select spi and wake up SPI Flash.
Definition spiFlash.c:100
void spiFlash_initController(spiFlash_instance_t *flash)
Initialize SPI setting.
Definition spiFlash.c:33
SPI driver API definitions.
SPI Flash Device Database and Capability Flags.
SPI instance. Holds the software registers and hardware pointer.
Definition spi.h:236
SPI Flash Device Descriptor.
SPI Flash instance structure.
Definition spiFlash.h:232
u8 cs
Chip select.
Definition spiFlash.h:236
u32 detected_id
JEDEC_ID = Manu_id, mem_type, capacity.
Definition spiFlash.h:235
u8 cmd_exit_4byte
CMD for exit 4 byte addressing.
Definition spiFlash.h:241
u8 mask_qe
CMD for Quad Enable Bit.
Definition spiFlash.h:242
u8 cmd_wr_status
CMD for Write Status.
Definition spiFlash.h:240
const spiFlash_info_t * info
Flash Descriptor.
Definition spiFlash.h:234
u8 cmd_rd_status
CMD for Read Status.
Definition spiFlash.h:239
spi_instance_t * inst
Pointer to shared SPI Master.
Definition spiFlash.h:233
uint8_t u8
Definition type.h:30
uint32_t u32
Definition type.h:26