/* SPDX-License-Identifier: Apache-2.0 */

#pragma once

/*
 * CY15B108QN FRAM Driver for Zephyr RTOS
 *
 * This driver implements the Zephyr EEPROM API. Access the FRAM using:
 *   - eeprom_read(dev, offset, buf, len)
 *   - eeprom_write(dev, offset, buf, len)
 *   - eeprom_get_size(dev)
 *
 * Example usage:
 *   #include <zephyr/drivers/eeprom.h>
 *
 *   #define FRAM_NODE DT_NODELABEL(fram)
 *   static const struct device *fram_dev = DEVICE_DT_GET(FRAM_NODE);
 *
 *   if (device_is_ready(fram_dev)) {
 *       eeprom_write(fram_dev, 0, data, len);
 *       eeprom_read(fram_dev, 0, buf, len);
 *   }
 */

/* FRAM size: 1024K x 8 = 1,048,576 bytes */
#define CY15B108QN_TOTAL_SIZE_BYTES   (1024 * 1024)
#define CY15B108QN_MAX_ADDRESS        (CY15B108QN_TOTAL_SIZE_BYTES - 1)

/* SPI opcodes (Table 2 from datasheet) */
/* Write enable control */
#define CY15B108QN_CMD_WREN           0x06  /* Set write enable latch */
#define CY15B108QN_CMD_WRDI           0x04  /* Reset write enable latch */

/* Register access */
#define CY15B108QN_CMD_RDSR           0x05  /* Read status register */
#define CY15B108QN_CMD_WRSR           0x01  /* Write status register */

/* Memory write/read */
#define CY15B108QN_CMD_WRITE          0x02  /* Write memory data */
#define CY15B108QN_CMD_READ           0x03  /* Read memory data */
#define CY15B108QN_CMD_FSTRD          0x0B  /* Fast read memory data */

/* Special sector memory access */
#define CY15B108QN_CMD_SSWR           0x42  /* Special sector write */
#define CY15B108QN_CMD_SSRD           0x4B  /* Special sector read */

/* Identification and serial number */
#define CY15B108QN_CMD_RDID           0x9F  /* Read device ID */
#define CY15B108QN_CMD_RUID           0x4C  /* Read unique ID */
#define CY15B108QN_CMD_WRSN           0xC2  /* Write serial number */
#define CY15B108QN_CMD_RDSN           0xC3  /* Read serial number */

/* Low power modes */
#define CY15B108QN_CMD_DPD            0xBA  /* Enter deep power-down */
#define CY15B108QN_CMD_HBN            0xB9  /* Enter hibernate mode */

/* Expected Device ID (Cypress CY15B108QN) */
#define CY15B108QN_MANUFACTURER_ID    0x7F  /* Cypress continuation code */
