/*
 * Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com
 * All rights reserved.
 *
 * 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.
 *
 */

#ifndef BOARD_H
#define BOARD_H

#ifndef USE_PERIPHERAL_FRAMES
#define USE_PERIPHERAL_FRAMES
#endif

//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif

//
// Included Files
//

#include "driverlib.h"
#include "device.h"

% let Common   = system.getScript("/driverlib/Common.js");
% let pinmuxContent = system.getTemplate("/driverlib/pinmux/pinmux.board.c.xdt");
% let modsAlwaysRunOnAllContexts = ['/driverlib/gpio.js', '/driverlib/aio.js']
% var pmicconfig = system.modules['/driverlib/pmicconfig.js'];
//*****************************************************************************
//
// PinMux Configurations
//
//*****************************************************************************
`pinmuxContent("header")`
% if (!Common.onlyPinmux()) {
%   let keys = Object.keys(system.modules).sort();
%   var interruptCodeGenerated = false;
%   for (let i = 0; i < keys.length; i++) {
%       let mod = system.modules[keys[i]];
%       if (["ANALOG", "INPUTXBAR", "RTDMA1_MPU", "RTDMA2_MPU", "RTDMA1", "RTDMA2", "GPIO", "AIO"].includes(mod.peripheralName))
%           continue;
%       if (mod.peripheralName == "INTERRUPT")
%       {
%           if (interruptCodeGenerated) {continue;}
%           interruptCodeGenerated = true;
%       }
%       if (mod.templates && mod.templates.boardh) {
%           let gen = system.getTemplate(mod.templates.boardh);
%               if (gen(mod).replace("\n", "").replace("\r", "") != ""){
`gen(mod)`
%               }
%       }
%   }
%   for (var modAlwaysRun of modsAlwaysRunOnAllContexts){
%       if (!Common.isModuleOnThisContext(modAlwaysRun) && Common.isModuleOnOtherContext(modAlwaysRun))
%       {
%           var availMod = Common.getModuleForTheFirstAvailableCore(modAlwaysRun)
%           if (availMod.templates && availMod.templates.boardh) {
%               let gen = system.getTemplate(availMod.templates.boardh);
%                   if (gen(availMod).replace("\n", "").replace("\r", "") != ""){
`gen(availMod)`
%                   }
%           }
%       }
%   }
% }

% if (Common.isContextCPU1()) {
%   let inputxbarContent = system.getTemplate("/driverlib/inputxbar/inputxbar_input.board.h.xdt");
`inputxbarContent("")`

%   let rtdma1MpuContent = system.getTemplate("/driverlib/rtdma1_mpu/rtdma1_mpu.board.h.xdt");
`rtdma1MpuContent("")`

%   let rtdma2MpuContent = system.getTemplate("/driverlib/rtdma2_mpu/rtdma2_mpu.board.h.xdt");
`rtdma2MpuContent("")`

% }
%
%   let cmpssContent = system.getTemplate("/driverlib/cmpss/cmpss.board.h.xdt");
`cmpssContent("")`
%
%   let rtdma1Content = system.getTemplate("/driverlib/rtdma1/rtdma1.board.h.xdt");
`rtdma1Content("")`
%
%   let rtdma2Content = system.getTemplate("/driverlib/rtdma2/rtdma2.board.h.xdt");
`rtdma2Content("")`
%
% if (Common.isContextCPU1() || !Common.isAllocationOff()) {
%   let gpioContent = system.getTemplate("/driverlib/gpio/gpio.board.h.xdt");
`gpioContent("")`
%
%   let aioContent = system.getTemplate("/driverlib/aio/aio.board.h.xdt");
`aioContent("")`
% }
%
//*****************************************************************************
//
// Board Configurations
//
//*****************************************************************************
void	Board_init();
% if (!Common.onlyPinmux()) {
%   let keys = Object.keys(system.modules).sort();
%
%   var interruptCodeGenerated = false;
%   for (let i = 0; i < keys.length; i++) {
%       let mod = system.modules[keys[i]];
%       if (["ANALOG", "PERCONFIG", "PERCLOCK", "XBARFLAGS", "ESM", "JTAG", "INPUTXBAR", "RTDMA1_MPU", "RTDMA2_MPU", "RTDMA1", "RTDMA2", "CMPSS", "GPIO", "AIO", "FSI"].includes(mod.peripheralName))
%           continue;
%       if (mod.peripheralName == "INTERRUPT")
%       {
%           if (interruptCodeGenerated) {continue;}
%           interruptCodeGenerated = true;
%       }
%       if (mod.peripheralName != null) {
%			if (mod.peripheralName == "MCAN") {
void	`mod.peripheralName.replace("-","_")`_SYSCFG_init();
%           } else if (mod.peripheralName == "IPC") {
void	`mod.peripheralName.replace("-","_")`_SYSCFG_init();
%			} else {
void	`mod.peripheralName.replace("-","_")`_init();
%			}
%       }
%   }
% }
% else {
%   let keys = Object.keys(system.modules).sort();
%
%   for (let i = 0; i < keys.length; i++) {
%       let mod = system.modules[keys[i]];
%       if (mod.peripheralName == "INPUTXBAR") {
% //void	`mod.peripheralName.replace("-","_")`_init();
%       }
%   }
% }
% if(Common.isContextCPU1()){
void	PinMux_init();
void	PERCONFIG_init();
void	RTDMA1_MPU_init();
void	RTDMA2_MPU_init();
void    INPUTXBAR_init();
% }
% if (Common.isContextCPU1() || !Common.isAllocationOff()) {
void	GPIO_init();
void	AIO_init();
% }
void    CMPSS_init();
void	RTDMA1_init();
void	RTDMA2_init();
% if(system.modules['/ti/security/System_Security']) {
void    SSU_init();
% }
% if(pmicconfig) {
void    PMIC_init(void);
% }

//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif

#endif  // end of BOARD_H definition
