blob: 86c824cf485614255dc94887e8004650ec10b3b4 [file] [log] [blame]
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __FLASH_MSPI_NOR_H__
#define __FLASH_MSPI_NOR_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <zephyr/drivers/flash.h>
#include <zephyr/drivers/mspi.h>
#include "jesd216.h"
#include "spi_nor.h"
#if DT_ANY_INST_HAS_PROP_STATUS_OKAY(supply_gpios)
#define WITH_SUPPLY_GPIO 1
#endif
#if DT_ANY_INST_HAS_PROP_STATUS_OKAY(reset_gpios)
#define WITH_RESET_GPIO 1
#endif
#if DT_ANY_INST_HAS_BOOL_STATUS_OKAY(initial_soft_reset)
#define WITH_SOFT_RESET 1
#endif
#define CMD_EXTENSION_NONE 0
#define CMD_EXTENSION_SAME 1
#define CMD_EXTENSION_INVERSE 2
#define OCTAL_ENABLE_REQ_NONE 0
#define OCTAL_ENABLE_REQ_S2B3 1
#define ENTER_4BYTE_ADDR_NONE 0
#define ENTER_4BYTE_ADDR_B7 1
#define ENTER_4BYTE_ADDR_06_B7 2
struct flash_mspi_nor_cmd_info {
uint8_t read_cmd;
uint8_t read_mode_bit_cycles : 3;
uint8_t read_dummy_cycles : 5;
uint8_t pp_cmd;
bool uses_4byte_addr : 1;
/* BFP, 18th DWORD, bits 30-29 */
uint8_t cmd_extension : 2;
/* xSPI Profile 1.0 (ID FF05), 1st DWORD: */
/* - Read SFDP command address bytes: 4 (true) or 3 */
bool sfdp_addr_4 : 1;
/* - Read SDFP command dummy cycles: 20 (true) or 8 */
bool sfdp_dummy_20 : 1;
/* - Read Status Register command address bytes: 4 (true) or 0 */
bool rdsr_addr_4 : 1;
/* - Read Status Register command dummy cycles: 0, 4, or 8 */
uint8_t rdsr_dummy : 4;
/* - Read JEDEC ID command parameters; not sure where to get their
* values from, but since for many flash chips they are the same
* as for RDSR, those are taken as defaults, see DEFAULT_CMD_INFO()
*/
bool rdid_addr_4 : 1;
uint8_t rdid_dummy : 4;
};
struct flash_mspi_nor_switch_info {
uint8_t quad_enable_req : 3;
uint8_t octal_enable_req : 3;
uint8_t enter_4byte_addr : 2;
};
struct flash_mspi_nor_config {
const struct device *bus;
uint32_t flash_size;
uint16_t page_size;
struct mspi_dev_id mspi_id;
struct mspi_dev_cfg mspi_nor_cfg;
struct mspi_dev_cfg mspi_nor_init_cfg;
#if defined(CONFIG_MSPI_XIP)
struct mspi_xip_cfg xip_cfg;
#endif
#if defined(WITH_SUPPLY_GPIO)
struct gpio_dt_spec supply;
#endif
#if defined(WITH_RESET_GPIO)
struct gpio_dt_spec reset;
uint32_t reset_pulse_us;
#endif
uint32_t reset_recovery_us;
uint32_t transfer_timeout;
#if defined(CONFIG_FLASH_PAGE_LAYOUT)
struct flash_pages_layout layout;
#endif
uint8_t jedec_id[SPI_NOR_MAX_ID_LEN];
struct flash_mspi_nor_quirks *quirks;
const struct jesd216_erase_type *default_erase_types;
struct flash_mspi_nor_cmd_info default_cmd_info;
struct flash_mspi_nor_switch_info default_switch_info;
bool jedec_id_specified : 1;
bool rx_dummy_specified : 1;
bool multiperipheral_bus : 1;
bool multi_io_cmd : 1;
bool single_io_addr : 1;
bool initial_soft_reset : 1;
};
struct flash_mspi_nor_data {
#if defined(CONFIG_MULTITHREADING)
struct k_sem acquired;
#endif
struct mspi_xfer_packet packet;
struct mspi_xfer xfer;
struct jesd216_erase_type erase_types[JESD216_NUM_ERASE_TYPES];
struct flash_mspi_nor_cmd_info cmd_info;
struct flash_mspi_nor_switch_info switch_info;
bool in_target_io_mode;
};
#ifdef __cplusplus
}
#endif
#endif /*__FLASH_MSPI_NOR_H__*/