/* SPDX-License-Identifier: BSD-3-Clause */ /* * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd. */ #ifndef _HAL_SFC_NOR_H_ #define _HAL_SFC_NOR_H_ /***************************** Structure Definition **************************/ #define SPI_NOR_MAX_CMD_SIZE 8 #define SNOR_SPEED_MAX 133000000 #define SNOR_SPEED_DEFAULT 80000000 #define SNOR_PROTO_STR(a, b, c) (((a) << 8) | ((b) << 4) | (c)) #define SNOR_GET_PROTOCOL_ADDR_BITS(proto) (((proto) >> 4) & 0xf) #define SNOR_GET_PROTOCOL_DATA_BITS(proto) ((proto) & 0xf) enum SPI_NOR_PROTOCOL { SNOR_PROTO_1_1_1 = SNOR_PROTO_STR(1, 1, 1), SNOR_PROTO_1_1_2 = SNOR_PROTO_STR(1, 1, 2), SNOR_PROTO_1_1_4 = SNOR_PROTO_STR(1, 1, 4), SNOR_PROTO_1_1_8 = SNOR_PROTO_STR(1, 1, 8), SNOR_PROTO_1_2_2 = SNOR_PROTO_STR(1, 2, 2), SNOR_PROTO_1_4_4 = SNOR_PROTO_STR(1, 4, 4), SNOR_PROTO_1_8_8 = SNOR_PROTO_STR(1, 8, 8), SNOR_PROTO_2_2_2 = SNOR_PROTO_STR(2, 2, 2), SNOR_PROTO_4_4_4 = SNOR_PROTO_STR(4, 4, 4), SNOR_PROTO_8_8_8 = SNOR_PROTO_STR(8, 8, 8), }; /* Flash opcodes. */ #define SPINOR_OP_WREN 0x06 /**< Write enable */ #define SPINOR_OP_RDSR 0x05 /**< Read status register */ #define SPINOR_OP_WRSR 0x01 /**< Write status register 1 byte */ #define SPINOR_OP_RDSR1 0x35 /**< Read status register 1 */ #define SPINOR_OP_WRSR1 0x31 /**< Write status register 1 */ #define SPINOR_OP_RDSR2 0x15 /**< Read status register 2 */ #define SPINOR_OP_WRSR2 0x3e /**< Write status register 2 */ #define SPINOR_OP_READ 0x03 /**< Read data bytes (low frequency) */ #define SPINOR_OP_READ_FAST 0x0b /**< Read data bytes (high frequency) */ #define SPINOR_OP_READ_1_1_2 0x3b /**< Read data bytes (Dual Output SPI) */ #define SPINOR_OP_READ_1_2_2 0xbb /**< Read data bytes (Dual I/O SPI) */ #define SPINOR_OP_READ_1_1_4 0x6b /**< Read data bytes (Quad Output SPI) */ #define SPINOR_OP_READ_1_4_4 0xeb /**< Read data bytes (Quad I/O SPI) */ #define SPINOR_OP_READ_EC 0xec /**< Read data bytes (Quad I/O SPI) 4 byte address */ #define SPINOR_OP_PP 0x02 /**< Page program (up to 256 bytes) */ #define SPINOR_OP_PP_1_1_4 0x32 /**< Quad page program */ #define SPINOR_OP_PP_1_4_4 0x38 /**< Quad page program */ #define SPINOR_OP_BE_4K 0x20 /**< Erase 4KiB block */ #define SPINOR_OP_BE_4K_PMC 0xd7 /**< Erase 4KiB block on PMC chips */ #define SPINOR_OP_BE_32K 0x52 /**< Erase 32KiB block */ #define SPINOR_OP_CHIP_ERASE 0xc7 /**< Erase whole flash chip */ #define SPINOR_OP_SE 0xd8 /**< Sector erase (usually 64KiB) */ #define SPINOR_OP_RDID 0x9f /**< Read JEDEC ID */ #define SPINOR_OP_RDSFDP 0x5a /**< Read SFDP */ #define SPINOR_OP_RDCR 0x15 /**< Read configuration register */ #define SPINOR_OP_WRCR 0x11 /**< Write configuration register */ #define SPINOR_OP_RDFSR 0x70 /**< Read flag status register */ #define SPINOR_OP_CLFSR 0x50 /**< Clear flag status register */ #define SPINOR_OP_RDEAR 0xc8 /**< Read Extended Address Register */ #define SPINOR_OP_WREAR 0xc5 /**< Write Extended Address Register */ #define SPINOR_OP_READ_UUID 0x4b /**< Read SPI Nor UUID */ #define SPINOR_OP_READ_SFDP 0x5A /**< Read SPI Nor SFDP */ struct SPI_NOR { struct HAL_FSPI_HOST *spi; const struct FLASH_INFO *info; UINT32 pageSize; UINT8 addrWidth; UINT8 eraseOpcodeSec; UINT8 eraseOpcodeBlk; UINT8 readOpcode; UINT8 readDummy; UINT8 programOpcode; enum SPI_NOR_PROTOCOL readProto; enum SPI_NOR_PROTOCOL writeProto; UINT8 cmdBuf[SPI_NOR_MAX_CMD_SIZE]; UINT32 size; UINT32 sectorSize; UINT32 eraseSize; }; typedef enum { ERASE_SECTOR = 0, ERASE_BLOCK64K, ERASE_CHIP } NOR_ERASE_TYPE; RETURN_STATUS HAL_SNOR_Init(struct SPI_NOR *nor); RETURN_STATUS HAL_SNOR_DeInit(struct SPI_NOR *nor); UINT32 HAL_SNOR_GetCapacity(struct SPI_NOR *nor); RETURN_STATUS HAL_SNOR_ReadID(struct SPI_NOR *nor, UINT8 *data); RETURN_STATUS HAL_SNOR_ReadData(struct SPI_NOR *nor, UINT32 from, void *buf, UINT32 len); RETURN_STATUS HAL_SNOR_ProgData(struct SPI_NOR *nor, UINT32 to, void *buf, UINT32 len); RETURN_STATUS HAL_SNOR_Read(struct SPI_NOR *nor, UINT32 sec, UINT32 nSec, void *pData); RETURN_STATUS HAL_SNOR_Write(struct SPI_NOR *nor, UINT32 sec, UINT32 nSec, void *pData); RETURN_STATUS HAL_SNOR_OverWrite(struct SPI_NOR *nor, UINT32 sec, UINT32 nSec, void *pData); RETURN_STATUS HAL_SNOR_Erase(struct SPI_NOR *nor, UINT32 addr, NOR_ERASE_TYPE EraseType); BOOLEAN HAL_SNOR_IsFlashSupported(UINT8 *flashId); RETURN_STATUS HAL_SNOR_ReadUUID(struct SPI_NOR *nor, void *buf); #endif