1 /***************************************************************************//**
2 * \file cy_flash.h
3 * \version 3.50.1
4 *
5 * Provides the API declarations of the Flash driver.
6 *
7 ********************************************************************************
8 * \copyright
9 * Copyright 2016-2020 Cypress Semiconductor Corporation
10 * SPDX-License-Identifier: Apache-2.0
11 *
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 *     http://www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 *******************************************************************************/
24 
25 #if !defined (CY_FLASH_H)
26 #define CY_FLASH_H
27 
28 /**
29 * \addtogroup group_flash
30 * \{
31 * Internal flash memory programming
32 *
33 * The functions and other declarations used in this driver are in cy_flash.h.
34 * You can include cy_pdl.h to get access to all functions
35 * and declarations in the PDL.
36 *
37 * Flash memory in PSoC devices provides non-volatile storage for user firmware,
38 * user configuration data, and bulk data storage.
39 *
40 * Flash operations are implemented as system calls. System calls are executed
41 * out of SROM in the privileged mode of operation. Users have no access to read
42 * or modify the SROM code. The driver API requests the system call by acquiring
43 * the Inter-processor communication (IPC) and writing the SROM function opcode
44 * and parameters to its input registers. As a result, an NMI interrupt is invoked
45 * and the requested SROM function is executed. The operation status is returned
46 * to the driver context and a release interrupt is triggered.
47 *
48 * Writing to flash can take up to 20 milliseconds. During this time,
49 * the device should not be reset (including XRES pin, software  reset, and
50 * watchdog) or unexpected changes may be made to portions of the flash.
51 * Also, the low-voltage detect circuits should be configured to generate an
52 * interrupt instead of a reset.
53 *
54 * A Read while Write violation occurs when a flash Read operation is initiated
55 * in the same or neighboring (neighboring restriction is applicable just for the
56 * CY8C6xx6, CY8C6xx7 devices) flash sector where the flash Write, Erase, or
57 * Program operation is working. This violation may cause a HardFault exception.
58 * To avoid the Read while Write violation, carefully split the
59 * Read and Write operation on flash sectors which are not neighboring,
60 * considering both cores in the multi-processor device. If the flash is divided
61 * into four equal sectors, you may edit the linker script to place the code
62 * into neighboring sectors. For example, use sectors number 0 and 1 for code
63 * and sectors 2 and 3 for data storage.
64 *
65 * \section group_flash_configuration Configuration Considerations
66 *
67 * \subsection group_flash_config_intro Introduction:
68 * The PSoC 6 MCU user-programmable Flash consists of:
69 * - Application flash memory (from 2 to 8 sectors) - 128KB/256KB each.
70 * - EE emulation flash memory - 32KB.
71 *
72 * Write operation may be done as Blocking or Partially Blocking,
73 * defined as follows:
74 *
75 * \subsection group_flash_config_blocking Blocking:
76 * In this case, the entire Flash block is not available for the duration of the
77 * Write (∼16ms). Therefore, no Flash accesses (from any Bus Master) can
78 * occur during that time. CPU execution can be performed from SRAM. All
79 * pre-fetching must be disabled. Code execution from Flash is blocked for the
80 * Flash Write duration for both cores.
81 *
82 * \subsection group_flash_config_block_const Constraints for Blocking Flash operations:
83 * -# During write to flash, the device should not be reset (including XRES pin,
84 * software reset, and watchdog), or unexpected changes may be made to portions
85 * of the flash.
86 * -# The low-voltage detect circuits should be configured to generate an
87 *    interrupt instead of a reset.
88 * -# Flash rite operation is allowed only in one of the following CM4 states:
89 *     -# CM4 is Active and initialized:<br>
90 *        call \ref Cy_SysEnableCM4 "Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR)".
91 *        <b>Note:</b> If desired user may put CM4 core in Deep Sleep any time
92 *        after calling Cy_SysEnableCM4().
93 *     -# CM4 is Off and disabled:<br>
94 *        call Cy_SysDisableCM4(). <b>Note:</b> In this state Debug mode is not
95 *        supported.
96 *     .
97 * -# Flash Write cannot be performed in Ultra Low Power (core voltage 0.9V) mode.
98 * -# Interrupts must be enabled on both active cores. Do not enter a critical
99 *    section during flash operation.
100 * -# For the CY8C6xx6, CY8C6xx7 devices user must guarantee that system pipe
101 *    interrupts (IPC interrupts 3 and 4) have the highest priority, or
102 *    at least that pipe interrupts are not interrupted or in a pending state
103 *    for more than 700 &micro;s.
104 * -# User must guarantee that during flash write operation no flash read
105 *    operations are performed by bus masters other than CM0+ and CM4 (DMA and
106 *    Crypto).
107 * -# For the CY8C6xx6, CY8C6xx7 devices if you do not use the default startup, perform the following steps
108 *    before any flash write/erase operations:
109 * \snippet flash/snippet/main.c Flash Initialization
110 *
111 * \subsection group_flash_config_rww Partially Blocking:
112 * This method has a much shorter time window during which Flash accesses are not
113 * allowed. Application code execution from Flash is blocked for only a part of
114 * Flash Write duration, for both cores. Blocking duration depends upon the API
115 * sequence used.
116 *
117 * For API sequence Cy_Flash_StartEraseRow() + Cy_Flash_StartProgram() there are
118 * four block-out regions during which Read is blocked. See <b>Figure 1</b>.
119 *
120 * <center>
121 * <table class="doxtable">
122 * <caption>Table 1 - Block-out periods (timing values are valid just for the
123 * CY8C6xx6, CY8C6xx7 devices) </caption>
124 *   <tr>
125 *     <th>Block-out</th>
126 *     <th>Phase</th>
127 *     <th>Duration</th>
128 *   </tr>
129 *   <tr>
130 *     <td>A</td>
131 *     <td>The beginning of the Erase operation</td>
132 *     <td>2ms + 9500 SlowClk cycles</td>
133 *   </tr>
134 *   <tr>
135 *     <td>B</td>
136 *     <td>The end of the Erase operation</td>
137 *     <td>0.13ms + 1000 SlowClk cycles</td>
138 *   </tr>
139 *   <tr>
140 *     <td>C</td>
141 *     <td>The beginning of the Program operation</td>
142 *     <td>0.8ms + 6000 SlowClk cycles</td>
143 *   </tr>
144 *   <tr>
145 *     <td>D</td>
146 *     <td>The end of the Program operation</td>
147 *     <td>0.13ms + 1000 SlowClk cycles</td>
148 *   </tr>
149 * </table>
150 * </center>
151 *
152 * This allows both cores to execute for about 80% of Flash Write
153 * operation - see <b>Figure 1</b>.
154 * This capability is important for communication protocols that rely on fast
155 * response.
156 *
157 * \image html flash-rww-diagram.png "Figure 1 - Blocking Intervals in Flash Write operation"
158 *
159 * For the Cy_Flash_StartWrite() function, the block-out period is different for
160 * the two cores. The core that initiates Cy_Flash_StartWrite() is blocked for
161 * two periods:
162 * - From start of Erase operation (start of A on Figure 1) till the start of
163 *   Program operation (end of C on Figure 1).
164 * - During D period on <b>Figure 1</b>.
165 *
166 * The core that performs read/execute is blocked identically to the previous
167 * scenario - see <b>Figure 1</b>.
168 *
169 * This allows the core that initiates Cy_Flash_StartWrite() to execute for about
170 * 20% of Flash Write operation. The other core executes for about 80% of Flash
171 * Write operation.
172 *
173 * Some constraints must be planned for in the Partially Blocking mode which are
174 * described in detail below.
175 *
176 * \subsection group_flash_config_rww_const Constraints for Partially Blocking Flash operations:
177 * -# During write to flash, the device should not be reset (including XRES pin,
178 *    software reset, and watchdog) or unexpected changes may be made to portions
179 *    of the flash.
180 * -# The low-voltage detect circuits should be configured to generate an
181 *    interrupt instead of a reset.
182 * -# During write to flash, application code should not change the clock
183 *    settings. Use Cy_Flash_IsOperationComplete() to ensure flash write
184 *    operation is finished.
185 * -# During write to flash, application code should not start the clock
186 *    measurements (should not call Cy_SysClk_StartClkMeasurementCounters()).
187 * -# Flash write operation is allowed only in one of the following CM4 states:
188 *     -# CM4 is Active and initialized:<br>
189 *        call \ref Cy_SysEnableCM4 "Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR)".
190 *        <b>Note:</b> If desired user may put CM4 core in Deep Sleep any time
191 *        after calling Cy_SysEnableCM4().
192 *     -# CM4 is Off and disabled:<br>
193 *        call Cy_SysDisableCM4(). <b>Note:</b> In this state Debug mode is not
194 *        supported.
195 *     .
196 * -# Use the following rules for split by sectors. (In this context, read means
197 *    read of any bus master: CM0+, CM4, DMA, Crypto, etc.)
198 *     -# Do not write to and read/execute from the same flash sector at the same
199 *        time. This is true for all sectors.
200 *     -# Writing rules in application flash (this restriction is applicable just
201 * for CY8C6xx6, CY8C6xx7 devices):
202 *         -# Any bus master can read/execute from UFLASH S0 and/or S1, during
203 *            flash write to UFLASH S2 or S3.
204 *         -# Any bus master can read/execute from UFLASH S2 and/or S3, during
205 *            flash write to UFLASH S0 or S1.
206 *
207 *         <b>Suggestion:</b> in case of bootloading, it is recommended to place
208 *         code for CM4 in either S0 or S1. CM0+ code resides in S0. Write data
209 *         to S2 and S3 sections.
210 *     .
211 * -# Flash Write cannot be performed in Ultra Low Power mode (core voltage 0.9V).
212 * -# Interrupts must be enabled on both active cores. Do not enter a critical
213 *    section during flash operation.
214 * -# For the CY8C6xx6, CY8C6xx7 devices user must guarantee that system pipe
215 *    interrupts (IPC interrupts 3 and 4) have the highest priority, or at
216 *    least that pipe interrupts are not interrupted or in a pending state
217 *    for more than 700 &micro;s.
218 * -# For the CY8C6xx6, CY8C6xx7 devices if you do not use the default startup, perform the following steps
219 *    before any flash write/erase operations:
220 * \snippet flash/snippet/main.c Flash Initialization
221 *
222 * \subsection group_flash_config_emeeprom EEPROM section use:
223 * If you plan to use "cy_em_eeprom" section for different purposes for both of
224 * device cores or use <b>Em_EEPROM Middleware</b> together with flash driver
225 * write operations you must modify the linker scripts.<br>
226 * For more information, refer to the <b>Middleware/Cypress Em_EEPROM Middleware
227 * Library</b> section of the PDL documentation.
228 *
229 * \section group_flash_more_information More Information
230 *
231 * See the technical reference manual (TRM) for more information about the Flash
232 * architecture.
233 *
234 * \section group_flash_changelog Changelog
235 *
236 * <table class="doxtable">
237 *   <tr><th>Version</th><th style="width: 52%;">Changes</th><th>Reason for Change</th></tr>
238 *   <tr>
239 *     <td>3.50.1</td>
240 *     <td>Updated documentation to limit devices with the restrictions.</td>
241 *     <td>User experience enhancement.</td>
242 *   </tr>
243 *   <tr>
244 *     <td rowspan="2">3.50</td>
245 *     <td>Updated attribute usage for the linker section placement.</td>
246 *     <td>Enhancement based on usability feedback.</td>
247 *   </tr>
248 *   <tr>
249 *     <td>Fixed/documented MISRA 2012 violations.</td>
250 *     <td>MISRA 2012 compliance.</td>
251 *   </tr>
252 *   <tr>
253 *     <td rowspan="1">3.40</td>
254 *     <td>Updated Cy_Flash_OperationStatus() to access protected registers.</td>
255 *     <td>Added PSoC 64 device support.</td>
256 *   </tr>
257 *   <tr>
258 *     <td rowspan="1">3.30.4</td>
259 *     <td>Improved documentation.</td>
260 *     <td>User experience enhancement.</td>
261 *   </tr>
262 *   <tr>
263 *     <td rowspan="1">3.30.3</td>
264 *     <td>Updated documentation to limit devices with the restrictions. Improved calculation of the CY_FLASH_DELAY_CORRECTIVE macro.</td>
265 *     <td>User experience enhancement.</td>
266 *   </tr>
267 *   <tr>
268 *     <td rowspan="1">3.30.2</td>
269 *     <td>Updated documentation to limit devices with the neighboring restriction.</td>
270 *     <td>User experience enhancement.</td>
271 *   </tr>
272 *   <tr>
273 *     <td rowspan="1">3.30.1</td>
274 *     <td>Used the CY_RAMFUNC_BEGIN and CY_RAMFUNC_END macros that allocate the function in RAM instead of using the CY_SECTION(".cy_ramfunc") macros.</td>
275 *     <td>Removed the code duplication.</td>
276 *   </tr>
277 *   <tr>
278 *     <td rowspan="3">3.30</td>
279 *     <td>Moved ipcWaitMessageStc structure to the RAM section called ".cy_sharedmem".</td>
280 *     <td>Support Secure Boot devices.</td>
281 *   </tr>
282 *   <tr>
283 *     <td>Renamed Function Cy_Flash_StartErase() to Cy_Flash_StartEraseRow().</td>
284 *     <td>The driver improvements based on the usability feedback.</td>
285 *   </tr>
286 *   <tr>
287 *     <td>Added new API functions \ref Cy_Flash_EraseSector,
288 *         \ref Cy_Flash_StartEraseSector, \ref Cy_Flash_EraseSubsector,
289 *         \ref Cy_Flash_StartEraseSubsector </td>
290 *     <td>The driver improvements based on the usability feedback.</td>
291 *   </tr>
292 *   <tr>
293 *     <td rowspan="3">3.20</td>
294 *     <td>Flattened the organization of the driver source code into the single source directory and the single include directory.</td>
295 *     <td>Driver library directory-structure simplification.</td>
296 *   </tr>
297 *   <tr>
298 *     <td>Added new API function \ref Cy_Flash_InitExt</td>
299 *     <td>The driver improvements based on the usability feedback</td>
300 *   </tr>
301 *   <tr>
302 *     <td>Added register access layer. Use register access macros instead
303 *         of direct register access using dereferenced pointers.</td>
304 *     <td>Makes register access device-independent, so that the PDL does
305 *         not need to be recompiled for each supported part number.</td>
306 *   </tr>
307 *   <tr>
308 *     <td>3.11</td>
309 *     <td>Updated driver functionality to correctly use the SysClk measurement
310 *         counters while partially blocking flash operations</td>
311 *     <td>Added arbiter mechanism for correct usage of the SysClk measurement
312 *         counters</td>
313 *   </tr>
314 *   <tr>
315 *     <td>3.10</td>
316 *     <td>Updated Cy_Flash_SendCmd() code to support single core devices.</td>
317 *     <td>Support new devices</td>
318 *   </tr>
319 *   <tr>
320 *     <td>3.0</td>
321 *     <td>New function - Cy_Flash_ProgramRow();<br>
322 *         Updated Cy_Flash_RowChecksum(): changed input parameter to take the
323 *         <b>row address</b> (rowAddr) instead of the <b>row number</b>
324 *         (rowNum);<br>
325 *         Renamed macro for disabling RWW support in driver to
326 *         <b>CY_FLASH_RWW_DRV_SUPPORT_DISABLED</b>.<br>
327 *         Updated \ref group_flash_configuration documentation section with
328 *         flash usage constraints.</td>
329 *     <td>Improvements made based on usability feedback to use a common
330 *         interface</td>
331 *   </tr>
332 *   <tr>
333 *     <td rowspan="3">2.0</td>
334 *     <td>Added non-blocking erase function - Cy_Flash_StartErase().
335 *         Removed the clear cache function call.</td>
336 *     <td>The clear cache operation is removed from the blocking Write/Erase
337 *         function because in this case it is performed by the hardware.
338 *         Otherwise it is documented that it is the user's responsibility to
339 *         clear the cache after executing the non-blocking Write/Erase flash
340 *         operation.</td>
341 *   </tr>
342 *   <tr>
343 *     <td>Added new Cy_Flash_IsOperationComplete() function to check completeness.
344 *         Obsoleted Cy_Flash_IsWriteComplete(), Cy_Flash_IsProgramComplete(),
345 *         and Cy_Flash_IsEraseComplete() functions.<br>
346 *         Added Cy_Flash_GetExternalStatus() function to get unparsed status where
347 *         flash driver will be used in security applications with other modules
348 *         as SecureImage.<br>
349 *         Added Cy_Flash_Init() function to initialize all needed prerequisites
350 *         for Erase/Write operations.</td>
351 *     <td>Updated driver design to improve user experience.</td>
352 *   </tr>
353 *   <tr>
354 *     <td>Updated driver implementation to remove MISRA rules deviations.</td>
355 *     <td>Driver implementation quality improvement.</td>
356 *   </tr>
357 *   <tr>
358 *     <td>1.0</td>
359 *     <td>Initial version</td>
360 *     <td></td>
361 *   </tr>
362 * </table>
363 *
364 * \defgroup group_flash_macros Macros
365 * \{
366 *     \defgroup group_flash_general_macros Flash general parameters
367 *         Provides general information about flash
368 *
369 *     \defgroup group_flash_config_macros  Flash configuration
370 *         Specifies the parameter values passed to SROM API
371 * \}
372 * \defgroup group_flash_functions Functions
373 * \defgroup group_flash_enumerated_types Enumerated Types
374 */
375 
376 #include "cy_device.h"
377 
378 #if defined (CY_IP_M4CPUSS)
379 
380 #include "cy_syslib.h"
381 
382 #if defined(__cplusplus)
383 extern "C" {
384 #endif
385 
386 /***************************************
387 * Macro definitions
388 ***************************************/
389 /**
390 * \addtogroup group_flash_macros
391 * \{
392 */
393 
394 /** Driver major version */
395 #define CY_FLASH_DRV_VERSION_MAJOR       3
396 
397 /** Driver minor version */
398 #define CY_FLASH_DRV_VERSION_MINOR       50
399 
400 #define CY_FLASH_ID               (CY_PDL_DRV_ID(0x14UL))                          /**< FLASH PDL ID */
401 
402 #define CY_FLASH_ID_INFO          (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_INFO )   /**< Return prefix for FLASH driver function status codes */
403 #define CY_FLASH_ID_WARNING       (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_WARNING) /**< Return prefix for FLASH driver function warning return values */
404 #define CY_FLASH_ID_ERROR         (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_ERROR)   /**< Return prefix for FLASH driver function error return values */
405 
406 /** \} group_flash_macros */
407 
408 
409 /**
410 * \addtogroup group_flash_general_macros
411 * \{
412 */
413 
414 /** Flash row size */
415 #define CY_FLASH_SIZEOF_ROW                (CPUSS_FLASHC_PA_SIZE * 4u)
416 /** Long words flash row size */
417 #define CY_FLASH_SIZEOF_ROW_LONG_UNITS     (CY_FLASH_SIZEOF_ROW / sizeof(uint32_t))
418 
419 /** \} group_flash_general_macros */
420 
421 
422 /**
423 * \addtogroup group_flash_enumerated_types
424 * \{
425 */
426 
427 /** This enum has the return values of the Flash driver */
428 typedef enum cy_en_flashdrv_status
429 {
430     CY_FLASH_DRV_SUCCESS                  =   0x00UL,  /**< Success */
431     CY_FLASH_DRV_INV_PROT                 =   ( CY_FLASH_ID_ERROR + 0x0UL),  /**< Invalid device protection state */
432     CY_FLASH_DRV_INVALID_FM_PL            =   ( CY_FLASH_ID_ERROR + 0x1UL),  /**< Invalid flash page latch address */
433     CY_FLASH_DRV_INVALID_FLASH_ADDR       =   ( CY_FLASH_ID_ERROR + 0x2UL),  /**< Invalid flash address */
434     CY_FLASH_DRV_ROW_PROTECTED            =   ( CY_FLASH_ID_ERROR + 0x3UL),  /**< Row is write protected */
435     CY_FLASH_DRV_IPC_BUSY                 =   ( CY_FLASH_ID_ERROR + 0x5UL),  /**< IPC structure is already locked by another process */
436     CY_FLASH_DRV_INVALID_INPUT_PARAMETERS =   ( CY_FLASH_ID_ERROR + 0x6UL),  /**< Input parameters passed to Flash API are not valid */
437     CY_FLASH_DRV_PL_ROW_COMP_FA           =   ( CY_FLASH_ID_ERROR + 0x22UL), /**< Comparison between Page Latches and FM row failed */
438     CY_FLASH_DRV_ERR_UNC                  =   ( CY_FLASH_ID_ERROR + 0xFFUL), /**< Unknown error code. See \ref Cy_Flash_GetExternalStatus() */
439     CY_FLASH_DRV_PROGRESS_NO_ERROR        =   ( CY_FLASH_ID_INFO  + 0x0UL),  /**< Command in progress; no error */
440     CY_FLASH_DRV_OPERATION_STARTED        =   ( CY_FLASH_ID_INFO  + 0x1UL),  /**< Flash operation is successfully initiated */
441     CY_FLASH_DRV_OPCODE_BUSY              =   ( CY_FLASH_ID_INFO  + 0x2UL)   /**< Flash is under operation */
442 } cy_en_flashdrv_status_t;
443 
444 
445 #if !defined (CY_FLASH_RWW_DRV_SUPPORT_DISABLED)
446     /** Flash notification configuration structure */
447     typedef struct
448     {
449         uint8_t  clientID;      /**< Client ID */
450         uint8_t  pktType;       /**< Message Type */
451         uint16_t intrRelMask;   /**< Mask */
452     } cy_stc_flash_notify_t;
453 #endif /* !defined (CY_FLASH_RWW_DRV_SUPPORT_DISABLED) */
454 
455 /** \} group_flash_enumerated_types */
456 
457 /***************************************
458 * Function Prototypes
459 ***************************************/
460 
461 /**
462 * \addtogroup group_flash_functions
463 * \{
464 */
465 void Cy_Flash_Init(void);
466 cy_en_flashdrv_status_t Cy_Flash_EraseRow(uint32_t rowAddr);
467 cy_en_flashdrv_status_t Cy_Flash_StartEraseRow(uint32_t rowAddr);
468 cy_en_flashdrv_status_t Cy_Flash_EraseSector(uint32_t sectorAddr);
469 cy_en_flashdrv_status_t Cy_Flash_StartEraseSector(uint32_t sectorAddr);
470 cy_en_flashdrv_status_t Cy_Flash_EraseSubsector(uint32_t subSectorAddr);
471 cy_en_flashdrv_status_t Cy_Flash_StartEraseSubsector(uint32_t subSectorAddr);
472 cy_en_flashdrv_status_t Cy_Flash_ProgramRow(uint32_t rowAddr, const uint32_t* data);
473 cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data);
474 cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data);
475 cy_en_flashdrv_status_t Cy_Flash_StartProgram(uint32_t rowAddr, const uint32_t* data);
476 cy_en_flashdrv_status_t Cy_Flash_IsOperationComplete(void);
477 cy_en_flashdrv_status_t Cy_Flash_RowChecksum(uint32_t rowAddr, uint32_t* checksumPtr);
478 cy_en_flashdrv_status_t Cy_Flash_CalculateHash(const uint32_t* data, uint32_t numberOfBytes, uint32_t* hashPtr);
479 uint32_t Cy_Flash_GetExternalStatus(void);
480 
481 #if !defined (CY_FLASH_RWW_DRV_SUPPORT_DISABLED)
482     void Cy_Flash_InitExt(cy_stc_flash_notify_t *ipcWaitMessageAddr);
483 #endif /* !defined (CY_FLASH_RWW_DRV_SUPPORT_DISABLED) */
484 
485 /** \} group_flash_functions */
486 
487 /** \cond INTERNAL */
488 #if (CY_CPU_CORTEX_M4)
489 void Cy_Flash_ResumeIrqHandler(void);
490 #endif
491 
492 /*******************************************************************************
493 Backward compatibility macro. The following code is DEPRECATED and must
494 not be used in new projects
495 *******************************************************************************/
496 #define     Cy_Flash_IsWriteComplete(...)    Cy_Flash_IsOperationComplete()
497 #define     Cy_Flash_IsProgramComplete(...)  Cy_Flash_IsOperationComplete()
498 #define     Cy_Flash_IsEraseComplete(...)    Cy_Flash_IsOperationComplete()
499 #define     CY_FLASH_NUMBER_ROWS             (CY_FLASH_SIZE / CY_FLASH_SIZEOF_ROW)
500 #define     Cy_Flash_StartErase              Cy_Flash_StartEraseRow
501 
502 /** \endcond */
503 
504 #if defined(__cplusplus)
505 }
506 #endif
507 
508 #endif /* CY_IP_M4CPUSS */
509 
510 #endif /* #if !defined (CY_FLASH_H) */
511 
512 /** \} group_flash */
513 
514 
515 /* [] END OF FILE */
516