// ###########################################################################
//
//  FILE:    flash_kernel_c28x_dual_ex1_can_flash_kernel_cpu1.c
//
//  TITLE:   CAN kernel main function draft
//
//  NOTE:    Draft port of the flash-kernel example to CAN.
//           This file keeps the flash-kernel flow and replaces the serial
//           transport entry point with a CAN transport entry point.
//
// ###########################################################################
//
//  C2000Ware v26.01.00.00
//
//  Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com
//
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions are
//  met:
//
//    Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//
//    Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the
//    distribution.
//
//    Neither the name of Texas Instruments Incorporated nor the names of
//    its contributors may be used to endorse or promote products derived
//    from this software without specific prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
//  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
//  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//  $
// ###########################################################################

//
// Included Files
//

#include "F021_F2838x_C28x.h"
#include "cpu1bootrom.h"
#include "device.h"
#include "flash_programming_f2838x_c28x.h"
#include <flash_kernel_c28x_dual_ex1_erase_cpu1.h>
#include <string.h>


//
// Function Prototypes
//
void exampleError(Fapi_StatusType status);
void initFlashSectors(void);
extern uint32_t canGetFunction(uint32_t BootMode);

//
// Main
//
uint32_t main(void) {
  Device_init();
  Device_initGPIO();

  Interrupt_initModule();
  Interrupt_initVectorTable();

  EINT;
  ERTM;

  Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, 3);
  Flash_claimPumpSemaphore(FLASH_CPU1_WRAPPER);

  initFlashSectors();

  //
  // Draft CAN transport. BootMode is kept for compatibility with the
  // original example signature, but the CAN implementation uses fixed
  // CANA pins.
  //
  return canGetFunction(0U);
}

//
// Init_Flash_Sectors - Initialize flash API and active flash bank sectors
//
void initFlashSectors(void) {
  EALLOW;

  Fapi_StatusType oReturnCheck;

  oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 200);
  if (oReturnCheck != Fapi_Status_Success) {
    exampleError(oReturnCheck);
  }

  oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
  if (oReturnCheck != Fapi_Status_Success) {
    exampleError(oReturnCheck);
  }

  EDIS;
}

//
// exampleError - For this example, if an error is found just stop here
//
#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
#pragma CODE_SECTION(exampleError, ".TI.ramfunc")
#else
#pragma CODE_SECTION(exampleError, "ramfuncs")
#endif
#endif

void exampleError(Fapi_StatusType status) {
  (void)status;
  __asm("    ESTOP0");
}

//
// End of file
//
