/**
 * \addtogroup BSP
 * \{
 * \addtogroup SYSTEM
 * \{
 * \addtogroup MEMORY
 *
 * \brief QSPI flash driver framework
 * \{
 */

/**
 ****************************************************************************************
 *
 * @file qspi_common.h
 *
 * @brief QSPI flash driver common definitions
 *
 * Copyright (c) 2016, Dialog Semiconductor
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation 
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software without 
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 ****************************************************************************************
 */
#ifndef _QSPI_COMMON_H_
#define _QSPI_COMMON_H_

#include "qspi_automode.h"

/*
 * Flash Commands
 *
 * Note: Default command issuing mode is single mode! If commands specific to other modes have to be
 * issued then the mode must be changed!
 */
#define CMD_WRITE_STATUS_REGISTER       0x01
#define CMD_WRITE_DISABLE               0x04
#define CMD_READ_STATUS_REGISTER        0x05
#define CMD_WRITE_ENABLE                0x06
#define CMD_SECTOR_ERASE                0x20
#define CMD_QUAD_PAGE_PROGRAM           0x32
#define CMD_QUAD_IO_PAGE_PROGRAM        0x38
#define CMD_BLOCK_ERASE                 0x52
#define CMD_CHIP_ERASE                  0xC7
#define CMD_FAST_READ_QUAD              0xEB
#define CMD_READ_JEDEC_ID               0x9F
#define CMD_EXIT_CONTINUOUS_MODE        0xFF
#define CMD_RELEASE_POWER_DOWN          0xAB
#define CMD_ENTER_POWER_DOWN            0xB9

#define CMD_FAST_READ_QUAD_4B           0xEC
#define CMD_SECTOR_ERASE_4B             0x21
#define CMD_QUAD_PAGE_PROGRAM_4B        0x34
#define CMD_QUAD_IO_PAGE_PROGRAM_4B     0x3E

/* Erase/Write in progress */
#define FLASH_STATUS_BUSY_BIT           0
#define FLASH_STATUS_BUSY_MASK          (1 << FLASH_STATUS_BUSY_BIT)

/* WE Latch bit */
#define FLASH_STATUS_WEL_BIT            1
#define FLASH_STATUS_WEL_MASK           (1 << FLASH_STATUS_WEL_BIT)

typedef bool (*is_suspended_cb_t)(void);
typedef void (*initialize_cb_t)(uint8_t device_type, uint8_t device_density);
typedef void (*deactivate_command_entry_mode_cb_t)(void);
typedef void (*sys_clk_cfg_cb_t)(sys_clk_t type);
typedef uint8_t (*get_dummy_bytes_cb_t)(void);

/**
 * \brief QSPI Flash configuration structure
 *
 * This struct is used to define a driver for a specific QSPI flash.
 *
 * \note The struct instance must be declared as static const for this to work
 */
typedef struct qspi_flash_config {
        // Function pointers
        initialize_cb_t initialize;            /**< Flash-specific initialization */
        is_suspended_cb_t is_suspended;        /**< Check if flash is in erase/program
                                                    suspend state */
        deactivate_command_entry_mode_cb_t
                deactivate_command_entry_mode; /**< Perform extra steps needed when command
                                                    entry mode is deactivated */
        sys_clk_cfg_cb_t sys_clk_cfg;          /**< Perform Flash configuration when system clock
                                                    is changed (e.g. change dummy bytes or QSPIC
                                                    clock divider */
        get_dummy_bytes_cb_t get_dummy_bytes;  /**< Return the number of dummy bytes currently
                                                    needed (they may e.g. change when the clock
                                                    changes) */
        uint8_t manufacturer_id;               /**< The Flash JEDEC vendor ID (Cmd 0x9F, 1st byte)
                                                    This (and the device_type/device_density)
                                                    are needed for flash autodetection */
        uint8_t device_type;                   /**< The Flash JEDEC device type (Cmd 0x9F, 2nd byte) */
        uint8_t device_density;                /**< The Flash JEDEC device type (Cmd 0x9F, 3rd byte) */
        uint8_t erase_opcode;                  /**< The Flash erase opcode to use */
        uint8_t erase_suspend_opcode;          /**< The Flash erase suspend opcode to use */
        uint8_t erase_resume_opcode;           /**< The Flash erase resume opcode to use */
        uint8_t page_program_opcode;           /**< The Flash page program opcode to use */
        bool quad_page_program_address;        /**< If true, the address will be transmitted in
                                                    QUAD mode when writing a page. Otherwise, it
                                                    will be transmitted in single mode */
        uint8_t read_erase_progress_opcode;    /**< The opcode to use to check if erase is in progress
                                                    (Usually the Read Status Reg opcode (0x5)) */

        uint8_t erase_in_progress_bit;         /**< The bit to check when reading the erase progress */
        bool erase_in_progress_bit_high_level; /**< The active state (true: high, false: low) of the bit
                                                    above */
        uint8_t send_once;                     /**< If set to 1, the "Performance mode" (or burst, or
                                                    continuous; differs per vendor) will be used for read
                                                    accesses. In this mode, the read opcode is only sent
                                                    once, and subsequent accesses only transfer the address */
        uint8_t extra_byte;                    /**< The extra byte to transmit, when in "Performance mode"
                                                    (send once is 1), that tells the flash that it should
                                                    stay in this continuous, performance mode */
        HW_QSPI_ADDR_SIZE address_size;        /**< Whether the flash works in 24- or 32-bit addressing mode */
        HW_QSPI_BREAK_SEQ_SIZE break_seq_size; /**< Whether the break sequence, that puts flash out of the
                                                    continuous mode, is one or two bytes long (the break byte is
                                                    0xFF) */
        qspi_ucode_t ucode_wakeup;             /**< The QSPIC microcode to use to setup the flash on wakeup. This
                                                    is automatically used by the QSPI Controller after wakeup, and
                                                    before CPU starts code execution. This is different based on
                                                    whether flash was active, in deep power down or completely off
                                                    while the system was sleeping */
        uint16_t power_down_delay;             /**< This is the time, in usec, needed for the flash to go to power
                                                    down, after the Power Down command is issued */
        uint16_t release_power_down_delay;     /**< This is the time, in usec, needed for the flash to exit the power
                                                    down mode, after the Release Power Down command is issued */
} qspi_flash_config_t;

extern const qspi_flash_config_t* flash_config_init;
#if (FLASH_AUTODETECT == 1)
extern qspi_flash_config_t *flash_config;
#else
extern const qspi_flash_config_t * const flash_config;
#endif

static void qspi_write(const uint8_t *wbuf, size_t wlen);
static void qspi_transact(const uint8_t *wbuf, size_t wlen, uint8_t *rbuf, size_t rlen);
static uint8_t flash_read_status_register(void);
static void flash_write_status_register(uint8_t value);
static void flash_write_enable(void);
static void qspi_automode_set_dummy_bytes_count(uint8_t count);
static bool flash_is_busy(void);
static inline bool flash_erase_program_in_progress(void);

#endif /* _QSPI_COMMON_H_ */
/**
 * \}
 * \}
 * \}
 */
