/************************************************************************** * * Copyright (c) 2026-2027 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file NVDriver.c * * @author (original) Arpita Srivastava * @date (original) 31-Mar-2026 * ***************************************************************************/ #include "F021.h" // For fapi operations #include "FapiFunctions.h" #include "NVDriver.h" #include "system.h" // For fapi operations /** * @addtogroup NVDriver * @{ */ // ********** private definitions ********** // The clock frequency comes from HCLK_FREQ and it has to be rounded up to the nearest number #define ROUNDED_HCLK_FREQ FLOAT_TO_INT_WITH_ROUND(HCLK_FREQ) ///< Rounded HCLK for EERPOM clock. #define BANK7_SECTOR_0_31_ENABLE_BIT_MASK 0x0000000F ///< Bank7 sector 0 t0 31 enable mask. #define BANK7_SECTOR_32_63_ENABLE_BIT_MASK 0x00000000 ///< Bank7 sector 32 to 63 enable mask. static BOOL getSectorStartAddress( U32* recordFlashAddress ); void initNVDriver( void ) { // Initialize and activate flash bank 7 Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); Fapi_setActiveFlashBank( Fapi_FlashBank7 ); Fapi_enableEepromBankSectors( BANK7_SECTOR_0_31_ENABLE_BIT_MASK, BANK7_SECTOR_32_63_ENABLE_BIT_MASK ); } void eraseSector( U32* recordFlashAddress ) { BOOL isFlashAddressValid = getSectorStartAddress( recordFlashAddress ); if ( TRUE == isFlashAddressValid) { Fapi_issueAsyncCommandWithAddress( Fapi_EraseSector, recordFlashAddress ); } } void writeSector( U32* recordFlashAddress, U08* bufferAddress, U32 bufferSize ) { // Create a copy only for validation U32 sectorStartAddress = *recordFlashAddress; BOOL isFlashAddressValid = getSectorStartAddress( §orStartAddress ); if ( ( TRUE == isFlashAddressValid ) && ( NULL != bufferAddress ) && ( bufferSize > 0 ) ) { Fapi_issueProgrammingCommand( recordFlashAddress, bufferAddress, bufferSize, 0x00, 0, Fapi_DataOnly ); } } void readSector( U32* recordFlashAddress, U32* bufferAddress, U32 bufferSize ) { // Create a copy only for validation U32 sectorStartAddress = *recordFlashAddress; BOOL isFlashAddressValid = getSectorStartAddress( §orStartAddress ); if ( ( TRUE == isFlashAddressValid ) && ( NULL != bufferAddress ) && ( bufferSize > 0 ) ) { Fapi_doMarginRead( recordFlashAddress, bufferAddress, bufferSize, Fapi_NormalRead ); } } BOOL isFlashReady( void ) { return (Fapi_Status_FsmReady == FAPI_CHECK_FSM_READY_BUSY); } static BOOL getSectorStartAddress( U32* recordFlashAddress ) { BOOL isFlashAddressValid = TRUE; if ( NULL == recordFlashAddress ) { return FALSE; } if ( ( BANK7_SECTOR0_START_ADDRESS <= *recordFlashAddress ) && ( BANK7_SECTOR0_END_ADDRESS >= *recordFlashAddress ) ) { *recordFlashAddress = BANK7_SECTOR0_START_ADDRESS; } else if ( ( BANK7_SECTOR1_START_ADDRESS <= *recordFlashAddress ) && ( BANK7_SECTOR1_END_ADDRESS >= *recordFlashAddress ) ) { *recordFlashAddress = BANK7_SECTOR1_START_ADDRESS; } else if ( ( BANK7_SECTOR2_START_ADDRESS <= *recordFlashAddress ) && ( BANK7_SECTOR2_END_ADDRESS >= *recordFlashAddress ) ) { *recordFlashAddress = BANK7_SECTOR2_START_ADDRESS; } else if ( ( BANK7_SECTOR3_START_ADDRESS <= *recordFlashAddress ) && ( BANK7_SECTOR3_END_ADDRESS >= *recordFlashAddress ) ) { *recordFlashAddress = BANK7_SECTOR3_START_ADDRESS; } else { isFlashAddressValid = FALSE; } return isFlashAddressValid; } /**@}*/