1 /* 2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 /*******************************************************************************************************************//** 8 * @addtogroup QSPI 9 * @{ 10 **********************************************************************************************************************/ 11 12 #ifndef R_QSPI_H 13 #define R_QSPI_H 14 15 /*********************************************************************************************************************** 16 * Includes 17 **********************************************************************************************************************/ 18 #include "bsp_api.h" 19 #include <string.h> 20 #include "r_qspi_cfg.h" 21 #include "r_spi_flash_api.h" 22 23 /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ 24 FSP_HEADER 25 26 /*********************************************************************************************************************** 27 * Macro definitions 28 **********************************************************************************************************************/ 29 30 #define QSPI_DEVICE_START_ADDRESS (0x60000000) 31 32 /*********************************************************************************************************************** 33 * Typedef definitions 34 **********************************************************************************************************************/ 35 36 /* Minimum QSPCLK cycles for QSSL to remain high between operations. */ 37 typedef enum e_qspi_qssl_min_high_level 38 { 39 QSPI_QSSL_MIN_HIGH_LEVEL_1_QSPCLK, ///< QSSL deselected for at least 1 QSPCLK 40 QSPI_QSSL_MIN_HIGH_LEVEL_2_QSPCLK, ///< QSSL deselected for at least 2 QSPCLK 41 QSPI_QSSL_MIN_HIGH_LEVEL_3_QSPCLK, ///< QSSL deselected for at least 3 QSPCLK 42 QSPI_QSSL_MIN_HIGH_LEVEL_4_QSPCLK, ///< QSSL deselected for at least 4 QSPCLK 43 QSPI_QSSL_MIN_HIGH_LEVEL_5_QSPCLK, ///< QSSL deselected for at least 5 QSPCLK 44 QSPI_QSSL_MIN_HIGH_LEVEL_6_QSPCLK, ///< QSSL deselected for at least 6 QSPCLK 45 QSPI_QSSL_MIN_HIGH_LEVEL_7_QSPCLK, ///< QSSL deselected for at least 7 QSPCLK 46 QSPI_QSSL_MIN_HIGH_LEVEL_8_QSPCLK, ///< QSSL deselected for at least 8 QSPCLK 47 QSPI_QSSL_MIN_HIGH_LEVEL_9_QSPCLK, ///< QSSL deselected for at least 9 QSPCLK 48 QSPI_QSSL_MIN_HIGH_LEVEL_10_QSPCLK, ///< QSSL deselected for at least 10 QSPCLK 49 QSPI_QSSL_MIN_HIGH_LEVEL_11_QSPCLK, ///< QSSL deselected for at least 11 QSPCLK 50 QSPI_QSSL_MIN_HIGH_LEVEL_12_QSPCLK, ///< QSSL deselected for at least 12 QSPCLK 51 QSPI_QSSL_MIN_HIGH_LEVEL_13_QSPCLK, ///< QSSL deselected for at least 13 QSPCLK 52 QSPI_QSSL_MIN_HIGH_LEVEL_14_QSPCLK, ///< QSSL deselected for at least 14 QSPCLK 53 QSPI_QSSL_MIN_HIGH_LEVEL_15_QSPCLK, ///< QSSL deselected for at least 15 QSPCLK 54 QSPI_QSSL_MIN_HIGH_LEVEL_16_QSPCLK, ///< QSSL deselected for at least 16 QSPCLK 55 } qspi_qssl_min_high_level_t; 56 57 /* QSPCLK divider. */ 58 typedef enum e_qspi_qspclk_div 59 { 60 QSPI_QSPCLK_DIV_2 = 0x0, ///< QSPCLK = PCLK / 2 61 QSPI_QSPCLK_DIV_3 = 0x1, ///< QSPCLK = PCLK / 3 62 QSPI_QSPCLK_DIV_4 = 0x2, ///< QSPCLK = PCLK / 4 63 QSPI_QSPCLK_DIV_5 = 0x3, ///< QSPCLK = PCLK / 5 64 QSPI_QSPCLK_DIV_6 = 0x4, ///< QSPCLK = PCLK / 6 65 QSPI_QSPCLK_DIV_7 = 0x5, ///< QSPCLK = PCLK / 7 66 QSPI_QSPCLK_DIV_8 = 0x6, ///< QSPCLK = PCLK / 8 67 QSPI_QSPCLK_DIV_9 = 0x7, ///< QSPCLK = PCLK / 9 68 QSPI_QSPCLK_DIV_10 = 0x8, ///< QSPCLK = PCLK / 10 69 QSPI_QSPCLK_DIV_11 = 0x9, ///< QSPCLK = PCLK / 11 70 QSPI_QSPCLK_DIV_12 = 0xA, ///< QSPCLK = PCLK / 12 71 QSPI_QSPCLK_DIV_13 = 0xB, ///< QSPCLK = PCLK / 13 72 QSPI_QSPCLK_DIV_14 = 0xC, ///< QSPCLK = PCLK / 14 73 QSPI_QSPCLK_DIV_15 = 0xD, ///< QSPCLK = PCLK / 15 74 QSPI_QSPCLK_DIV_16 = 0xE, ///< QSPCLK = PCLK / 16 75 QSPI_QSPCLK_DIV_17 = 0xF, ///< QSPCLK = PCLK / 17 76 QSPI_QSPCLK_DIV_18 = 0x10, ///< QSPCLK = PCLK / 18 77 QSPI_QSPCLK_DIV_20 = 0x11, ///< QSPCLK = PCLK / 20 78 QSPI_QSPCLK_DIV_22 = 0x12, ///< QSPCLK = PCLK / 22 79 QSPI_QSPCLK_DIV_24 = 0x13, ///< QSPCLK = PCLK / 24 80 QSPI_QSPCLK_DIV_26 = 0x14, ///< QSPCLK = PCLK / 26 81 QSPI_QSPCLK_DIV_28 = 0x15, ///< QSPCLK = PCLK / 28 82 QSPI_QSPCLK_DIV_30 = 0x16, ///< QSPCLK = PCLK / 30 83 QSPI_QSPCLK_DIV_32 = 0x17, ///< QSPCLK = PCLK / 32 84 QSPI_QSPCLK_DIV_34 = 0x18, ///< QSPCLK = PCLK / 34 85 QSPI_QSPCLK_DIV_36 = 0x19, ///< QSPCLK = PCLK / 36 86 QSPI_QSPCLK_DIV_38 = 0x1A, ///< QSPCLK = PCLK / 38 87 QSPI_QSPCLK_DIV_40 = 0x1B, ///< QSPCLK = PCLK / 40 88 QSPI_QSPCLK_DIV_42 = 0x1C, ///< QSPCLK = PCLK / 42 89 QSPI_QSPCLK_DIV_44 = 0x1D, ///< QSPCLK = PCLK / 44 90 QSPI_QSPCLK_DIV_46 = 0x1E, ///< QSPCLK = PCLK / 46 91 QSPI_QSPCLK_DIV_48 = 0x1F, ///< QSPCLK = PCLK / 48 92 } qspi_qspclk_div_t; 93 94 /* Extended configuration. */ 95 typedef struct st_qspi_extended_cfg 96 { 97 qspi_qssl_min_high_level_t min_qssl_deselect_cycles; ///< Minimum QSSL deselect time 98 qspi_qspclk_div_t qspclk_div; ///< QSPCLK divider 99 } qspi_extended_cfg_t; 100 101 /** Instance control block. DO NOT INITIALIZE. Initialization occurs when @ref spi_flash_api_t::open is called */ 102 typedef struct st_qspi_instance_ctrl 103 { 104 spi_flash_cfg_t const * p_cfg; // Pointer to initial configuration 105 spi_flash_data_lines_t data_lines; // Data lines 106 uint32_t total_size_bytes; // Total size of the flash in bytes 107 uint32_t open; // Whether or not driver is open 108 } qspi_instance_ctrl_t; 109 110 /********************************************************************************************************************** 111 * Exported global variables 112 **********************************************************************************************************************/ 113 114 /** @cond INC_HEADER_DEFS_SEC */ 115 /** Filled in Interface API structure for this Instance. */ 116 extern const spi_flash_api_t g_qspi_on_spi_flash; 117 118 /** @endcond */ 119 120 fsp_err_t R_QSPI_Open(spi_flash_ctrl_t * p_ctrl, spi_flash_cfg_t const * const p_cfg); 121 fsp_err_t R_QSPI_Close(spi_flash_ctrl_t * p_ctrl); 122 fsp_err_t R_QSPI_DirectWrite(spi_flash_ctrl_t * p_ctrl, 123 uint8_t const * const p_src, 124 uint32_t const bytes, 125 bool const read_after_write); 126 fsp_err_t R_QSPI_DirectRead(spi_flash_ctrl_t * p_ctrl, uint8_t * const p_dest, uint32_t const bytes); 127 fsp_err_t R_QSPI_SpiProtocolSet(spi_flash_ctrl_t * p_ctrl, spi_flash_protocol_t spi_protocol); 128 fsp_err_t R_QSPI_XipEnter(spi_flash_ctrl_t * p_ctrl); 129 fsp_err_t R_QSPI_XipExit(spi_flash_ctrl_t * p_ctrl); 130 fsp_err_t R_QSPI_Write(spi_flash_ctrl_t * p_ctrl, 131 uint8_t const * const p_src, 132 uint8_t * const p_dest, 133 uint32_t byte_count); 134 fsp_err_t R_QSPI_Erase(spi_flash_ctrl_t * p_ctrl, uint8_t * const p_device_address, uint32_t byte_count); 135 fsp_err_t R_QSPI_StatusGet(spi_flash_ctrl_t * p_ctrl, spi_flash_status_t * const p_status); 136 fsp_err_t R_QSPI_BankSet(spi_flash_ctrl_t * p_ctrl, uint32_t bank); 137 fsp_err_t R_QSPI_DirectTransfer(spi_flash_ctrl_t * p_ctrl, 138 spi_flash_direct_transfer_t * const p_transfer, 139 spi_flash_direct_transfer_dir_t direction); 140 fsp_err_t R_QSPI_AutoCalibrate(spi_flash_ctrl_t * p_ctrl); 141 142 /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ 143 FSP_FOOTER 144 145 #endif 146 147 /*******************************************************************************************************************//** 148 * @} (end defgroup QSPI) 149 **********************************************************************************************************************/ 150