1 /***************************************************************************//**
2 * \file cyhal_hw_resources.h
3 *
4 * \brief
5 * Provides struct definitions for configuration resources in the PDL.
6 *
7 ********************************************************************************
8 * \copyright
9 * Copyright 2018-2022 Cypress Semiconductor Corporation (an Infineon company) or
10 * an affiliate of Cypress Semiconductor Corporation
11 *
12 * SPDX-License-Identifier: Apache-2.0
13 *
14 * Licensed under the Apache License, Version 2.0 (the "License");
15 * you may not use this file except in compliance with the License.
16 * You may obtain a copy of the License at
17 *
18 *     http://www.apache.org/licenses/LICENSE-2.0
19 *
20 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS,
22 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 * See the License for the specific language governing permissions and
24 * limitations under the License.
25 *******************************************************************************/
26 
27 /**
28 * \addtogroup group_hal_impl_availability HAL Driver Availability Macros
29 * \ingroup group_hal_impl
30 * \{
31 */
32 
33 #pragma once
34 
35 #include "cy_pdl.h"
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 // Documented in cyhal.h
42 #define CYHAL_API_VERSION                   (2)
43 
44 /** \cond INTERNAL */
45 #define _CYHAL_DRIVER_AVAILABLE_SCB         (((CY_IP_MXSCB_INSTANCES) > 0) || ((CY_IP_MXS22SCB_INSTANCES) > 0))
46 #define _CYHAL_DRIVER_AVAILABLE_TCPWM       ((CY_IP_MXTCPWM_INSTANCES) > 0)
47 #define _CYHAL_DRIVER_AVAILABLE_IRQ         (1)
48 
49 #if defined(CY_IP_MXUDB_INSTANCES) && defined(CYHAL_UDB_SDIO)
50 #define _CYHAL_DRIVER_AVAILABLE_SDIO_UDB    (1)
51 #else
52 #define _CYHAL_DRIVER_AVAILABLE_SDIO_UDB    (0)
53 #endif
54 #define _CYHAL_DRIVER_AVAILABLE_DMA_DMAC    (((CY_IP_M4CPUSS_DMAC_INSTANCES) > 0) || ((CY_IP_M7CPUSS_DMAC_INSTANCES) > 0) || ((CY_IP_MXAHBDMAC_INSTANCES) > 0) || ((CY_IP_MXSAXIDMAC_INSTANCES) > 0))
55 #define _CYHAL_DRIVER_AVAILABLE_DMA_DW      (((CY_IP_M4CPUSS_DMA_INSTANCES) > 0) || ((CY_IP_M7CPUSS_DMA_INSTANCES) > 0) || ((CY_IP_MXDW_INSTANCES) > 0))
56 
57 #define _CYHAL_DRIVER_AVAILABLE_NVM_FLASH   (((FLASHC_BASE) > 0) || ((CPUSS_FLASHC_PRESENT) > 0))
58 #define _CYHAL_DRIVER_AVAILABLE_NVM_OTP     ((CY_IP_MXS22RRAMC_INSTANCES) > 0)
59 #define _CYHAL_DRIVER_AVAILABLE_NVM_RRAM    ((CY_IP_MXS22RRAMC_INSTANCES) > 0)
60 
61 #if !defined(COMPONENT_CAT1D)
62 
63 #define _CYHAL_DRIVER_AVAILABLE_ADC_SAR     ((CY_IP_MXS40PASS_SAR_INSTANCES) > 0) || ((CY_IP_MXS40EPASS_ESAR_INSTANCES) > 0)
64 #define _CYHAL_DRIVER_AVAILABLE_ADC_MIC     ((CY_IP_MXS40ADCMIC_INSTANCES) > 0)
65 #define _CYHAL_DRIVER_AVAILABLE_COMP_LP     ((CY_IP_MXLPCOMP_INSTANCES) > 0)
66 #define _CYHAL_DRIVER_AVAILABLE_COMP_CTB    (((CY_IP_MXS40PASS_INSTANCES) > 0) && ((CY_IP_MXS40PASS_CTB_INSTANCES) > 0))
67 
68 #define _CYHAL_DRIVER_AVAILABLE_PASS        ((CY_IP_MXS40PASS_INSTANCES) > 0) || ((CY_IP_MXS40EPASS_INSTANCES) > 0)
69 /* MXCRYPTOLITE is not yet supported */
70 //#define _CYHAL_DRIVER_AVAILABLE_CRYPTO      (((CY_IP_MXCRYPTO_INSTANCES) > 0) || ((CY_IP_MXCRYPTOLITE_INSTANCES) > 0))
71 #define _CYHAL_DRIVER_AVAILABLE_CRYPTO      ((CY_IP_MXCRYPTO_INSTANCES) > 0)
72 
73 #else
74 
75 #define _CYHAL_DRIVER_AVAILABLE_ADC_SAR     (0)
76 #define _CYHAL_DRIVER_AVAILABLE_ADC_MIC     (0)
77 #define _CYHAL_DRIVER_AVAILABLE_COMP_LP     (0)
78 #define _CYHAL_DRIVER_AVAILABLE_COMP_CTB    (0)
79 #define _CYHAL_DRIVER_AVAILABLE_PASS        (0)
80 #define _CYHAL_DRIVER_AVAILABLE_CRYPTO      (0)
81 
82 #endif /* not COMPONENT_CAT1D or COMPONENT_CAT1D */
83 
84 #if defined(PERI_PERI_PCLK_PCLK_GROUP_NR)
85 #define _CYHAL_CLOCK_PERI_GROUPS    PERI_PERI_PCLK_PCLK_GROUP_NR
86 #elif (defined(PERI0_PERI_PCLK_PCLK_GROUP_NR) && defined(PERI1_PERI_PCLK_PCLK_GROUP_NR))
87 #define _CYHAL_CLOCK_PERI_GROUPS    (PERI0_PERI_PCLK_PCLK_GROUP_NR + PERI1_PERI_PCLK_PCLK_GROUP_NR)
88 #else
89 #define _CYHAL_CLOCK_PERI_GROUPS    1
90 #endif
91 
92 
93 #if defined(SRSS_HT_VARIANT) && (SRSS_HT_VARIANT > 0)
94     /* CAT1C devices define _CYHAL_SRSS_NUM_PLL to be the macro that documents the number of 200MHz PLL's present */
95     #define SRSS_NUM_PLL200M    SRSS_NUM_PLL
96 #elif defined(COMPONENT_CAT1D)
97     /* CAT1D devices define SRSS_NUM_DPLL_LP/SRSS_NUM_DPLL_HP to be the macro that documents the number of 200/500MHz PLL's present */
98     #define SRSS_NUM_DPLL250M   SRSS_NUM_DPLL_LP
99     #define SRSS_NUM_DPLL500M   SRSS_NUM_DPLL_HP
100 #endif
101 
102 #if ((defined(COMPONENT_CAT1C) && (SRSS_HT_VARIANT)) || (defined(COMPONENT_CAT1A) && SRSS_HT_VARIANT))
103     #define _CYHAL_SRSS_NUM_ILO 2U
104 #else
105     #define _CYHAL_SRSS_NUM_ILO 1U
106 #endif
107 
108 #if defined(CPUSS_CM7_1_PRESENT)
109 #define _CYHAL_SRSS_NUM_FAST (1 + CPUSS_CM7_1_PRESENT)
110 #else
111 #define _CYHAL_SRSS_NUM_FAST (1)
112 #endif
113 
114 /* Alignment for DMA descriptors */
115 #if (CY_IP_MXSAXIDMAC)
116     /* AXI DMA controller has a 64-bit AXI master interface */
117     #define _CYHAL_DMA_ALIGN        CY_ALIGN(8)
118 #elif (CY_CPU_CORTEX_M7) && defined(ENABLE_CM7_DATA_CACHE)
119     #define _CYHAL_DMA_ALIGN        CY_ALIGN(__SCB_DCACHE_LINE_SIZE)
120 #else
121     #define _CYHAL_DMA_ALIGN
122 #endif
123 
124 /** \endcond */
125 
126 // Documented in cyhal.h
127 #define CYHAL_DRIVER_AVAILABLE_HWMGR        (1)
128 #define CYHAL_DRIVER_AVAILABLE_GPIO         (1)
129 #define CYHAL_DRIVER_AVAILABLE_INTERCONNECT (1)
130 #define CYHAL_DRIVER_AVAILABLE_CLOCK        (1)
131 #define CYHAL_DRIVER_AVAILABLE_SYSTEM       (1)
132 
133 #define CYHAL_DRIVER_AVAILABLE_EZI2C        (_CYHAL_DRIVER_AVAILABLE_SCB) //SCB[x]_I2C
134 #define CYHAL_DRIVER_AVAILABLE_I2C          (_CYHAL_DRIVER_AVAILABLE_SCB) //SCB[x]_I2C
135 #define CYHAL_DRIVER_AVAILABLE_SPI          (_CYHAL_DRIVER_AVAILABLE_SCB) //SCB[x]_SPI
136 #define CYHAL_DRIVER_AVAILABLE_UART         (_CYHAL_DRIVER_AVAILABLE_SCB) //SCB[x]_UART
137 #define CYHAL_DRIVER_AVAILABLE_WDT          (1)
138 #define CYHAL_DRIVER_AVAILABLE_TIMER        (_CYHAL_DRIVER_AVAILABLE_TCPWM)
139 #define CYHAL_DRIVER_AVAILABLE_PWM          (_CYHAL_DRIVER_AVAILABLE_TCPWM)
140 #define CYHAL_DRIVER_AVAILABLE_QUADDEC      (_CYHAL_DRIVER_AVAILABLE_TCPWM)
141 
142 #define CYHAL_DRIVER_AVAILABLE_I2S          ((((CY_IP_MXAUDIOSS_INSTANCES) > 0) && (AUDIOSS_I2S || AUDIOSS0_I2S || AUDIOSS0_I2S_I2S)) || ((CY_IP_MXTDM_INSTANCES) > 0)) //AUDIOSS[x]_I2S
143 #define CYHAL_DRIVER_AVAILABLE_I2S_TX       (CYHAL_DRIVER_AVAILABLE_I2S)
144 #define CYHAL_DRIVER_AVAILABLE_I2S_RX       (CYHAL_DRIVER_AVAILABLE_I2S)
145 #define CYHAL_DRIVER_AVAILABLE_TDM          ((((CY_IP_MXAUDIOSS_INSTANCES) > 0) && (AUDIOSS_I2S || AUDIOSS0_I2S || AUDIOSS0_I2S_I2S)) || ((CY_IP_MXTDM_INSTANCES) > 0)) //AUDIOSS[x]_I2S
146 #define CYHAL_DRIVER_AVAILABLE_TDM_TX       (CYHAL_DRIVER_AVAILABLE_TDM)
147 #define CYHAL_DRIVER_AVAILABLE_TDM_RX       (CYHAL_DRIVER_AVAILABLE_TDM)
148 #define CYHAL_DRIVER_AVAILABLE_DMA          ((_CYHAL_DRIVER_AVAILABLE_DMA_DMAC) || (_CYHAL_DRIVER_AVAILABLE_DMA_DW))
149 #if !defined(COMPONENT_CAT1B) && !defined(COMPONENT_CAT1D)
150 #define CYHAL_DRIVER_AVAILABLE_IPC          ((CPUSS_IPC_IPC_NR > 0) || (CY_IP_MXIPC_INSTANCES > 0))
151 #else
152 #define CYHAL_DRIVER_AVAILABLE_IPC          (0)
153 #endif /* !defined(COMPONENT_CAT1B) && !defined(COMPONENT_CAT1D) or other */
154 #define CYHAL_DRIVER_AVAILABLE_QSPI         ((CY_IP_MXSMIF_INSTANCES) > 0)
155 #if (defined(COMPONENT_CM0P) && defined(COMPONENT_CAT1D))//CAT 1D CM0P cannot have LPTimer instances because no interrupts are routed to this CPU
156 #define CYHAL_DRIVER_AVAILABLE_LPTIMER  (0)
157 #else
158 #define CYHAL_DRIVER_AVAILABLE_LPTIMER      ((SRSS_NUM_MCWDT) > 0)
159 #endif
160 #define CYHAL_DRIVER_AVAILABLE_SDHC         ((CY_IP_MXSDHC_INSTANCES) > 0)
161 #define CYHAL_DRIVER_AVAILABLE_SDIO         (((CY_IP_MXSDHC_INSTANCES) > 0) || (_CYHAL_DRIVER_AVAILABLE_SDIO_UDB))
162 #define CYHAL_DRIVER_AVAILABLE_SDIO_HOST    (CYHAL_DRIVER_AVAILABLE_SDIO)
163 #define CYHAL_DRIVER_AVAILABLE_SDIO_DEV     (0)
164 #define CYHAL_DRIVER_AVAILABLE_NVM          (_CYHAL_DRIVER_AVAILABLE_NVM_FLASH || _CYHAL_DRIVER_AVAILABLE_NVM_RRAM || _CYHAL_DRIVER_AVAILABLE_NVM_OTP)
165 #define CYHAL_DRIVER_AVAILABLE_FLASH        (_CYHAL_DRIVER_AVAILABLE_NVM_FLASH)     /* Deprecated */
166 #define CYHAL_DRIVER_AVAILABLE_SYSPM        (1)
167 #define CYHAL_DRIVER_AVAILABLE_RTC          (((((CY_IP_MXS40SSRSS_INSTANCES) > 0) || ((CY_IP_MXS40SRSS_INSTANCES) > 0)) && ((SRSS_BACKUP_PRESENT) > 0)) || (((SRSS_RTC_PRESENT) > 0) && ((SRSS_NUM_HIBDATA) > 0)))
168 
169 #if !defined(COMPONENT_CAT1D)
170 
171 #define CYHAL_DRIVER_AVAILABLE_ADC          ((_CYHAL_DRIVER_AVAILABLE_ADC_SAR) || (_CYHAL_DRIVER_AVAILABLE_ADC_MIC))
172 #define CYHAL_DRIVER_AVAILABLE_COMP         ((_CYHAL_DRIVER_AVAILABLE_COMP_LP) || (_CYHAL_DRIVER_AVAILABLE_COMP_CTB))
173 #define CYHAL_DRIVER_AVAILABLE_CRC          (((CY_IP_MXCRYPTO_INSTANCES) > 0) && (CPUSS_CRYPTO_CRC))
174 #define CYHAL_DRIVER_AVAILABLE_DAC          (((CY_IP_MXS40PASS_INSTANCES) > 0) && ((CY_IP_MXS40PASS_CTDAC_INSTANCES) > 0))
175 #define CYHAL_DRIVER_AVAILABLE_KEYSCAN      ((CY_IP_MXKEYSCAN_INSTANCES) > 0)
176 #define CYHAL_DRIVER_AVAILABLE_OPAMP        (((CY_IP_MXS40PASS_INSTANCES) > 0) && ((CY_IP_MXS40PASS_CTB_INSTANCES) > 0))
177 #define CYHAL_DRIVER_AVAILABLE_PDMPCM       ((((CY_IP_MXAUDIOSS_INSTANCES) > 0) && (AUDIOSS_PDM || AUDIOSS0_PDM || AUDIOSS0_PDM_PDM)) || ((CY_IP_MXPDM_INSTANCES) > 0)) //AUDIOSS[x]_PDM
178 #define CYHAL_DRIVER_AVAILABLE_TRNG         ((((CY_IP_MXCRYPTO_INSTANCES) > 0) && ((CPUSS_CRYPTO_TR) > 0)) /*|| (((CY_IP_MXCRYPTOLITE_INSTANCES) > 0) && ((CRYPTO_TRNG_PRESENT) > 0))*/)
179 #define CYHAL_DRIVER_AVAILABLE_USB_DEV      ((CY_IP_MXUSBFS_INSTANCES) > 0)
180 
181 #else /* COMPONENT_CAT1D */
182 
183 #define CYHAL_DRIVER_AVAILABLE_COMP         (0)
184 #define CYHAL_DRIVER_AVAILABLE_CRC          (0)
185 #define CYHAL_DRIVER_AVAILABLE_DAC          (0)
186 #define CYHAL_DRIVER_AVAILABLE_KEYSCAN      (0)
187 #define CYHAL_DRIVER_AVAILABLE_OPAMP        (0)
188 #define CYHAL_DRIVER_AVAILABLE_PDMPCM       (0)
189 #define CYHAL_DRIVER_AVAILABLE_TRNG         (0)
190 #define CYHAL_DRIVER_AVAILABLE_USB_DEV      (0)
191 #define CYHAL_DRIVER_AVAILABLE_ADC          (0)
192 
193 
194 #endif /* not COMPONENT_CAT1D or other */
195 
196 /** \} group_hal_impl_availability */
197 /**
198 * \addtogroup group_hal_impl_hw_types
199 * \ingroup group_hal_impl
200 * \{
201 */
202 
203 
204 /* NOTE: Any changes made to this enum must also be made to the hardware manager resource tracking */
205 /** Resource types that the hardware manager supports */
206 typedef enum
207 {
208     CYHAL_RSC_ADC,       /*!< Analog to digital converter */
209     CYHAL_RSC_ADCMIC,    /*!< Analog to digital converter with Analog Mic support */
210     CYHAL_RSC_BLESS,     /*!< Bluetooth communications block */
211     CYHAL_RSC_CAN,       /*!< CAN communication block */
212     CYHAL_RSC_CLKPATH,   /*!< Clock Path. DEPRECATED. */
213     CYHAL_RSC_CLOCK,     /*!< Clock */
214     CYHAL_RSC_CRYPTO,    /*!< Crypto hardware accelerator */
215     CYHAL_RSC_DAC,       /*!< Digital to analog converter */
216     CYHAL_RSC_DMA,       /*!< DMA controller */
217     CYHAL_RSC_DW,        /*!< Datawire DMA controller */
218     CYHAL_RSC_ETH,       /*!< Ethernet communications block */
219     CYHAL_RSC_GPIO,      /*!< General purpose I/O pin */
220     CYHAL_RSC_I2S,       /*!< I2S communications block */
221     CYHAL_RSC_I3C,       /*!< I3C communications block */
222     CYHAL_RSC_KEYSCAN,   /*!< KeyScan block */
223     CYHAL_RSC_LCD,       /*!< Segment LCD controller */
224     CYHAL_RSC_LIN,       /*!< LIN communications block */
225     CYHAL_RSC_LPCOMP,    /*!< Low power comparator */
226     CYHAL_RSC_LPTIMER,   /*!< Low power timer */
227     CYHAL_RSC_OPAMP,     /*!< Opamp */
228     CYHAL_RSC_PDM,       /*!< PCM/PDM communications block */
229     CYHAL_RSC_SMIF,      /*!< Quad-SPI communications block */
230     CYHAL_RSC_RTC,       /*!< Real time clock */
231     CYHAL_RSC_SCB,       /*!< Serial Communications Block */
232     CYHAL_RSC_SDHC,      /*!< SD Host Controller */
233     CYHAL_RSC_SDIODEV,   /*!< SDIO Device Block */
234     CYHAL_RSC_TCPWM,     /*!< Timer/Counter/PWM block */
235     CYHAL_RSC_TDM,       /*!< TDM block */
236     CYHAL_RSC_UDB,       /*!< UDB Array */
237     CYHAL_RSC_USB,       /*!< USB communication block */
238     CYHAL_RSC_INVALID,   /*!< Placeholder for invalid type */
239 } cyhal_resource_t;
240 
241 /** \cond INTERNAL */
242     /* Extracts the divider from the Peri group block number */
243     #define _CYHAL_PERIPHERAL_GROUP_GET_DIVIDER_TYPE(block)     ((cy_en_divider_types_t)((block) & 0x03))
244     #define _CYHAL_PERIPHERAL_GROUP_GET_GROUP(block)            ((block) >> 2)
245 
246 #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
247 
248 #if !defined(COMPONENT_CAT1D)
249     /* Converts the group/div pair into a unique block number. */
250     #define _CYHAL_PERIPHERAL_GROUP_ADJUST(group, div)                  (((group) << 2) | (div))
251 
252     #define _CYHAL_CLOCK_BLOCK_PERI_GROUP(gr) \
253         CYHAL_CLOCK_BLOCK_PERIPHERAL##gr##_8BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((gr), CY_SYSCLK_DIV_8_BIT),        /*!< 8bit Peripheral Divider Group */ \
254         CYHAL_CLOCK_BLOCK_PERIPHERAL##gr##_16BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((gr), CY_SYSCLK_DIV_16_BIT),      /*!< 16bit Peripheral Divider Group */ \
255         CYHAL_CLOCK_BLOCK_PERIPHERAL##gr##_16_5BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((gr), CY_SYSCLK_DIV_16_5_BIT),  /*!< 16.5bit Peripheral Divider Group */ \
256         CYHAL_CLOCK_BLOCK_PERIPHERAL##gr##_24_5BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((gr), CY_SYSCLK_DIV_24_5_BIT)   /*!< 24.5bit Peripheral Divider Group */
257 #else /* !defined(COMPONENT_CAT1D) */
258     /* Converts the group/div pair into a unique block number. */
259     #define _CYHAL_PERIPHERAL_GROUP_ADJUST(instance, group, div)        (((group + (instance * PERI0_PERI_PCLK_PCLK_GROUP_NR)) << 2) | (div))
260     #define _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock)                 ((clock >> 2) / PERI0_PERI_PCLK_PCLK_GROUP_NR)
261     #define _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock)                    ((clock >> 2) - (_CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock) * PERI0_PERI_PCLK_PCLK_GROUP_NR))
262 
263     #define _CYHAL_CLOCK_BLOCK_PERI_GROUP(instance, gr) \
264         CYHAL_CLOCK_BLOCK##instance##_PERIPHERAL##gr##_8BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((instance), (gr), CY_SYSCLK_DIV_8_BIT),        /*!< 8bit Peripheral Divider for specified instance and group */ \
265         CYHAL_CLOCK_BLOCK##instance##_PERIPHERAL##gr##_16BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((instance), (gr), CY_SYSCLK_DIV_16_BIT),      /*!< 16bit Peripheral Divider for specified instance and group */ \
266         CYHAL_CLOCK_BLOCK##instance##_PERIPHERAL##gr##_16_5BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((instance), (gr), CY_SYSCLK_DIV_16_5_BIT),  /*!< 16.5bit Peripheral Divider for specified instance and group */ \
267         CYHAL_CLOCK_BLOCK##instance##_PERIPHERAL##gr##_24_5BIT = _CYHAL_PERIPHERAL_GROUP_ADJUST((instance), (gr), CY_SYSCLK_DIV_24_5_BIT)   /*!< 24.5bit Peripheral Divider for specified instance and group */
268 #endif /* !defined(COMPONENT_CAT1D) or other */
269 #endif
270 /** \endcond */
271 
272 /* NOTE: Any changes here must also be made in cyhal_hwmgr.c */
273 /** Enum for the different types of clocks that exist on the device. */
274 typedef enum
275 {
276 #if defined(COMPONENT_CAT1A)
277     // The first four items are here for backwards compatability with old clock APIs
278     CYHAL_CLOCK_BLOCK_PERIPHERAL_8BIT = CY_SYSCLK_DIV_8_BIT,        /*!< 8bit Peripheral Divider */
279     CYHAL_CLOCK_BLOCK_PERIPHERAL_16BIT = CY_SYSCLK_DIV_16_BIT,      /*!< 16bit Peripheral Divider */
280     CYHAL_CLOCK_BLOCK_PERIPHERAL_16_5BIT = CY_SYSCLK_DIV_16_5_BIT,  /*!< 16.5bit Peripheral Divider */
281     CYHAL_CLOCK_BLOCK_PERIPHERAL_24_5BIT = CY_SYSCLK_DIV_24_5_BIT,  /*!< 24.5bit Peripheral Divider */
282 
283     CYHAL_CLOCK_BLOCK_IMO,                                          /*!< Internal Main Oscillator Input Clock */
284     CYHAL_CLOCK_BLOCK_ECO,                                          /*!< External Crystal Oscillator Input Clock */
285     CYHAL_CLOCK_BLOCK_EXT,                                          /*!< External Input Clock */
286     CYHAL_CLOCK_BLOCK_ALTHF,                                        /*!< Alternate High Frequency Input Clock */
287     CYHAL_CLOCK_BLOCK_ALTLF,                                        /*!< Alternate Low Frequency Input Clock */
288     CYHAL_CLOCK_BLOCK_ILO,                                          /*!< Internal Low Speed Oscillator Input Clock */
289 #if !(defined(SRSS_HT_VARIANT) && (SRSS_HT_VARIANT > 0))
290     CYHAL_CLOCK_BLOCK_PILO,                                         /*!< Precision ILO Input Clock */
291 #endif
292 
293     CYHAL_CLOCK_BLOCK_WCO,                                          /*!< Watch Crystal Oscillator Input Clock */
294     CYHAL_CLOCK_BLOCK_MFO,                                          /*!< Medium Frequency Oscillator Clock */
295 
296     CYHAL_CLOCK_BLOCK_PATHMUX,                                      /*!< Path selection mux for input to FLL/PLLs */
297 
298     CYHAL_CLOCK_BLOCK_FLL,                                          /*!< Frequency-Locked Loop Clock */
299 #if defined(SRSS_HT_VARIANT) && (SRSS_HT_VARIANT > 0)
300     CYHAL_CLOCK_BLOCK_PLL200,                                       /*!< 200MHz Phase-Locked Loop Clock */
301     CYHAL_CLOCK_BLOCK_PLL400,                                       /*!< 400MHz Phase-Locked Loop Clock */
302 #else
303     CYHAL_CLOCK_BLOCK_PLL,                                          /*!< Phase-Locked Loop Clock */
304 #endif
305 
306     CYHAL_CLOCK_BLOCK_LF,                                           /*!< Low Frequency Clock */
307     CYHAL_CLOCK_BLOCK_MF,                                           /*!< Medium Frequency Clock */
308     CYHAL_CLOCK_BLOCK_HF,                                           /*!< High Frequency Clock */
309 
310     CYHAL_CLOCK_BLOCK_PUMP,                                         /*!< Analog Pump Clock */
311     CYHAL_CLOCK_BLOCK_BAK,                                          /*!< Backup Power Domain Clock */
312     CYHAL_CLOCK_BLOCK_TIMER,                                        /*!< Timer Clock */
313     CYHAL_CLOCK_BLOCK_ALT_SYS_TICK,                                 /*!< Alternative SysTick Clock */
314 
315     CYHAL_CLOCK_BLOCK_FAST,                                         /*!< Fast Clock for CM4 */
316     CYHAL_CLOCK_BLOCK_PERI,                                         /*!< Peripheral Clock */
317     CYHAL_CLOCK_BLOCK_SLOW,                                         /*!< Slow Clock for CM0+ */
318 
319 
320 #elif defined(COMPONENT_CAT1B)
321 
322     CYHAL_CLOCK_BLOCK_PERIPHERAL_8BIT = CY_SYSCLK_DIV_8_BIT,        /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_8_BIT */
323     CYHAL_CLOCK_BLOCK_PERIPHERAL_16BIT = CY_SYSCLK_DIV_16_BIT,      /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_BIT */
324     CYHAL_CLOCK_BLOCK_PERIPHERAL_16_5BIT = CY_SYSCLK_DIV_16_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_5_BIT */
325     CYHAL_CLOCK_BLOCK_PERIPHERAL_24_5BIT = CY_SYSCLK_DIV_24_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_24_5_BIT */
326 
327     // The first four items are here for backwards compatability with old clock APIs
328     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 1)
329     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0),
330     #endif
331     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 2)
332     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1),
333     #endif
334     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 3)
335     _CYHAL_CLOCK_BLOCK_PERI_GROUP(2),
336     #endif
337     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 4)
338     _CYHAL_CLOCK_BLOCK_PERI_GROUP(3),
339     #endif
340     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 5)
341     _CYHAL_CLOCK_BLOCK_PERI_GROUP(4),
342     #endif
343     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 6)
344     _CYHAL_CLOCK_BLOCK_PERI_GROUP(5),
345     #endif
346     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 7)
347     _CYHAL_CLOCK_BLOCK_PERI_GROUP(6),
348     #endif
349     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 8)
350     _CYHAL_CLOCK_BLOCK_PERI_GROUP(7),
351     #endif
352     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 9)
353     _CYHAL_CLOCK_BLOCK_PERI_GROUP(8),
354     #endif
355     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 10)
356     _CYHAL_CLOCK_BLOCK_PERI_GROUP(9),
357     #endif
358     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 11)
359     _CYHAL_CLOCK_BLOCK_PERI_GROUP(10),
360     #endif
361     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 12)
362     _CYHAL_CLOCK_BLOCK_PERI_GROUP(11),
363     #endif
364     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 13)
365     _CYHAL_CLOCK_BLOCK_PERI_GROUP(12),
366     #endif
367     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 14)
368     _CYHAL_CLOCK_BLOCK_PERI_GROUP(13),
369     #endif
370     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 15)
371     _CYHAL_CLOCK_BLOCK_PERI_GROUP(14),
372     #endif
373     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 16)
374     _CYHAL_CLOCK_BLOCK_PERI_GROUP(15),
375     #endif
376 
377     CYHAL_CLOCK_BLOCK_IHO,                                          /*!< Internal High Speed Oscillator Input Clock */
378     CYHAL_CLOCK_BLOCK_IMO,                                          /*!< Internal Main Oscillator Input Clock */
379     CYHAL_CLOCK_BLOCK_ECO,                                          /*!< External Crystal Oscillator Input Clock */
380     CYHAL_CLOCK_BLOCK_EXT,                                          /*!< External Input Clock */
381     CYHAL_CLOCK_BLOCK_ALTHF,                                        /*!< Alternate High Frequency Input Clock */
382     CYHAL_CLOCK_BLOCK_ALTLF,                                        /*!< Alternate Low Frequency Input Clock */
383     CYHAL_CLOCK_BLOCK_ILO,                                          /*!< Internal Low Speed Oscillator Input Clock */
384     CYHAL_CLOCK_BLOCK_PILO,                                         /*!< Precision ILO Input Clock */
385     CYHAL_CLOCK_BLOCK_WCO,                                          /*!< Watch Crystal Oscillator Input Clock */
386     CYHAL_CLOCK_BLOCK_MFO,                                          /*!< Medium Frequency Oscillator Clock */
387 
388     CYHAL_CLOCK_BLOCK_PATHMUX,                                      /*!< Path selection mux for input to FLL/PLLs */
389 
390     CYHAL_CLOCK_BLOCK_FLL,                                          /*!< Frequency-Locked Loop Clock */
391     CYHAL_CLOCK_BLOCK_PLL200,                                       /*!< 200MHz Phase-Locked Loop Clock */
392     CYHAL_CLOCK_BLOCK_PLL400,                                       /*!< 400MHz Phase-Locked Loop Clock */
393     CYHAL_CLOCK_BLOCK_ECO_PRESCALER,                                /*!< ECO Prescaler Divider */
394 
395     CYHAL_CLOCK_BLOCK_LF,                                           /*!< Low Frequency Clock */
396     CYHAL_CLOCK_BLOCK_MF,                                           /*!< Medium Frequency Clock */
397     CYHAL_CLOCK_BLOCK_HF,                                           /*!< High Frequency Clock */
398 
399     CYHAL_CLOCK_BLOCK_PUMP,                                         /*!< Analog Pump Clock */
400     CYHAL_CLOCK_BLOCK_BAK,                                          /*!< Backup Power Domain Clock */
401     CYHAL_CLOCK_BLOCK_ALT_SYS_TICK,                                 /*!< Alternative SysTick Clock */
402     CYHAL_CLOCK_BLOCK_PERI,                                         /*!< Peripheral Clock Group */
403 
404 #elif defined(COMPONENT_CAT1C)
405 
406     CYHAL_CLOCK_BLOCK_PERIPHERAL_8BIT = CY_SYSCLK_DIV_8_BIT,        /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_8_BIT */
407     CYHAL_CLOCK_BLOCK_PERIPHERAL_16BIT = CY_SYSCLK_DIV_16_BIT,      /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_BIT */
408     CYHAL_CLOCK_BLOCK_PERIPHERAL_16_5BIT = CY_SYSCLK_DIV_16_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_5_BIT */
409     CYHAL_CLOCK_BLOCK_PERIPHERAL_24_5BIT = CY_SYSCLK_DIV_24_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_24_5_BIT */
410 
411     // The first four items are here for backwards compatability with old clock APIs
412     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 1)
413     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0),
414     #endif
415     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 2)
416     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1),
417     #endif
418     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 3)
419     _CYHAL_CLOCK_BLOCK_PERI_GROUP(2),
420     #endif
421     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 4)
422     _CYHAL_CLOCK_BLOCK_PERI_GROUP(3),
423     #endif
424     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 5)
425     _CYHAL_CLOCK_BLOCK_PERI_GROUP(4),
426     #endif
427     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 6)
428     _CYHAL_CLOCK_BLOCK_PERI_GROUP(5),
429     #endif
430     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 7)
431     _CYHAL_CLOCK_BLOCK_PERI_GROUP(6),
432     #endif
433     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 8)
434     _CYHAL_CLOCK_BLOCK_PERI_GROUP(7),
435     #endif
436     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 9)
437     _CYHAL_CLOCK_BLOCK_PERI_GROUP(8),
438     #endif
439     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 10)
440     _CYHAL_CLOCK_BLOCK_PERI_GROUP(9),
441     #endif
442     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 11)
443     _CYHAL_CLOCK_BLOCK_PERI_GROUP(10),
444     #endif
445     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 12)
446     _CYHAL_CLOCK_BLOCK_PERI_GROUP(11),
447     #endif
448     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 13)
449     _CYHAL_CLOCK_BLOCK_PERI_GROUP(12),
450     #endif
451     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 14)
452     _CYHAL_CLOCK_BLOCK_PERI_GROUP(13),
453     #endif
454     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 15)
455     _CYHAL_CLOCK_BLOCK_PERI_GROUP(14),
456     #endif
457     #if (PERI_PERI_PCLK_PCLK_GROUP_NR >= 16)
458     _CYHAL_CLOCK_BLOCK_PERI_GROUP(15),
459     #endif
460 
461     CYHAL_CLOCK_BLOCK_IMO,                                          /*!< Internal Main Oscillator Input Clock */
462     CYHAL_CLOCK_BLOCK_ECO,                                          /*!< External Crystal Oscillator Input Clock */
463     CYHAL_CLOCK_BLOCK_EXT,                                          /*!< External Input Clock */
464     CYHAL_CLOCK_BLOCK_ILO,                                          /*!< Internal Low Speed Oscillator Input Clock */
465     CYHAL_CLOCK_BLOCK_WCO,                                          /*!< Watch Crystal Oscillator Input Clock */
466 
467     CYHAL_CLOCK_BLOCK_PATHMUX,                                      /*!< Path selection mux for input to FLL/PLLs */
468 
469     CYHAL_CLOCK_BLOCK_FLL,                                          /*!< Frequency-Locked Loop Clock */
470     CYHAL_CLOCK_BLOCK_PLL200,                                       /*!< 200MHz Phase-Locked Loop Clock */
471     CYHAL_CLOCK_BLOCK_PLL400,                                       /*!< 400MHz Phase-Locked Loop Clock */
472 
473     CYHAL_CLOCK_BLOCK_LF,                                           /*!< Low Frequency Clock */
474     CYHAL_CLOCK_BLOCK_HF,                                           /*!< High Frequency Clock */
475     CYHAL_CLOCK_BLOCK_BAK,                                          /*!< Backup Power Domain Clock */
476     CYHAL_CLOCK_BLOCK_ALT_SYS_TICK,                                 /*!< Alternative SysTick Clock */
477 
478     CYHAL_CLOCK_BLOCK_PERI,                                         /*!< Peripheral Clock Group */
479     CYHAL_CLOCK_BLOCK_FAST,                                         /*!< Fast Clock for CM7 */
480     CYHAL_CLOCK_BLOCK_SLOW,                                         /*!< Slow Clock for CM0+ */
481     CYHAL_CLOCK_BLOCK_MEM,                                          /*!< CLK MEM */
482     CYHAL_CLOCK_BLOCK_TIMER,                                        /*!< CLK Timer */
483 
484 #elif defined(COMPONENT_CAT1D)
485 
486     CYHAL_CLOCK_BLOCK_PERIPHERAL_8BIT = CY_SYSCLK_DIV_8_BIT,        /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_8_BIT */
487     CYHAL_CLOCK_BLOCK_PERIPHERAL_16BIT = CY_SYSCLK_DIV_16_BIT,      /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_BIT */
488     CYHAL_CLOCK_BLOCK_PERIPHERAL_16_5BIT = CY_SYSCLK_DIV_16_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_16_5_BIT */
489     CYHAL_CLOCK_BLOCK_PERIPHERAL_24_5BIT = CY_SYSCLK_DIV_24_5_BIT,  /*!< Equivalent to CYHAL_CLOCK_BLOCK_PERIPHERAL0_24_5_BIT */
490 
491     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 1)
492     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 0),
493     #endif
494     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 2)
495     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 1),
496     #endif
497     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 3)
498     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 2),
499     #endif
500     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 4)
501     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 3),
502     #endif
503     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 5)
504     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 4),
505     #endif
506     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 6)
507     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 5),
508     #endif
509     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 7)
510     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 6),
511     #endif
512     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 8)
513     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 7),
514     #endif
515     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 9)
516     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 8),
517     #endif
518     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 10)
519     _CYHAL_CLOCK_BLOCK_PERI_GROUP(0, 9),
520     #endif
521     #if (PERI0_PERI_PCLK_PCLK_GROUP_NR >= 11)
522         #warning "Unhandled PERI0 PCLK number"
523     #endif
524 
525     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 1)
526     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 0),
527     #endif
528     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 2)
529     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 1),
530     #endif
531     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 3)
532     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 2),
533     #endif
534     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 4)
535     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 3),
536     #endif
537     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 5)
538     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 4),
539     #endif
540     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 6)
541     _CYHAL_CLOCK_BLOCK_PERI_GROUP(1, 5),
542     #endif
543     #if (PERI1_PERI_PCLK_PCLK_GROUP_NR >= 7)
544         #warning "Unhandled PERI1 PCLK number"
545     #endif
546 
547     CYHAL_CLOCK_BLOCK_IHO,                                          /*!< Internal High Speed Oscillator Input Clock */
548     CYHAL_CLOCK_BLOCK_ECO,                                          /*!< External Crystal Oscillator Input Clock */
549     CYHAL_CLOCK_BLOCK_EXT,                                          /*!< External Input Clock */
550     CYHAL_CLOCK_BLOCK_PILO,                                         /*!< Precision ILO Input Clock */
551     CYHAL_CLOCK_BLOCK_WCO,                                          /*!< Watch Crystal Oscillator Input Clock */
552 
553     CYHAL_CLOCK_BLOCK_PATHMUX,                                      /*!< Path selection mux for input to FLL/PLLs */
554 
555     CYHAL_CLOCK_BLOCK_DPLL250,                                      /*!< 250MHz Digital Phase-Locked Loop Clock */
556     CYHAL_CLOCK_BLOCK_DPLL500,                                      /*!< 500MHz Digital Phase-Locked Loop Clock */
557     CYHAL_CLOCK_BLOCK_ECO_PRESCALER,                                /*!< ECO Prescaler Divider */
558 
559     CYHAL_CLOCK_BLOCK_LF,                                           /*!< Low Frequency Clock */
560     CYHAL_CLOCK_BLOCK_MF,                                           /*!< Medium Frequency Clock */
561     CYHAL_CLOCK_BLOCK_HF,                                           /*!< High Frequency Clock */
562 
563     CYHAL_CLOCK_BLOCK_BAK,                                          /*!< Backup Power Domain Clock */
564     CYHAL_CLOCK_BLOCK_PERI,                                         /*!< Peripheral Clock Group */
565 
566 #endif
567 } cyhal_clock_block_t;
568 
569 /** @brief Clock object
570   * Application code should not rely on the specific contents of this struct.
571   * They are considered an implementation detail which is subject to change
572   * between platforms and/or HAL releases. */
573 typedef struct
574 {
575     cyhal_clock_block_t     block;
576     uint8_t                 channel;
577     bool                    reserved;
578     const void*             funcs;
579 } cyhal_clock_t;
580 
581 /**
582   * @brief Represents a particular instance of a resource on the chip.
583   * Application code should not rely on the specific contents of this struct.
584   * They are considered an implementation detail which is subject to change
585   * between platforms and/or HAL releases.
586   */
587 typedef struct
588 {
589     cyhal_resource_t type;      //!< The resource block type
590     uint8_t          block_num; //!< The resource block index
591     /**
592       * The channel number, if the resource type defines multiple channels
593       * per block instance. Otherwise, 0 */
594     uint8_t          channel_num;
595 } cyhal_resource_inst_t;
596 
597 #if defined(__cplusplus)
598 }
599 #endif /* __cplusplus */
600 
601 /** \} group_hal_impl_hw_types */
602