1 /**************************************************************************//** 2 * @file hbi.h 3 * @version V1.00 4 * @brief M460 series HBI driver header file 5 * 6 * @copyright SPDX-License-Identifier: Apache-2.0 7 * @copyright Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. 8 *****************************************************************************/ 9 #ifndef __HBI_H__ 10 #define __HBI_H__ 11 12 /*---------------------------------------------------------------------------------------------------------*/ 13 /* Include related headers */ 14 /*---------------------------------------------------------------------------------------------------------*/ 15 16 #ifdef __cplusplus 17 extern "C" 18 { 19 #endif 20 21 22 /** @addtogroup Standard_Driver Standard Driver 23 @{ 24 */ 25 26 /** @addtogroup HyperBus Interface Driver 27 @{ 28 */ 29 30 31 /** @addtogroup HBI_EXPORTED_CONSTANTS HBI Exported Constants 32 @{ 33 */ 34 35 /*---------------------------------------------------------------------------------------------------------*/ 36 /* HyperRAM memory mapping address*/ 37 #define HYPERRAM_BASE 0x80000000 38 /*---------------------------------------------------------------------------------------------------------*/ 39 /* HyperRAM Register Space constant definitions 40 Register Space Range: 41 0x0000_0000 = Identification Register 0 42 0x0000_0002 = Identification Register 1 43 0x0000_1000 = Configuration Register 0 44 0x0000_1002 = Configuration Register 1 45 */ 46 #define HYPERRAM_ID_REG0 0x00000000 47 #define HYPERRAM_ID_REG1 0x00000002 48 #define HYPERRAM_CONFIG_REG0 0x00001000 49 #define HYPERRAM_CONFIG_REG1 0x00001002 50 /*---------------------------------------------------------------------------------------------------------*/ 51 /* HBI_CMD constant definitions 52 0001 = Reset HyperRAM 53 0010 = Read HyperRAM regsiter (16-Bit, Read Data[15:0] 54 0101 = Exit From Hybrid Sleep and deep power down 55 0111 = Write HyperRAM regsiter (16-Bit, Write Data[15:0] 56 1000 = Read 2 Bytes (Read Data[15:0]) from HyperRAM 57 1001 = Read 4 Bytes (Read Data[31:0]) from HyperRAM 58 1100 = Write 1 Byte (Write Data[7:0]) to HyperRAM 59 1101 = Write 2 Bytes (Write Data[15:0]) to HyperRAM 60 1110 = Write 3 Byte (Write Data[23:0]) to HyperRAM 61 1111 = Write 4 Byte (Write Data[31:0]) to HyperRAM 62 */ 63 /*---------------------------------------------------------------------------------------------------------*/ 64 #define HBI_CMD_RESET_HRAM 0x1 65 #define HBI_CMD_READ_HRAM_REGISTER 0x2 66 #define HBI_CMD_EXIT_HS_PD 0x5 67 #define HBI_CMD_WRITE_HRAM_REGISTER 0x7 68 #define HBI_CMD_READ_HRAM_2_BYTE 0x8 69 #define HBI_CMD_READ_HRAM_4_BYTE 0x9 70 #define HBI_CMD_WRITE_HRAM_1_BYTE 0xC 71 #define HBI_CMD_WRITE_HRAM_2_BYTE 0xD 72 #define HBI_CMD_WRITE_HRAM_3_BYTE 0xE 73 #define HBI_CMD_WRITE_HRAM_4_BYTE 0xF 74 #define HBI_CMD_HRAM_IDLE 0x0 75 /*---------------------------------------------------------------------------------------------------------*/ 76 /* HBI_CONFIG: Chip Select Setup Time to Next CK Rising Edge constant definitions 77 00 = 1.5 HCLK cycles. 78 01 = 2.5 HCLK cycles. 79 10 = 3.5 HCLK cycles. 80 11 = 4.5 HCLK cycles. 81 */ 82 /*---------------------------------------------------------------------------------------------------------*/ 83 #define HBI_CONFIG_CSST_1_5_HCLK (0x0 << HBI_CONFIG_CSST_Pos) 84 #define HBI_CONFIG_CSST_2_5_HCLK (0x1 << HBI_CONFIG_CSST_Pos) 85 #define HBI_CONFIG_CSST_3_5_HCLK (0x2 << HBI_CONFIG_CSST_Pos) 86 #define HBI_CONFIG_CSST_4_5_HCLK (0x3 << HBI_CONFIG_CSST_Pos) 87 /*---------------------------------------------------------------------------------------------------------*/ 88 /* HBI_CONFIG: Initial Access Time constant definitions 89 0000 = 5 HCLK cycles. 90 0001 = 6 HCLK cycles. 91 0010 = 7 HCLK cycles. 92 1110 = 3 HCLK cycles. 93 1111 = 4 HCLK cycles. 94 */ 95 /*---------------------------------------------------------------------------------------------------------*/ 96 #define HBI_CONFIG_ACCT_5_CK (0x0 << HBI_CONFIG_ACCT_Pos) 97 #define HBI_CONFIG_ACCT_6_CK (0x1 << HBI_CONFIG_ACCT_Pos) 98 #define HBI_CONFIG_ACCT_7_CK (0x2 << HBI_CONFIG_ACCT_Pos) 99 #define HBI_CONFIG_ACCT_3_CK (0xE << HBI_CONFIG_ACCT_Pos) 100 #define HBI_CONFIG_ACCT_4_CK (0xF << HBI_CONFIG_ACCT_Pos) 101 /*---------------------------------------------------------------------------------------------------------*/ 102 /* HBI_CONFIG: Chip Select Hold Time After CK Falling Edge constant definitions 103 00 = 0.5 HCLK cycles. 104 01 = 1.5 HCLK cycles. 105 10 = 2.5 HCLK cycles. 106 11 = 3.5 HCLK cycles. 107 */ 108 /*---------------------------------------------------------------------------------------------------------*/ 109 #define HBI_CONFIG_CSH_0_5_HCLK (0x0 << HBI_CONFIG_CSH_Pos) 110 #define HBI_CONFIG_CSH_1_5_HCLK (0x1 << HBI_CONFIG_CSH_Pos) 111 #define HBI_CONFIG_CSH_2_5_HCLK (0x2 << HBI_CONFIG_CSH_Pos) 112 #define HBI_CONFIG_CSH_3_5_HCLK (0x3 << HBI_CONFIG_CSH_Pos) 113 /*---------------------------------------------------------------------------------------------------------*/ 114 /* HBI_CONFIG: Burst Group Size constant definitions 115 00 = 128 Bytes. 116 01 = 64 Bytes. 117 10 = 16 Bytes. 118 11 = 32 Bytes. 119 */ 120 /*---------------------------------------------------------------------------------------------------------*/ 121 #define HBI_CONFIG_BGSIZE_128 (0x0 << HBI_CONFIG_BGSIZE_Pos) 122 #define HBI_CONFIG_BGSIZE_64 (0x1 << HBI_CONFIG_BGSIZE_Pos) 123 #define HBI_CONFIG_BGSIZE_16 (0x2 << HBI_CONFIG_BGSIZE_Pos) 124 #define HBI_CONFIG_BGSIZE_32 (0x3 << HBI_CONFIG_BGSIZE_Pos) 125 /*---------------------------------------------------------------------------------------------------------*/ 126 /* HBI_CONFIG: Endian Condition on the Hyper Bus Data Pipe constant definitions 127 0 = Little-Endian. 128 1 = Big-Endian. 129 */ 130 /*---------------------------------------------------------------------------------------------------------*/ 131 #define HBI_CONFIG_LITTLE_ENDIAN (0x0 << HBI_CONFIG_ENDIAN_Pos) 132 #define HBI_CONFIG_BIG_ENDIAN (0x1 << HBI_CONFIG_ENDIAN_Pos) 133 /*---------------------------------------------------------------------------------------------------------*/ 134 /* HBI_CONFIG: Hyper Bus Clock Divider constant definitions 135 0 = Hyper Bus Clock rate is HCLK/2. 136 1 = Hyper Bus Clock rate is HCLK/4. 137 */ 138 /*---------------------------------------------------------------------------------------------------------*/ 139 #define HBI_CONFIG_CKDIV_HCLK_DIV2 (0x0 << HBI_CONFIG_CKDIV_Pos) 140 #define HBI_CONFIG_CKDIV_HCLK_DIV4 (0x1 << HBI_CONFIG_CKDIV_Pos) 141 /*---------------------------------------------------------------------------------------------------------*/ 142 143 /*---------------------------------------------------------------------------------------------------------*/ 144 /* HBI Define Error Code */ 145 /*---------------------------------------------------------------------------------------------------------*/ 146 extern int32_t g_HBI_i32ErrCode; 147 #define HBI_TIMEOUT SystemCoreClock /*!< HBI time-out counter (1 second time-out) */ 148 #define HBI_OK ( 0L) /*!< HBI operation OK */ 149 #define HBI_ERR_FAIL (-1L) /*!< HBI operation failed */ 150 #define HBI_ERR_TIMEOUT (-2L) /*!< HBI operation abort due to timeout error */ 151 #define HBI_ERR_ALIGN (-3L) /*!< HBI operation aligment error */ 152 153 154 /*---------------------------------------------------------------------------------------------------------*/ 155 /* Define Macros and functions */ 156 /*---------------------------------------------------------------------------------------------------------*/ 157 /** 158 * @brief Set HBI Chip Select Setup Time to Next CK Rising Edge 159 * @param[in] u8Value Chip Select Setup Time to Next CK Rising Edge. 160 * - \ref HBI_CONFIG_CSST_1_5_HCLK : 1.5 HCLK cycles 161 * - \ref HBI_CONFIG_CSST_2_5_HCLK : 2.5 HCLK cycles 162 * - \ref HBI_CONFIG_CSST_3_5_HCLK : 3.5 HCLK cycles 163 * - \ref HBI_CONFIG_CSST_4_5_HCLK : 4.5 HCLK cycles 164 * @return None 165 * @details This macro set HBI Chip Select Setup Time to Next CK Rising Edge 166 * \hideinitializer 167 */ 168 #define HBI_CONFIG_SET_CSST(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_CSST_Msk))) | u8Value) 169 170 /** 171 * @brief Set HBI Initial Access Time 172 * @param[in] u8Value Initial Access Time. 173 * - \ref HBI_CONFIG_ACCT_5_CK : 5 CK cycles 174 * - \ref HBI_CONFIG_ACCT_6_CK : 6 CK cycles 175 * - \ref HBI_CONFIG_ACCT_7_CK : 7 CK cycles 176 * - \ref HBI_CONFIG_ACCT_3_CK : 3 CK cycles 177 * - \ref HBI_CONFIG_ACCT_4_CK : 4 CK cycles 178 * @return None 179 * @details This macro set HBI Initial Access Time 180 * \hideinitializer 181 */ 182 #define HBI_CONFIG_SET_ACCT(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_ACCT_Msk))) | u8Value) 183 184 /** 185 * @brief Set HBI Chip Select Hold Time After CK Falling Edge 186 * @param[in] u8Value Chip Select Hold Time After CK Falling Edge. 187 * - \ref HBI_CONFIG_CSH_0_5_HCLK : 0.5 HCLK cycles 188 * - \ref HBI_CONFIG_CSH_1_5_HCLK : 1.5 HCLK cycles 189 * - \ref HBI_CONFIG_CSH_2_5_HCLK : 2.5 HCLK cycles 190 * - \ref HBI_CONFIG_CSH_3_5_HCLK : 3.5 HCLK cycles 191 * @return None 192 * @details This macro set HBI Chip Select Hold Time After CK Falling Edge 193 * \hideinitializer 194 */ 195 #define HBI_CONFIG_SET_CSH(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_CSH_Msk))) | u8Value) 196 197 /** 198 * @brief Set HBI Chip Select High between Transaction 199 * @param[in] u8Value Set Chip Select High between Transaction as u8Value HCLK cycles 200 u8Value must be 1 ~ 16 201 * @return None 202 * @details This macro set HBI Chip Select High between Transaction. 203 * \hideinitializer 204 */ 205 #define HBI_CONFIG_SET_CSHI(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_CSHI_Msk))) | ((u8Value-1) << HBI_CONFIG_CSHI_Pos)) 206 207 /** 208 * @brief Set HBI Burst Group Size 209 * @param[in] u8Value Burst Group Size. 210 * - \ref HBI_CONFIG_BGSIZE_128 : 128 Bytes 211 * - \ref HBI_CONFIG_BGSIZE_64 : 64 Bytes 212 * - \ref HBI_CONFIG_BGSIZE_16 : 16 Bytes 213 * - \ref HBI_CONFIG_BGSIZE_32 : 32 Bytes 214 * @return None 215 * @details This macro set HBI Burst Group Size 216 * \hideinitializer 217 */ 218 #define HBI_CONFIG_SET_BGSIZE(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_BGSIZE_Msk))) | u8Value) 219 220 /** 221 * @brief Set HBI Endian Condition on the Hyper Bus Data Pipe 222 * @param[in] u8Value Endian Condition on the Hyper Bus Data Pipe. 223 * - \ref HBI_CONFIG_LITTLE_ENDIAN : Little-Endian 224 * - \ref HBI_CONFIG_BIG_ENDIAN : Big-Endian 225 * @return None 226 * @details This macro set HBI Endian Condition on the Hyper Bus Data Pipe 227 * \hideinitializer 228 */ 229 #define HBI_CONFIG_SET_ENDIAN(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_ENDIAN_Msk))) | u8Value) 230 231 /** 232 * @brief Set HBI Hyper Bus Clock Divider 233 * @param[in] u8Value Hyper Bus Clock Divider. 234 * - \ref HBI_CONFIG_CKDIV_HCLK_DIV2 : HCLK/2 235 * - \ref HBI_CONFIG_CKDIV_HCLK_DIV4 : HCLK/4 236 * @return None 237 * @details This macro set Hyper Bus Clock Divider 238 * \hideinitializer 239 */ 240 #define HBI_CONFIG_SET_CKDIV(u8Value) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_CKDIV_Msk))) | u8Value) 241 242 /** 243 * @brief Set HBI Chip Select Maximum Low Time 244 * @param[in] u32CsMaxLT Set HBI Chip Select Maximum Low Time as u32CsMaxLT HCLK cycles. 245 u32CsMaxLT must be 1 ~ 2048 246 * @return None 247 * @details This macro set HBI Chip Select Maximum Low Time. 248 * \hideinitializer 249 */ 250 #define HBI_CONFIG_SET_CSMAXLT(u32CsMaxLT) (HBI->CONFIG = (HBI->CONFIG & (~(HBI_CONFIG_CSMAXLT_Msk))) | ((u32CsMaxLT-1) << HBI_CONFIG_CSMAXLT_Pos)) 251 252 /** 253 * @brief Enable HyperBus Operation Done Interrupt 254 * @param[in] None 255 * @return None 256 * @details This macro enable HyperBus Operation Done Interrupt. 257 * \hideinitializer 258 */ 259 #define HBI_ENABLE_INT (HBI->INTEN |= HBI_INTEN_OPINTEN_Msk) 260 261 /** 262 * @brief Disable HyperBus Operation Done Interrupt 263 * @param[in] None 264 * @return None 265 * @details This macro disable HyperBus Operation Done Interrupt. 266 * \hideinitializer 267 */ 268 #define HBI_DISABLE_INT (HBI->INTEN &= ~HBI_INTEN_OPINTEN_Msk) 269 270 /////////////////// 271 /** 272 * @brief Get HyperBus Operation Done Interrupt 273 * @param[in] None 274 * @return 0 = HyperBus operation is busy. 275 * 1 = HyperBus operation is done. 276 * @details This macro Get HyperBus Operation Done Interrupt. 277 * \hideinitializer 278 */ 279 #define HBI_GET_INTSTS ((HBI->INTSTS & HBI_INTSTS_OPDONE_Msk)? 1:0) 280 281 /*---------------------------------------------------------------------------------------------------------*/ 282 /* Define Function Prototypes */ 283 /*---------------------------------------------------------------------------------------------------------*/ 284 void HBI_ResetHyperRAM(void); 285 void HBI_ExitHSAndDPD(void); 286 int32_t HBI_ReadHyperRAMReg(uint32_t u32Addr); 287 int32_t HBI_WriteHyperRAMReg(uint32_t u32Addr, uint32_t u32Value); 288 uint32_t HBI_Read2Byte(uint32_t u32Addr); 289 uint32_t HBI_Read4Byte(uint32_t u32Addr); 290 void HBI_Write1Byte(uint32_t u32Addr, uint8_t u8Data); 291 void HBI_Write2Byte(uint32_t u32Addr, uint16_t u16Data); 292 void HBI_Write3Byte(uint32_t u32Addr, uint32_t u32Data); 293 void HBI_Write4Byte(uint32_t u32Addr, uint32_t u32Data); 294 295 /*@}*/ /* end of group HBI_EXPORTED_FUNCTIONS */ 296 297 /*@}*/ /* end of group HBI_Driver */ 298 299 /*@}*/ /* end of group Standard_Driver */ 300 301 #ifdef __cplusplus 302 } 303 #endif 304 305 #endif /* __HBI_H__ */ 306