
/* =============================================================================
 *   Copyright (c) Texas Instruments Incorporated 2018
 *
 *  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.
 */
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var Memory = xdc.useModule('xdc.runtime.Memory')
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
var GateSwi = xdc.useModule('ti.sysbios.gates.GateSwi');

var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Hwi');
var Core = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Core');
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var SysMin = xdc.useModule('xdc.runtime.SysMin');

/* Select dummyIRQ not used by CSLR mapping */
Hwi.dummyIRQ = 384;

/* System stack size (used by ISRs and Swis) */
Program.stack = 0x2000;

/* Place vector table in separate section - by default this goes to 0x0 which
 * is reserved by SBL */
Program.sectMap[".vecs"] = "RESET_VECTORS";

var Task = xdc.useModule('ti.sysbios.knl.Task');
Task.defaultStackSize = 0x4000;
Task.common$.namedInstance = true;
Task.common$.namedModule = true;

/* Enable cache */
var Cache = xdc.useModule('ti.sysbios.family.arm.v7r.Cache');
Cache.enableCache = true;

/*
 * Direct CIO to UART
 */
/* System.SupportProxy = SysUart; */
System.SupportProxy = SysMin;
System.extendedFormats += "%f";
/*
 * Program.argSize sets the size of the .args section.
 * The examples don't use command line args so argSize is set to 0.
 */
Program.argSize = 0x0;

/*
 * Uncomment this line to globally disable Asserts.
 * All modules inherit the default from the 'Defaults' module.  You
 * can override these defaults on a per-module basis using Module.common$.
 * Disabling Asserts will save code space and improve runtime performance.
Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF;
 */

/*
 * Uncomment this line to keep module names from being loaded on the target.
 * The module name strings are placed in the .const section. Setting this
 * parameter to false will save space in the .const section.  Error and
 * Assert messages will contain an "unknown module" prefix instead
 * of the actual module name.
Defaults.common$.namedModule = false;
 */

/* Create default heap and hook it into Memory */
var heapMemParams = new HeapMem.Params;
heapMemParams.size = 16384*4;
var heap0 = HeapMem.create(heapMemParams);

Memory.defaultHeapInstance = heap0;

/*
 * Minimize exit handler array in System.  The System module includes
 * an array of functions that are registered with System_atexit() to be
 * called by System_exit().
 */
System.maxAtexitHandlers = 4;

/*
 * Uncomment this line to disable the Error print function.
 * We lose error information when this is disabled since the errors are
 * not printed.  Disabling the raiseHook will save some code space if
 * your app is not using System_printf() since the Error_print() function
 * calls System_printf().
Error.raiseHook = null;
 */

/*
 * Uncomment this line to keep Error, Assert, and Log strings from being
 * loaded on the target.  These strings are placed in the .const section.
 * Setting this parameter to false will save space in the .const section.
 * Error, Assert and Log message will print raw ids and args instead of
 * a formatted message.
Text.isLoaded = false;
 */

/*
 * Uncomment this line to disable the output of characters by SysMin
 * when the program exits.  SysMin writes characters to a circular buffer.
 * This buffer can be viewed using the SysMin Output view in ROV.
SysMin.flushAtExit = false;
 */

/*
 * Create and install logger for the whole system
 */
var loggerBufParams = new LoggerBuf.Params();
loggerBufParams.numEntries = 32;
var logger0 = LoggerBuf.create(loggerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.ALWAYS_ON;

BIOS.libType = BIOS.LibType_Custom;
BIOS.cpuFreq.lo = 1000000000;
BIOS.cpuFreq.hi = 0;

var coreId = java.lang.System.getenv("CORE");

var DMTimer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
DMTimer.checkFrequency = false;
for (var i=0; i < DMTimer.numTimerDevices; i++) {
    DMTimer.intFreqs[i].lo = 19200000;
    DMTimer.intFreqs[i].hi = 0;
}

if(coreId=="mcu1_0")
{
    Core.id = 0;
    /* DM timer cfg */
    Clock.timerId = 1;
}
if(coreId=="mcu1_1")
{
    Core.id = 1;
    /* DM timer cfg */
    Clock.timerId = 2;
}
if(coreId=="mcu2_0")
{
    Core.id = 0;
    Clock.timerId = 0;
    /* DMTimer #12 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[0].baseAddr = 0x024c0000;
    DMTimer.timerSettings[0].intNum = 168;
}
if(coreId=="mcu2_1")
{
    Core.id = 1;
    Clock.timerId = 1;
    /* DMTimer #13 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[1].baseAddr = 0x024d0000;
    DMTimer.timerSettings[1].intNum = 169;
}
if(coreId=="mcu3_0")
{
    Core.id = 0;
    Clock.timerId = 2;
    /* DMTimer #14 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[2].baseAddr = 0x024e0000;
    DMTimer.timerSettings[2].intNum = 170;
}
if(coreId=="mcu3_1")
{
    Core.id = 1;
    Clock.timerId = 3;
    /* DMTimer #15 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[3].baseAddr = 0x024f0000;
    DMTimer.timerSettings[3].intNum = 171;
}

/* Set base address of Vector Interrupt Manager */
if((coreId=="mcu2_0") || (coreId=="mcu2_1") || (coreId=="mcu3_0") || (coreId=="mcu3_1"))
{
    var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Hwi');
    Hwi.vimBaseAddress = 0x0ff80000;
}

var Reset = xdc.useModule("xdc.runtime.Reset");
/*Reset.fxns[Reset.fxns.length++] = "&utilsCopyVecs2ATcm";*/
Reset.fxns[Reset.fxns.length++] = "&mcuCopyVecs2Exc";

/*
 * Initialize MPU and enable it
 *
 * Note: MPU must be enabled and properly configured for caching to work.
 */
xdc.loadCapsule("r5_mpu.xs");

var Load = xdc.useModule('ti.sysbios.utils.Load');

/* load calculation related settings */
Load.swiEnabled   = true;
Load.hwiEnabled   = true;
Load.taskEnabled  = true;
Load.updateInIdle = true;

/* Check if application needs to update with custom configuration options */
/* Caution: This should be at the end of this file after all other common cfg */
var cfgUpdate = java.lang.System.getenv("XDC_CFG_UPDATE")
if ((cfgUpdate != '')&&(cfgUpdate != null))
{
    xdc.print("Loading configuration update " + cfgUpdate);
    xdc.loadCapsule(cfgUpdate);
}
