/**
 * \addtogroup BSP
 * \{
 * \addtogroup SYSTEM
 * \{
 * \addtogroup MEMORY
 *
 * \{
 */

/**
 ****************************************************************************************
 *
 * @file qspi_w25q80ew.h
 *
 * @brief QSPI flash driver for the Winbond W25Q80EW
 *
 * 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_W32Q80EW_H_
#define _QSPI_W32Q80EW_H_

#ifndef WINBOND_ID
#define WINBOND_ID      0xEF
#endif

// Device type using command 0x9F
#define W25Q80EW        0x60

#ifndef W25Q_8Mb_SIZE
#define W25Q_8Mb_SIZE   0x14
#endif

#if (FLASH_AUTODETECT == 1) || (dg_configFLASH_MANUFACTURER_ID == WINBOND_ID && \
        dg_configFLASH_DEVICE_TYPE == W25Q80EW && dg_configFLASH_DENSITY == W25Q_8Mb_SIZE)

#include "qspi_common.h"

#include "qspi_winbond.h"

static void flash_w25q80ew_sys_clock_cfg(sys_clk_t sys_clk);
static uint8_t flash_w25q80ew_get_dummy_bytes(void);

static const qspi_flash_config_t flash_w25q80ew_config = {
        .manufacturer_id               = WINBOND_ID,
        .device_type                   = W25Q80EW,
        .device_density                = W25Q_8Mb_SIZE,
        .is_suspended                  = flash_w25q_is_suspended,
        .initialize                    = flash_w25q_initialize,
        .deactivate_command_entry_mode = flash_w25q_deactivate_command_entry_mode,
        .sys_clk_cfg                   = flash_w25q80ew_sys_clock_cfg,
        .get_dummy_bytes               = flash_w25q80ew_get_dummy_bytes,
        .break_seq_size                = HW_QSPI_BREAK_SEQ_SIZE_1B,
        .address_size                  = HW_QSPI_ADDR_SIZE_24,
        .page_program_opcode           = CMD_QUAD_PAGE_PROGRAM,
        .quad_page_program_address     = false,
        .erase_opcode                  = CMD_SECTOR_ERASE,
        .erase_suspend_opcode          = W25Q_ERASE_PROGRAM_SUSPEND,
        .erase_resume_opcode           = W25Q_ERASE_PROGRAM_RESUME,
        .read_erase_progress_opcode    = CMD_READ_STATUS_REGISTER,
        .erase_in_progress_bit         = FLASH_STATUS_BUSY_BIT,
        .erase_in_progress_bit_high_level = true,
        .send_once                     = 1,
        .extra_byte                    = 0xA0,
        .ucode_wakeup                  = {w25q_ucode_wakeup, sizeof(w25q_ucode_wakeup)},
        .power_down_delay              = W25Q_POWER_DOWN_DELAY_US,
        .release_power_down_delay      = W25Q_RELEASE_POWER_DOWN_DELAY_US,
};

#if (FLASH_AUTODETECT == 0)
        const qspi_flash_config_t* const flash_config = &flash_w25q80ew_config;
#endif

QSPI_SECTION static void flash_w25q80ew_sys_clock_cfg(sys_clk_t sys_clk)
{

}

QSPI_SECTION static uint8_t flash_w25q80ew_get_dummy_bytes(void)
{
        return 2;
}
#endif

#endif /* _QSPI_W32Q80EW_H_ */
/**
 * \}
 * \}
 * \}
 */
