Add WatchdogTimer source DEV.WDTIMER.01.00.00.02
authorJustin Sobota <jsobota@ti.com>
Tue, 8 Sep 2015 18:27:18 +0000 (14:27 -0400)
committerJustin Sobota <jsobota@ti.com>
Tue, 8 Sep 2015 18:27:18 +0000 (14:27 -0400)
Signed-off-by: Justin Sobota <jsobota@ti.com>
28 files changed:
Settings.xdc.xdt [new file with mode: 0644]
WatchdogTimer.xdc [new file with mode: 0644]
WatchdogTimer.xs [new file with mode: 0644]
WatchdogTimerver.h.xdt [new file with mode: 0644]
build/buildlib.xs [new file with mode: 0644]
config.bld [new file with mode: 0644]
docs/Module.xs [new file with mode: 0644]
docs/ReleaseNotes_WatchdogTimer.doc [new file with mode: 0644]
docs/ReleaseNotes_WatchdogTimer.pdf [new file with mode: 0644]
docs/doxyfile.xdt [new file with mode: 0644]
docs/tifooter.htm [new file with mode: 0644]
docs/tiheader.htm [new file with mode: 0644]
docs/tilogo.gif [new file with mode: 0644]
docs/titagline.gif [new file with mode: 0644]
package.bld [new file with mode: 0644]
package.xdc [new file with mode: 0644]
package.xs [new file with mode: 0644]
src/Module.xs [new file with mode: 0644]
src/WatchdogTimer.c [new file with mode: 0644]
test/Module.xs [new file with mode: 0644]
test/README.txt [new file with mode: 0644]
test/src/test.c [new file with mode: 0644]
test/test.cfg [new file with mode: 0644]
test/wdtimer_C6614TestInstrumentationProject.txt [new file with mode: 0644]
test/wdtimer_K2ETestInstrumentationProject.txt [new file with mode: 0644]
test/wdtimer_K2HTestInstrumentationProject.txt [new file with mode: 0644]
test/wdtimer_K2KTestInstrumentationProject.txt [new file with mode: 0644]
test/wdtimer_K2LTestInstrumentationProject.txt [new file with mode: 0644]

diff --git a/Settings.xdc.xdt b/Settings.xdc.xdt
new file mode 100644 (file)
index 0000000..9371cea
--- /dev/null
@@ -0,0 +1,24 @@
+
+%%{
+/*!
+ *  This template implements the Settings.xdc
+ */  
+  /* Versioning */
+  var ver = this;
+  for each(i=0;i<ver.length;i++)
+  {
+      if(String(ver[i]).length < 2)
+      {
+        ver[i]="0"+ver[i];
+      }
+  }
+  
+  var packageVersion = "\""+ver[0]+"."+ver[1]+"."+ver[2]+"."+ver[3]+"\"";
+
+%%}
+
+module Settings
+{
+    config string WatchdogTimerVersionString = `packageVersion`;
+}
+
diff --git a/WatchdogTimer.xdc b/WatchdogTimer.xdc
new file mode 100644 (file)
index 0000000..7c4234c
--- /dev/null
@@ -0,0 +1,305 @@
+/* 
+ * Copyright (c) 2012, Texas Instruments Incorporated
+ * 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.
+ * */
+/*
+ *  ======== WatchdogTimer.xdc ========
+ *
+ */
+
+module WatchdogTimer
+{
+    // -------- External Module Constants --------
+
+    /*
+     *  Configuration values for Reset Configuration Register (RSTCFG).  Enum values based on register field values.
+     *  @p(blist)
+     * -HARD_RESET -> Watchdog timer reset will be a hard reset
+     * -LOCAL_RESET_INPUT -> Watchdog timer reset will be a soft reset
+     *  @p     
+     */
+    enum RstcfgResetType {
+        RstcfgResetType_HARD_RESET = 0,
+        RstcfgResetType_SOFT_RESET = 1
+    };
+
+     // -------- Module API Structures --------
+
+    /*!     
+     *  Output modes for the RSTMUX register which decides how the system handles Watchdog timer timeouts.  Output modes
+     *  from "Reset Mux Register Field Descriptions Table" (Ex, Table 3-19 of SPRS671B for 6614) of device Data manual
+     *  @p(blist)
+     * -DEFAULT_NO_OUTPUT_EVENT -> Default on system reset, WD timeout causes no output event
+     * -LOCAL_RESET_INPUT -> WD timeout causes local reset input to CorePac
+     * -NMI_INPUT -> WD timeout causes NMI input to CorePac
+     * -NMI_INPUT_PLUS_LOCAL_RESET_INPUT -> WD timeout causes an NMI input followed by a local reset input.  The delay between
+     *                                                                   the NMI and the local reset is defined by RstmuxDelay configuration parameter
+     * -DEVICE_RESET -> WD timeout event causes a device reset
+     *  @p
+     */ 
+    enum RstmuxOmode {
+        RstmuxOmode_DEFAULT_NO_OUTPUT_EVENT = 0,
+        RstmuxOmode_LOCAL_RESET_INPUT = 2,
+        RstmuxOmode_NMI_INPUT = 3,
+        RstmuxOmode_NMI_INPUT_PLUS_LOCAL_RESET_INPUT = 4,
+        RstmuxOmode_DEVICE_RESET = 5
+    };
+
+    /*!     
+     *  Delay for the RSTMUX register which decide how long the system delays between NMI and local reset when there's a
+     *  watchdog timeout.  Only valid when RstmuxOmode_NMI_LOCAL_RESET is used.
+     */ 
+    enum RstmuxDelay {
+        RstmuxDelay_256CPU_DIV_6_CYCLES = 0,
+        RstmuxDelay_512CPU_DIV_6_CYCLES = 1,
+        RstmuxDelay_1024CPU_DIV_6_CYCLES = 2,
+        RstmuxDelay_2048CPU_DIV_6_CYCLES = 3,
+        RstmuxDelay_4096CPU_DIV_6_CYCLES_DEFAULT = 4,
+        RstmuxDelay_8192CPU_DIV_6_CYCLES = 5,
+        RstmuxDelay_16384CPU_DIV_6_CYCLES = 6,
+        RstmuxDelay_32768CPU_DIV_6_CYCLES = 7
+    };
+
+    /*!
+     *  InitCfg - Watchdog Timer initialization parameters
+     *
+     *  @p(blist)
+     * -wdPeriodLo -> Lower 32 bits of the watchdog timer period.  The 64-bit period specifies the number of clock ticks
+     *                         prior to the watchdog timer timeout.
+     * -wdPeriodHi -> Upper 32 bits of the watchdog timer period.  The 64-bit period specifies the number of clock ticks
+     *                         prior to the watchdog timer timeout.
+     * -wdResetType -> Specifies the reset type if watchdog timer is configured to reset DSP on timeout this parameter.
+     * -wdRegTimeoutExc -> Specifies whether a watchdog timeout should be handled as an exception through the BIOS
+     *                                   Exception module
+     * -rstOmode -> Specifies the output mode of a watchdog timer timeout
+     * -rstDelay -> Specifies the delay between the NMI and reset if the NMI_INPUT_PLUS_LOCAL_RESET_INPUT rstOmode
+     *                     is selected.
+     *  @p
+     */ 
+    struct InitCfg {
+        Bits32 wdPeriodLo;
+        Bits32 wdPeriodHi;
+        RstcfgResetType wdResetType;
+        Bool wdRegisterTimeoutExc; 
+        RstmuxOmode rstOmode;
+        RstmuxDelay rstDelay;
+    };
+
+    /*!     
+     *  Status return codes
+     *  @p(blist)
+     * -OKAY -> No error
+     * -ERROR_INVALID_RSTCFG_VAL -> Invalid value specified for Watchdog timer reset type
+     * -ERROR_ALREADY_IN_ACTIVE_STATE -> When trying to move timer to active state when it's already in this state
+     * -ERROR_ALREADY_IN_SERVICE_STATE -> When trying to move timer to service state when it's already in this state
+     *  @p
+     */ 
+    enum Status {
+        Status_OKAY = 0,
+        Status_ERROR_INVALID_RSTCFG_VAL = 1,
+        Status_ERROR_ALREADY_IN_ACTIVE_STATE = 2,
+        Status_ERROR_ALREADY_IN_SERVICE_STATE = 3
+    };
+
+    /*!
+     *  ======== biosReplacementTimer ========
+     *  Timer used by BIOS in place of local timer that is used for watchdog timer
+     */
+    config UInt biosReplacementTimer = 0;
+
+    /*!
+     *  ======== biosReplacementTimerOwner ========
+     *  Owner of timer used by BIOS in place of local timer that is used for watchdog timer.
+     *  The replacement timer is a global timer so it is used by all cores.  The owner core must be specified.
+     */
+    config UInt biosReplacementTimerOwner = 0;    
+
+     // -------- Module API Functions --------
+
+     /*
+       *  DSP Watchdog Timer module initialization function.
+       */
+    @DirectCall
+    Status Init(InitCfg *wdCfg);
+
+     /*
+       *  Fully services the watchdog timer, resetting the count back to zero.
+       */
+    @DirectCall
+    Status ResetTimer();
+
+     /*
+       *  Moves the watchdog timer to the Service state.  This is half of the process required to reset the timer.
+       *  A call to this API must be followed by a call to the MoveToActiveState() API to fully reset the timer.
+       */
+    @DirectCall
+    Status MoveToServiceState();
+
+     /*
+       *  Moves the watchdog timer to the Active state.  This is half of the process required to reset the timer.
+       *  A call to this API must have been preceded by a call to the MoveToServiceState() API to fully reset the timer.
+       */
+    @DirectCall
+    Status MoveToActiveState();
+
+     /*
+       *  Forces a timeout of the watchdog timer.
+       */
+    @DirectCall
+    Void ForceTimeout();    
+
+     /*
+       *  Moves DSP Watchdog timer from active state to service state
+       */
+    @DirectCall
+    Bool HasTimeoutOccurred();    
+
+internal:    
+
+    // -------- Internal Module Constants --------
+
+    /*
+     *  Bitmasks and values for Reset Control Register (RSTCTRL).
+     */
+    const Bits32 RSTCTRL_KEY_MASK = 0x0000FFFF;
+    const Bits32 RSTCTRL_KEY_SHIFT = 0x00000000;
+    const Bits32 RSTCTRL_KEY_VALUE = 0x00005A69;
+
+    /*
+     *  Bitmasks and values for Reset Configuration Register (RSTCFG).
+     */
+    const Bits32 RSTCFG_WDTYPE_MASK = 0x00000001;
+
+    /*
+     *  Bitmasks and values for Reset Mux Register (RSTMUXn).
+     */
+    const Bits32 RSTMUXn_OMODE_MASK = 0x00000007;
+    const Bits32 RSTMUXn_OMODE_SHIFT = 1;
+    const Bits32 RSTMUXn_DELAY_MASK = 0x00000007;
+    const Bits32 RSTMUXn_DELAY_SHIFT = 5;
+
+    /*
+     *  Bitmasks and values for Timer Interrupt Control and Status Register (INTCTRLSTAT).
+     */
+    const Bits32 INTCTRLSTAT_PRDINTEN_MASK = 0x00000001;
+    const Bits32 INTCTRLSTAT_PRDINTEN_LO_SHIFT = 0;
+    const Bits32 INTCTRLSTAT_PRDINTEN_HI_SHIFT = 16; 
+    const Bits32 INTCTRLSTAT_PRDINTEN_ENABLE_INT = 1;  /* Enable interrupt when watchdog is enabled */
+
+    /*
+     *  Bitmasks and values for Timer Global Control Register (TGCR).
+     */
+    const Bits32 TGCR_TIMLORS_MASK = 0x00000001;
+    const Bits32 TGCR_TIMLORS_SHIFT = 0;
+    const Bits32 TGCR_TIMLORS_NOT_IN_RESET = 1;
+    const Bits32 TGCR_TIMHIRS_MASK = 0x00000001;
+    const Bits32 TGCR_TIMHIRS_SHIFT = 1;
+    const Bits32 TGCR_TIMHIRS_NOT_IN_RESET = 1;
+    const Bits32 TGCR_TIMMODE_MASK = 0x00000003;
+    const Bits32 TGCR_TIMMODE_SHIFT = 2;
+    const Bits32 TGCR_TIMMODE_64BIT_WD_MODE = 0x2;
+
+    /*
+     *  Bitmasks and values for Timer Control Register (TCR).
+     */
+    const Bits32 TCR_ENAMODE_LO_MASK = 0x00000003;
+    const Bits32 TCR_ENAMODE_LO_SHIFT = 6;
+    const Bits32 TCR_ENAMODE_LO_CONTINUOUS_INC = 0x2;
+
+    /*
+     *  Bitmasks and values for Watchdog Timer Control Register (WDTCR).
+     */
+    const Bits32 WDTCR_WDEN_MASK = 0x00000001;
+    const Bits32 WDTCR_WDEN_SHIFT = 14;
+    const Bits32 WDTCR_WATCHDOG_ENABLE = 1;
+    const Bits32 WDTCR_WDFLAG_MASK = 0x00000001;
+    const Bits32 WDTCR_WDFLAG_SHIFT = 15;
+    const Bits32 WDTCR_WDKEY_MASK = 0x0000FFFF;
+    const Bits32 WDTCR_WDKEY_SHIFT = 16;
+    const Bits32 WDTCR_WDKEY_KEY1 = 0xA5C6;   
+    const Bits32 WDTCR_WDKEY_KEY2 = 0xDA7E; 
+
+    /*!     
+     *  Watchdog Timer states from Figure 4-2 of sprugv5a - timer64P.pdf
+     *  @p(blist)
+     * -INITIAL -> Watchdog mode disabled
+     * -PRE_ACTIVE -> Pre-active state (WDEN=1 and 0xA5C6 to WDKEY)
+     * -ACTIVE -> Active state (waiting for 0xA5C6 to WDKEY)
+     * -SERVICE-> Service State (still counting, waiting for 0xDA7E to WDKEY)
+     *  @p
+     */ 
+    enum wdStates {
+        wdStates_INITIAL = 0,
+        wdStates_PRE_ACTIVE = 1,
+        wdStates_ACTIVE = 2,
+        wdStates_SERVICE = 3
+    };
+
+    /*!
+     *  regOverlay - Overlay for the timer registers.
+     */
+    struct regOverlay {
+        Bits32 RESERVED1;  // Offset 0x00
+        Bits32 EMUMGT_CLKSPD;  //! Offset 0x04: Ptr to the Watchdog Timer Emulation Register
+        Bits32 RESERVED2;  // Offset 0x08
+        Bits32 RESERVED3;  // Offset 0x0C
+        Bits32 CNTLO;  //! Offset 0x10: Ptr to the Watchdog Timer Counter Low Register 
+        Bits32 CNTHI;  //! Offset 0x14: Ptr to the Watchdog Timer Counter High Register 
+        Bits32 PRDLO;  //! Offset 0x18: Ptr to the Watchdog Timer Period Low Register 
+        Bits32 PRDHI;  //! Offset 0x1C: Ptr to the Watchdog Timer Period High Register 
+        Bits32 TCR;  //! Offset 0x20: Ptr to the Watchdog Timer Timer Control Register   
+        Bits32 TGCR;  //! Offset 0x24: Ptr to the Watchdog Timer Timer Global Control Register     
+        Bits32 WDTCR;  //! Offset 0x28: Ptr to the Watchdog Timer Control Register       
+        Bits32 RESERVED4;  // Offset 0x2C
+        Bits32 RESERVED5;  // Offset 0x30
+        Bits32 RELLO;  //! Offset 0x34: Ptr to the Watchdog Timer Reload Lowl Register 
+        Bits32 RELHI;  //! Offset 0x38: Ptr to the Watchdog Timer Reload High Register 
+        Bits32 CAPLO;  //! Offset 0x3C: Ptr to the Watchdog Timer Capture Low Register     
+        Bits32 CAPHI;  //! Offset 0x40: Ptr to the Watchdog Timer Capture High Register  
+        Bits32 INTCTLSTAT;  //! Offset 0x44: Ptr to the Watchdog Timer Interrupt Control and Status Register      
+    };
+
+    /*! Ptr to the Reset Control Register */
+    config Ptr RSTCTRL;    
+
+    /*! Ptr to the Reset Configuration Register */
+    config Ptr RSTCFG;    
+
+    /*! Ptr to the Base Address of the Reset MUX Registers */
+    config Ptr RSTMUXnBASE;        
+
+    /*! Timer interrupt GEM event id (varies per device) */
+    config UInt TINTLDSPINT;
+
+    struct Module_State {
+        wdStates wdTimerState; /* Tracks the watchdog timer state */
+    };
+
+}
diff --git a/WatchdogTimer.xs b/WatchdogTimer.xs
new file mode 100644 (file)
index 0000000..ed17069
--- /dev/null
@@ -0,0 +1,111 @@
+/* 
+ * Copyright (c) 2012-2014, Texas Instruments Incorporated
+ * 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.
+ * */
+/*
+ *  ======== WatchdogTimer.xs ========
+ *
+ */
+
+var Exception = null;
+var Clock = null;
+
+/*
+ *  ======== module$meta$init ========
+ */
+function module$meta$init()
+{
+    /* Only process during "cfg" phase */
+    if (xdc.om.$name != "cfg") {
+        return;
+    }
+    
+    this.RSTCTRL = 0x023100E8;
+    this.RSTCFG  = 0x023100EC;
+    this.RSTMUXnBASE = 0x02620308;
+    this.TINTLDSPINT = 64;
+
+    if (Program.cpu.deviceName.match(/6614/)) {
+        /* Appleton */
+        this.biosReplacementTimer = 4;
+        this.biosReplacementTimerOwner = 0;
+    }
+    else {
+        /* K2 devices */
+        if (Program.cpu.deviceName.match(/6636/) ||
+            Program.cpu.deviceName.match(/6638/)) {
+            /* K2H & K2K */
+            this.biosReplacementTimer = 8;
+            this.biosReplacementTimerOwner = 0; 
+        }
+        else if (Program.cpu.deviceName.match(/6630/)) {
+            /* K2L */
+            this.biosReplacementTimer = 8;
+            this.biosReplacementTimerOwner = 0;            
+        }
+        else if (Program.cpu.deviceName.match(/AK2E/)) {
+            /* K2E */
+            this.biosReplacementTimer = 8;
+            this.biosReplacementTimerOwner = 0;            
+        }
+    }
+
+    /* RegOverlay gets mapped in the source Init function since its address is based on
+     * the DSP number */
+}
+
+/*
+ *  ======== module$use ========
+ */
+function module$use()
+{
+    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
+    var Timer = xdc.useModule('ti.sysbios.timers.timer64.Timer');
+
+    WatchdogTimer = this;
+
+    /* Only configure the timerId if user has not done so in their *.cfg file */
+    if (!(Clock.$written("timerId"))) {
+        /* BIOS must be configured to use a different timer for the Clock module
+         * since the local timers for each core are the watchdog timers */
+        Clock.timerId = WatchdogTimer.biosReplacementTimer;          // This will set BIOS to use a different timer for the Clock module
+        
+        /* The timer will be shared by all cores.  Configure the owner core */
+        Timer.timerSettings[Clock.timerId].ownerCoreId = WatchdogTimer.biosReplacementTimerOwner;
+    }    
+}
+
+/*
+ *  ======== module$static$init ========
+ */
+function module$static$init(mod, params)
+{
+    mod.wdTimerState = this.wdStates_INITIAL;
+}
diff --git a/WatchdogTimerver.h.xdt b/WatchdogTimerver.h.xdt
new file mode 100644 (file)
index 0000000..fbe47a9
--- /dev/null
@@ -0,0 +1,100 @@
+%%{
+/*!
+ *  This template implements the WatchdogTimerver.h
+ */  
+  /* Versioning */
+  var ver = this;
+  var ver1 = [00,00,00,00];
+  var ver2 = [00,00,00,00];
+  
+  for each(i=0;i<ver.length;i++)
+  {
+      if(String(ver[i]).length < 2)
+      {
+        ver1[i]="0"+ver[i];
+      }
+      else
+      {
+        ver1[i] = ver[i];
+      }
+      
+      ver2[i] = Number(ver[i]).toString(16).toUpperCase();
+      
+      if(String(ver2[i]).length < 2)
+      {
+        ver2[i]="0"+ver2[i];
+      }
+  }
+  
+  var versionStr = "\""+"DSP Watchdog Timer Revision: "+ver1[0]+"."+ver1[1]+"."+ver1[2]+"."+ver1[3]+"\"";
+  var versionID = "(0x"+ver2[0]+ver2[1]+ver2[2]+ver2[3]+")";
+
+%%}
+#ifndef _WATCHDOGTIMERVER_H
+#define _WATCHDOGTIMERVER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ============================================================= */
+/**
+ *   @file  WatchdogTimerver.h
+ *
+ *   path  ti/instrumentation/wdtimer/WatchdogTimerver.h
+ *
+ *   @brief  DSP Watchdog Timer Module Version Definitions
+ *
+ *  ============================================================================
+ *  Copyright (c) Texas Instruments Incorporated 2009-2012
+ * 
+ *  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.
+ *
+*/
+
+/**
+ * @brief   This is the DSP Watchdog Timer module version. Versions numbers are encoded in the following 
+ * format:
+ *  0xAABBCCDD -> Arch (AA); API Changes (BB); Major (CC); Minor (DD)
+ */
+#define WATCHDOGTIMER_VERSION_ID                   `versionID`
+
+/**
+ * @brief   This is the version string which describes the DSP Watchdog Timer module along with the
+ * date and build information.
+ */
+#define WATCHDOGTIMER_VERSION_STR                  `versionStr`
+
+
+#ifdef __cplusplus
+}
+#endif
+  
+
+#endif  /* _WATCHDOGTIMERVER_H */
diff --git a/build/buildlib.xs b/build/buildlib.xs
new file mode 100644 (file)
index 0000000..d661fe5
--- /dev/null
@@ -0,0 +1,523 @@
+/******************************************************************************
+ * FILE PURPOSE: Build Library Utilities
+ ******************************************************************************
+ * FILE NAME: buildlib.xs
+ *
+ * DESCRIPTION: 
+ *  This file contains common routines that are used by the various WatchdogTimer 
+ *  components.
+ *
+ * Copyright (C) 2012, Texas Instruments, Inc.
+ *****************************************************************************/
+
+/**************************************************************************
+ * FUNCTION NAME : listAllFiles
+ **************************************************************************
+ * DESCRIPTION   :
+ *  Utility function which lists all files with a specific extension 
+ *  present in a directory and any directory inside it.
+ **************************************************************************/
+function listAllFiles(ext, dir, recurse)
+{     
+    var srcFile = [];
+    var d;
+
+    /* If recurse parameter is not specified we default to recursive search. */
+    if (recurse == null)
+        recurse = true;
+
+    if (dir == undefined) 
+          d = ".";
+    else 
+      d = dir;
+
+    /* Get access to the current directory. */
+    var file = new java.io.File(d);
+
+    /* Check if the file exists and it is a directory. */
+    if (file.exists() && file.isDirectory()) 
+    {
+        /* Get a list of all files in the specific directory. */
+        var fileList = file.listFiles();
+        for (var i = 0; i < fileList.length; i++) 
+        {
+            /* Dont add the generated directory 'package' and any of its files 
+             * to the list here. */
+            if (fileList[i].getName().matches("package") == false)
+            {
+                /* Check if the detected file is a directory */
+                if (fileList[i].isDirectory())
+                {
+                    /* We will recurse into the subdirectory only if required to do so. */
+                    if (recurse == true)
+                    {
+                        /* Generate the directory Name in which we will recurse. */ 
+                        var directoryName = d + "/" + fileList[i].getName();
+
+                        /* Get a list of all files in this directory */
+                        var fileListing = listAllFiles (ext, directoryName, recurse);
+                        if (fileListing != null)
+                        {
+                            /* Return a list of all file names in the directory. */
+                            for (var j = 0 ; j < fileListing.length; j++) 
+                                srcFile[srcFile.length++] = fileListing[j];
+                        }
+                    }
+                }
+                else
+                {
+                    /* This was a file. Check if the file name matches the extension */
+                    if (fileList[i].getName().endsWith(ext) == true)
+                        srcFile[srcFile.length++] = d + "/" + fileList[i].getName();
+                }
+            }
+        }
+
+        return srcFile;
+    }
+    return null;
+}
+
+
+function createMake(makefile)
+{
+    /* Create the main make file */
+    var fileModule = xdc.module('xdc.services.io.File');
+    if(makefile==undefined)
+    {
+      try{
+          makefile = fileModule.open("makefile", "w");
+         } catch (ex)
+         {
+           print("makefile cannot be written to. Please check Writing Permissions.");
+           java.lang.System.exit(1);
+         }   
+    
+      Pkg.makePrologue += "\ninclude makefile\n"; 
+         
+      Pkg.makeEpilogue += "\nclean::\n\t-$(RM)  makefile\n";
+      makefile.writeLine("#*******************************************************************************");
+      makefile.writeLine("#* FILE PURPOSE: Top level makefile for Creating WatchdogTimer Module");
+      makefile.writeLine("#*******************************************************************************");
+      makefile.writeLine("#* FILE NAME: makefile");
+      makefile.writeLine("#*");
+      makefile.writeLine("#* DESCRIPTION: Defines Compiler tools paths, libraries , Build Options ");
+      makefile.writeLine("#*");
+      makefile.writeLine("#*");
+      makefile.writeLine("#*******************************************************************************");
+      makefile.writeLine("#*");
+      makefile.writeLine("# (Mandatory) Specify where various tools are installed.");
+
+      var file = xdc.module('xdc.services.io.File');
+    
+      var xdcTargetType = java.lang.System.getenv("XDCTARGET");
+      var toolsBaseDir = java.lang.System.getenv("XDCCGROOT");   
+      
+      makefile.writeLine("\n# Output for prebuilt generated libraries");
+      makefile.writeLine("export LIBDIR ?= ./lib");
+
+      /* Create INCDIR from XDCPATH */
+    
+      /* copy the environment array from the current environment */
+      var env   = java.lang.System.getenv();
+      var getxdcpath=String(java.lang.System.getenv("XDCPATH"));
+      getxdcpath= getxdcpath.replace(/\\/g,"/");
+      var keys  = env.keySet().toArray();
+      var key;
+      var stat={};
+      var env_j=[];
+      var listxdcpath = new Array();
+      for (var i = 0; i < keys.length; i++) {
+           key = String(keys[i]);
+           if((key.match("INSTALL_PATH")) || (key.match("INSTALLDIR")))
+           {
+             var keyPath=String(env.get(key));
+             keyPath=keyPath.replace(/\\/g,"/");
+             var file = xdc.module('xdc.services.io.File');
+             keyPath=file.getDOSPath(keyPath);
+             if(getxdcpath.toString().match(keyPath))
+             {
+                 listxdcpath.push({keyname: key,keypath: keyPath});
+                 while(getxdcpath.toString().match(keyPath))
+                 {
+                   getxdcpath=getxdcpath.toString().replace(keyPath,"$("+key+")");
+                 }
+             }
+           }
+    
+     }
+       var pkgroot="..";
+       for (var i = Pkg.name.split('.').length; i > 1; i--) {
+              pkgroot+="/..";
+          }
+        
+      makefile.writeLine("\n# ROOT Directory");        
+      makefile.writeLine("export ROOTDIR := "+pkgroot);
+    
+      makefile.writeLine("\n# INCLUDE Directory");
+      makefile.writeLine("export INCDIR := "+getxdcpath+";$(ROOTDIR)");       
+    
+      makefile.writeLine("\n# Common Macros used in make");  
+      makefile.writeLine("\nifndef RM");     
+      makefile.writeLine("export RM = rm -f");
+      makefile.writeLine("endif");        
+    
+      makefile.writeLine("\nifndef CP");     
+      makefile.writeLine("export CP = cp -p");    
+      makefile.writeLine("endif");    
+        
+      makefile.writeLine("\nexport MKDIR = mkdir -p");
+    
+      makefile.writeLine("\nifndef RMDIR");         
+      makefile.writeLine("export RMDIR = rm -rf");
+      makefile.writeLine("endif");        
+    
+      makefile.writeLine("\nifndef SED"); 
+      makefile.writeLine("export SED = sed");    
+      makefile.writeLine("endif");    
+    
+      makefile.writeLine("\nifndef MAKE"); 
+      makefile.writeLine("export MAKE = make");    
+      makefile.writeLine("endif");        
+
+      makefile.writeLine("\n# PHONY Targets");                
+      makefile.writeLine(".PHONY: all clean cleanall ");    
+      
+      makefile.writeLine("\n# FORCE Targets");                
+      makefile.writeLine("FORCE: ");          
+      
+      makefile.writeLine("\n# all rule");                
+      makefile.writeLine("all: .executables");           
+      makefile.writeLine(".executables: .libraries");
+      makefile.writeLine(".libraries:");
+      
+      makefile.writeLine("\n# Clean Rule");          
+      makefile.writeLine("clean:: clean_package");                  
+      makefile.writeLine("# Clean Top Level Object Directory ");          
+      makefile.writeLine("clean_package :\n\t$(RMDIR) $(LIBDIR)/*/");      
+      makefile.writeLine("\t$(RMDIR) package/cfg");            
+   }
+   else
+   {
+     try{
+          makefile = fileModule.open("makefile", "a");
+         } catch (ex)
+         {
+           print("makefile cannot be written to. Please check Writing Permissions.");
+           java.lang.System.exit(1);
+         }  
+    
+    }
+
+ return makefile;
+}
+
+function createLibMake(makelibname,targetname, objectPath)
+{
+   var tooldir;
+   var stringname=String(targetname).replace("(xdc.bld.ITarget.Module)","");
+   if(stringname.match("ARM11"))
+   {
+     tooldir="TI_ARM11_GEN_INSTALL_PATH"; 
+   }
+   else
+   {
+     tooldir="C6X_GEN_INSTALL_PATH";
+   }
+   switch(stringname)
+   {
+    case String(C66LE):
+      targetname=C66LE;
+      break;
+    case String(C66BE):
+      targetname=C66BE;
+      break;
+
+   }
+    var fileModule = xdc.module('xdc.services.io.File');
+    try{
+     var dstFile = new java.io.File(makelibname);
+     dstFile.getParentFile().mkdirs();    
+     libmakefile = fileModule.open(makelibname, "w");
+     /* Add to Archive list */
+    } catch (ex)
+    {
+     print(makelibname+" cannot be written to. Please check Writing Permissions.");
+     java.lang.System.exit(1);
+    }   
+    libmakefile.writeLine("#*******************************************************************************");
+    libmakefile.writeLine("#* FILE PURPOSE: Lower level makefile for Creating WatchdogTimer Module");
+    libmakefile.writeLine("#*******************************************************************************");
+    libmakefile.writeLine("#* FILE NAME: "+makelibname);
+    libmakefile.writeLine("#*");
+    libmakefile.writeLine("#* DESCRIPTION: Defines Source Files, Compilers flags and build rules");
+    libmakefile.writeLine("#*");
+    libmakefile.writeLine("#*");
+    libmakefile.writeLine("#*******************************************************************************");
+    libmakefile.writeLine("#");
+    libmakefile.writeLine("");
+    libmakefile.writeLine("#");
+    libmakefile.writeLine("# Macro definitions referenced below");
+    libmakefile.writeLine("#");
+    libmakefile.writeLine("empty =");
+    libmakefile.writeLine("space =$(empty) $(empty)");
+         
+    if(stringname.match("ti.targets"))
+    {
+
+       var rtslibtemp = targetname.lnkOpts.suffix.toString().split("/");
+       var rtslib;
+       for(n=0;n<rtslibtemp.length;n++)
+       {
+          if(rtslibtemp[n].match(".lib"))
+          { 
+             rtslib=rtslibtemp[n];
+          }
+       }
+
+      libmakefile.writeLine("CC = $("+tooldir+")/bin/"+targetname.cc.cmd +" "+targetname.ccOpts.prefix+" "+targetname.cc.opts);
+      libmakefile.writeLine("AC = $("+tooldir+")/bin/"+targetname.asm.cmd +" "+targetname.asmOpts.prefix+" "+targetname.asm.opts);    
+      libmakefile.writeLine("ARIN = $("+tooldir+")/bin/"+targetname.ar.cmd +" "+targetname.ar.opts);    
+      libmakefile.writeLine("LD = $("+tooldir+")/bin/"+targetname.lnk.cmd +" "+targetname.lnk.opts);   
+      libmakefile.writeLine("RTSLIB = -l $("+tooldir+")/lib/"+rtslib);        
+    }
+    else
+    {
+      print("Error: Non-TI targets are not currently supported ");
+      java.lang.System.exit(1);
+
+    }
+       
+    libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR))))");
+    libmakefile.writeLine("OBJEXT = o"+targetname.suffix); 
+    libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     
+    /* libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+" -Dxdc_target_types__=ti/targets/std.h -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");*/
+    libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+"  -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");
+    libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");
+         libmakefile.writeLine("OBJDIR =  $(LIBDIR)");    
+   
+ return libmakefile;
+
+}
+
+function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, targetName)
+{
+  var  sourcestring = (srcString + fileExt).toString().toUpperCase();
+  var  compileflagstring = sourcestring + "FLAGS";
+  var  objectliststring = sourcestring + "OBJS";
+  /* List all the source files */
+  makefilename.writeLine("\n#List the "+srcString+" Files");  
+  makefilename.writeLine(sourcestring + "= \\");
+  for(var i=0;i<srcfiles.length-1;i++)
+  {
+    makefilename.writeLine("    "+srcfiles[i]+"\\");
+  }
+    makefilename.writeLine("    "+srcfiles[i]+"\n");
+    
+ /* Flags for the source files */
+ makefilename.writeLine("# FLAGS for the "+srcString+" Files"); 
+ var compileflags="";
+ if(fileExt == "asm" && flags.aopts != undefined)
+ {
+   compileflags+=" "+flags.aopts;
+ }
+ else if((fileExt == "c" || fileExt == "sa")&& flags.copts != undefined)
+ {
+   compileflags+=" "+flags.copts;
+ } 
+
+ if(flags.incs != undefined)
+ {
+   compileflags+=" "+flags.incs;
+ }
+
+
+ makefilename.writeLine(compileflagstring+" = "+compileflags +" \n");     
+ makefilename.writeLine("# Make Rule for the "+srcString+" Files");  
+ makefilename.writeLine(objectliststring +" = $(patsubst %."+fileExt+", $(OBJDIR)/%.$(OBJEXT), $(" + sourcestring + "))"); 
+ makefilename.writeLine("\n$("+objectliststring+"): $(OBJDIR)/%.$(OBJEXT): %."+fileExt);   
+ if(fileExt == "c")
+ { 
+   makefilename.writeLine("\t-@echo cl"+targetName.suffix +" $< ...");     
+ }
+ else
+ {
+   makefilename.writeLine("\t-@echo asm"+targetName.suffix +" $< ...");      
+ }
+ makefilename.writeLine("\tif [ ! -d $(@D) ]; then $(MKDIR) $(@D) ; fi;");           
+ if(fileExt == "c")
+ {
+   makefilename.writeLine("\t$(RM) $@.dep");
+   makefilename.writeLine("\t$(CC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fc $< ");
+   makefilename.writeLine("\t-@$(CP) $@.dep $@.pp; \\");
+   makefilename.writeLine("         $(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\\\$$//' \\");
+   makefilename.writeLine("             -e '/^$$/ d' -e 's/$$/ :/' < $@.pp >> $@.dep; \\");
+   makefilename.writeLine("         $(RM) $@.pp ");
+ }
+ else if(fileExt == "asm")
+ {
+   makefilename.writeLine("\t$(AC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fa $< ");
+ }
+ else if(fileExt == "sa")
+ {
+   makefilename.writeLine("\t$(AC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< ");
+ }
+   makefilename.writeLine("\n#Create Empty rule for dependency");
+   makefilename.writeLine("$("+objectliststring+"):"+makefilename.$private.fd);
+   makefilename.writeLine(makefilename.$private.fd+":");
+   makefilename.writeLine("\n#Include Depedency for "+srcString+" Files");
+   makefilename.writeLine("ifneq (clean,$(MAKECMDGOALS))");
+   makefilename.writeLine(" -include $("+objectliststring+":%.$(OBJEXT)=%.$(OBJEXT).dep)");
+   makefilename.writeLine("endif");
+}
+
+/**************************************************************************
+ * FUNCTION NAME : buildLibrary
+ **************************************************************************
+ * DESCRIPTION   :
+ *  Utility function which will build a specific library
+ **************************************************************************/
+var makefilelocal;
+function buildLibrary (libOptions, libName, target, libFiles) 
+{
+    var lldFullLibraryPath = "./lib/" + libName;
+    var lldFullLibraryPathMake = "$(LIBDIR)/" + libName;
+
+    /* Create Main make file in the root of package folder */
+    makefilelocal = createMake(makefilelocal);
+
+    /* Write the rule to make library in main makefile */
+    lib = lldFullLibraryPath+".a"+target.suffix;
+    libMake = lldFullLibraryPathMake+".a"+target.suffix;
+    var objectPath= "./package/lib/"+lldFullLibraryPath;
+    makefilelocal.writeLine("\n\n# Make rule to create "+libMake+" library");
+    makefilelocal.writeLine(".libraries: "+ libMake);
+    makefilelocal.writeLine(libMake+": FORCE\n\t$(MAKE) -f "+lib+".mk $@");                                 
+
+    /* Create Library make file in the lib folder */
+    var makefilelib= createLibMake(lib+".mk",target,objectPath);  
+
+    /* Rule to clean library in main makefile */
+    makefilelocal.writeLine("# Rule to clean "+libMake+" library");                                              
+    makefilelocal.writeLine("clean ::\n\t$(RM) "+ libMake);                                          
+    librule="\n\n"+libMake+" :";
+
+    /* Add files to be compiled */
+    /* Separate out the C and assembly files */
+    var cfiles= new Array();
+    var afiles= new Array();
+    var safiles= new Array();
+    for each(var srcFile in libFiles)
+    {
+        var srcFile=String(srcFile);
+        var dot = srcFile.lastIndexOf(".");
+        var extension = srcFile.substr(dot,srcFile.length);      
+        if(extension == ".c")
+        {
+          cfiles.push(srcFile);
+        }
+        else if(extension == ".sa")
+        {
+          safiles.push(srcFile);
+        }
+        else if(extension == ".asm")
+        {
+           afiles.push(srcFile);
+        }
+        else
+        {
+           print("ERROR: Unsupported file extension");
+           java.lang.System.exit(1);
+        }
+     }
+    if(cfiles.length > 0)
+    {                                                
+      makeAddObjects("COMMONSRC",makefilelib,cfiles,libOptions,"c",target);
+      librule += " $(COMMONSRCCOBJS)";                   
+    }
+    if(afiles.length > 0)
+    {                                                
+      makeAddObjects("COMMONSRC",makefilelib,afiles,libOptions,"asm",target);
+      librule += " $(COMMONSRCSOBJS)";                   
+    }
+    if(safiles.length > 0)
+    {                                                
+      makeAddObjects("COMMONSRC",makefilelib,safiles,libOptions,"sa",target);
+      librule += " $(COMMONSRCSAOBJS)";                   
+    }
+
+    makefilelib.writeLine(librule);
+    makefilelib.writeLine("\t@echo archiving $? into $@ ...");
+               makefilelib.writeLine("\t$(ARIN) $@ $?");
+               makefilelib.close();   
+
+    /* Create the library file and add all the objects to the file. */
+    var lib = Pkg.addLibrary(lldFullLibraryPath, target, libOptions);
+
+    lib.addObjects (libFiles);
+
+    /* Create the Epilogue; which executes after all the builds are completed. 
+     * This is used to generate the benchmark information for the built library. 
+     * Also add the benchmarking information file to the package. */
+    Pkg.makeEpilogue += ".libraries: benchmarking_" + target.suffix + "\n";
+    Pkg.makeEpilogue += "benchmarking_" + target.suffix + ":";
+    Pkg.makeEpilogue += "\n\t ofd6x -x " + lldFullLibraryPath + ".a" + target.suffix + " > tmp.xml";
+    Pkg.makeEpilogue += "\n\t sectti tmp.xml > " + lldFullLibraryPath + ".a" + target.suffix +  "_size.txt";
+    Pkg.makeEpilogue += "\n\t $(RM) tmp.xml\n\n";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix + "_size.txt";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix + ".mk";
+
+    /* We need to clean after ourselves; extend the 'clean' target to take care of this. */
+    Pkg.makeEpilogue += "clean::\n\t";
+    Pkg.makeEpilogue += "$(RM) " + lldFullLibraryPath + ".a" + target.suffix + "_size.txt\n\n";
+
+    return lib;
+}
+
+/**************************************************************************
+ * FUNCTION NAME : createMiniPkg
+ **************************************************************************
+ * DESCRIPTION   :
+ *  The function is responsible for creating the mini tar package
+ *  The MINI package has the following files:- 
+ *      - Driver Source Files. 
+ *      - Header files (exported and internal driver files) 
+ *      - Simple Makefiles. 
+ **************************************************************************/
+function createMiniPkg(pkgName)
+{
+    /* Get the package Name. */
+    var packageRepository = xdc.getPackageRepository(Pkg.name);
+    var packageBase       = xdc.getPackageBase(Pkg.name);
+    var packageName       = packageBase.substring(packageRepository.length + 1);
+
+    /* Convert the Package name by replacing back slashes with forward slashes. This is required because
+     * otherwise with long names the tar is unable to change directory. */
+    var newPkgName = new java.lang.String(packageRepository);
+    var newPkgRep  = newPkgName.replace('\\', '/');
+
+    /* Step1: Create the MINI Package and add the simple Big and Little Endian Makefiles to the package */
+    Pkg.makeEpilogue += "release: mini_pkg\n";
+    Pkg.makeEpilogue += "mini_pkg:\n";
+    Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -cf packages/" + pkgName + "_mini.tar " + 
+                        packageName + "simpleC66LE.mak " + packageName + "simpleC66BE.mak\n";
+                        
+
+    /* Step2: Add the exported header files to the package */
+    var includeFiles = libUtility.listAllFiles (".h", ".", false);
+    for (var k = 0 ; k < includeFiles.length; k++)
+        Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -rf packages/" + pkgName + "_mini.tar " + 
+                        packageName + includeFiles[k] + "\n";
+
+    /* Step3: Add the driver source files to the package; the filter should have generated a source listing */
+    Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -T src.lst -rf packages/" + pkgName + "_mini.tar " + "\n";
+
+    /* Ensure that we clean up the mini package */
+    Pkg.makeEpilogue += "clean::\n";
+    Pkg.makeEpilogue += "\t $(RM) packages/" + pkgName + "_mini.tar\n";
+}
+
+
diff --git a/config.bld b/config.bld
new file mode 100644 (file)
index 0000000..99a2b1b
--- /dev/null
@@ -0,0 +1,99 @@
+/******************************************************************************
+ * FILE PURPOSE: Build configuration Script for the Watchdog Timer module
+ ******************************************************************************
+ * FILE NAME: config.bld
+ *
+ * DESCRIPTION: 
+ *  This file contains the build configuration script for the Watchdog Timer module
+ *  and is responsible for configuration of the paths for the various tools
+ *  required to build the Watchdog Timer module.
+ *
+ * Copyright (C) 2012-2014, Texas Instruments, Inc.
+ *****************************************************************************/
+
+/* Get the Tools Base directory from the Environment Variable. */
+var toolsBaseDir = java.lang.System.getenv("XDCCGROOT");
+
+/* Get the base directory for the RM LLD Package */
+var WatchdogTimerPath = new java.io.File(".//").getPath();
+
+var WatchdogTimerInstallType;
+
+/* Read the part number from the environment variable. */
+var WatchdogTimerPartNumber = java.lang.System.getenv("PARTNO");
+
+/* Include Path */
+var WatchdogTimerIncludePath = " -i" + WatchdogTimerPath + "/src" + " -i" + WatchdogTimerPath  + " -i" + WatchdogTimerPath + "/test";
+
+/* Configure the Watchdog Timer Release Version Information */
+/* 3 steps: remove SPACE and TAB, convert to string and split to make array */
+var WatchdogTimerReleaseVersion = (""+Pkg.version.replace(/\s/g, "")).split(',');
+
+/* Watchdog Timer Coverity Analysis: Check the environment variable to determine if Static
+ * Analysis has to be done on the Watchdog Timer code base or not? */
+var WatchdogTimerCoverityAnalysis = java.lang.System.getenv("STATIC_ANALYZE");
+
+/* C66 ELF compiler configuration for Little Endian Mode. */
+var C66LE          = xdc.useModule('ti.targets.elf.C66');
+C66LE.rootDir       = toolsBaseDir;
+C66LE.ccOpts.prefix  = "-mo -o3 -q -k -eo.o";
+
+/* C66 ELF compiler configuration for Big Endian Mode. */
+var C66BE          = xdc.useModule('ti.targets.elf.C66_big_endian');
+C66BE.rootDir       = toolsBaseDir;
+C66BE.ccOpts.prefix  = "-mo -o3 -q -k -eo.o -DBIGENDIAN";
+
+/* Check if we need to run the STATIC Analysis or not? */
+var coverityAnalysis = java.lang.System.getenv("STATIC_ANALYZE");
+
+/* Setup the Coverity Filters to perform Static Analysis. */
+if (coverityAnalysis == "ON") {
+    var coverityInstallPath = java.lang.System.getenv("STATIC_ANALYZE_PATH");
+    var cfgBase = xdc.getPackageBase("tisb.coverity.filters") + "cfg";
+
+    var coverityFilter = [
+    {
+        moduleName: "tisb.coverity.filters.Coverity",
+        params: {
+            cfgDir:  cfgBase,  // The Coverity configuration file directory
+            rootDir: coverityInstallPath,
+            outDir: xdc.csd() + "cov_out",
+            analyzeLibs: true
+        }
+    },
+    ];
+
+    /* Run the coverity filters on the LE Build only. */
+    C66LE.profiles["release"].filters = coverityFilter;
+}
+
+/* Check if we need to create the Makefiles? */
+var miniBuild = java.lang.System.getenv("MINI_PACKAGE");
+
+if (miniBuild == "ON")
+{
+    /* Add the filter for simple Makefile generation. */
+
+    var makeC66LEFilter = {
+        moduleName: "build.filter.Make",
+        params: {
+          makefileName: "simpleC66LE.mak",
+        }
+    };
+
+    C66LE.profiles["release"].filters[C66LE.profiles["release"].filters.length++] = makeC66LEFilter;
+
+    var makeC66BEFilter = {
+        moduleName: "build.filter.Make",
+        params: {
+          makefileName: "simpleC66BE.mak",
+        }
+    }; 
+
+    C66BE.profiles["release"].filters[C66BE.profiles["release"].filters.length++] = makeC66BEFilter;
+
+}
+
+/* List all the build targets here. */
+Build.targets = [ C66LE, C66BE ];
+
diff --git a/docs/Module.xs b/docs/Module.xs
new file mode 100644 (file)
index 0000000..7efe353
--- /dev/null
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * FILE PURPOSE: WatchdogTimer DOCS Module specification file.
+ ******************************************************************************
+ * FILE NAME: module.xs
+ *
+ * DESCRIPTION: 
+ *  This file contains the module specification for the DSP Watchdog Timer Module Documentation .
+ *
+ * Copyright (C) 2012, Texas Instruments, Inc.
+ *****************************************************************************/
+
+/* Load the library utility. */
+var libUtility = xdc.loadCapsule ("../build/buildlib.xs");
+
+/**************************************************************************
+ * FUNCTION NAME : modBuild
+ **************************************************************************
+ * DESCRIPTION   :
+ *  The function is used to build all the components of the documentation
+ **************************************************************************/
+function modBuild() 
+{
+    /* Create the actual PROLOGUE Section for the Documentation.*/
+    Pkg.makePrologue += "release: WatchdogTimer_document_generation\n";
+    Pkg.makePrologue += "WatchdogTimer_document_generation:\n";
+    Pkg.makePrologue += "\t @echo -------------------------------------------------------\n";
+    Pkg.makePrologue += "\t @echo Generating WatchdogTimer Documentation\n";
+    Pkg.makePrologue += "\t doxygen docs/Doxyfile\n";
+    Pkg.makePrologue += "\t @echo WatchdogTimer Documentation Generated \n";
+    Pkg.makePrologue += "\t @echo -------------------------------------------------------\n";
+
+    /* Add the documentation file to the package. */
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/WatchdogTimerDocs.chm";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/tifooter.htm";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/tiheader.htm";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/tilogo.gif";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/titagline.gif";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/doxygen";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/ReleaseNotes_WatchdogTimer.pdf";
+
+    if (WatchdogTimerInstallType == "SETUP")
+    {
+        /* Generate the ECLIPSE Plugin Generation */
+        Pkg.makePrologue += "all: eclipse_plugin_generation\n";
+        Pkg.makePrologue += "eclipse_plugin_generation:\n";
+        Pkg.makePrologue += "\t @echo -------------------------------------------------------\n";
+        Pkg.makePrologue += "\t @echo RM LLD Eclipse Plugin Generation\n";
+        Pkg.makePrologue += "\t xs xdc.tools.eclipsePluginGen -o . -x ./eclipseDocs/sample.xml -c ./eclipseDocs/toc_cdoc_sample.xml\n";
+        Pkg.makePrologue += "\t @echo RM LLD Eclipse Plugin Generated \n";
+        Pkg.makePrologue += "\t @echo -------------------------------------------------------\n";
+    }   
+}
+
diff --git a/docs/ReleaseNotes_WatchdogTimer.doc b/docs/ReleaseNotes_WatchdogTimer.doc
new file mode 100644 (file)
index 0000000..c4540e4
Binary files /dev/null and b/docs/ReleaseNotes_WatchdogTimer.doc differ
diff --git a/docs/ReleaseNotes_WatchdogTimer.pdf b/docs/ReleaseNotes_WatchdogTimer.pdf
new file mode 100644 (file)
index 0000000..49e59e4
Binary files /dev/null and b/docs/ReleaseNotes_WatchdogTimer.pdf differ
diff --git a/docs/doxyfile.xdt b/docs/doxyfile.xdt
new file mode 100644 (file)
index 0000000..bd5145d
--- /dev/null
@@ -0,0 +1,1250 @@
+%%{
+/*!
+ *  This template implements the Doxyfile
+ */  
+  /* Versioning */
+  var ver = this;
+  var packageVersion = ver[0]+"."+ver[1]+"."+ver[2]+"."+ver[3];
+
+%%}
+
+
+# Doxyfile 1.7.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = "DSP Watchdog Timer Module"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         =  `packageVersion`
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./docs/doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful if your file system 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also makes the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or macro consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and macros in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = ./src/WatchdogTimer.c \
+                              . 
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          = *.h 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = YES \
+                         ./test \
+                         ./package \
+                         ./packages
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix file system feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty or if 
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = ./docs/tiheader.htm
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = ./docs/tifooter.htm
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = ..\..\WatchdogTimerDocs.chm
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = hhc.exe
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [0,1..20]) 
+# that doxygen will group on one line in the generated HTML documentation. 
+# Note that a value of 0 will completely suppress the enum values from
+# appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all references to function-like macros 
+# that are alone on a line, have an all uppercase name, and do not end with a 
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option also works with HAVE_DOT disabled, but it is recommended to 
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, svg, gif or svg. 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/docs/tifooter.htm b/docs/tifooter.htm
new file mode 100644 (file)
index 0000000..4bdf9c9
--- /dev/null
@@ -0,0 +1,4 @@
+<hr size="1"><small>
+Copyright  $year, Texas Instruments Incorporated</small>
+</body>
+</html>
diff --git a/docs/tiheader.htm b/docs/tiheader.htm
new file mode 100644 (file)
index 0000000..3c61efe
--- /dev/null
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>$title</title>
+<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css">
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<table width=100%>
+<tr>
+  <td bgcolor="black" width="1"><a href="http://www.ti.com"><img border=0 src="../../tilogo.gif"></a></td>
+  <td bgcolor="red"><img src="../../titagline.gif"></td>
+</tr>
+</table>
diff --git a/docs/tilogo.gif b/docs/tilogo.gif
new file mode 100644 (file)
index 0000000..f2fab2d
Binary files /dev/null and b/docs/tilogo.gif differ
diff --git a/docs/titagline.gif b/docs/titagline.gif
new file mode 100644 (file)
index 0000000..743a024
Binary files /dev/null and b/docs/titagline.gif differ
diff --git a/package.bld b/package.bld
new file mode 100644 (file)
index 0000000..03781f4
--- /dev/null
@@ -0,0 +1,180 @@
+/******************************************************************************
+ * FILE PURPOSE: Build description for the Watchdog Timer Module
+ ******************************************************************************
+ * FILE NAME: package.bld
+ *
+ * DESCRIPTION: 
+ *  This file contains the build specification and description for the 
+ *  Packet Library
+ *  
+ *  The file takes the following parameters from the command line through the
+ *  XDCARGS variable.
+ *      XDCARGS[0] = Consumer Library Install Type 
+ *      Valid Values are "TAR" or "SETUP"
+ *      DEFAULT is "SETUP"
+ *
+ *  Example for a valid command:
+ *      xdc XDCARGS="SETUP" release   
+ *
+ * Copyright (C) 2012-2014 Texas Instruments, Inc.
+ *****************************************************************************/
+
+/* List of all subdirectories that combine to make the Watchdog Timer Package. */
+var subDirectories = [ "src", "docs", "test"];
+
+/* Determine if we need to create the InstallJammer Application or not? 
+ * Watchdog Timer Deliverables be either of the following formats:
+ *  - TAR Ball Package
+ *  - Setup Executable 
+ * DEFAULT is a TAR Executable. */
+
+if ((arguments[0] != "TAR") && (arguments[0] != "SETUP"))
+    WatchdogTimerInstallType = "TAR";
+else
+    WatchdogTimerInstallType = arguments[0];
+
+/* Irrespective of the InstallType we always create a TAR Ball Package as a part
+ * of the RTSC Build. Here we determine the name of the TAR Ball Package
+ *  Format is as follows:
+ *      WatchdogTimer_<version> */
+var WatchdogTimerRTSCFileName = "WatchdogTimer" + "_" + WatchdogTimerPartNumber + "_" +
+                      WatchdogTimerReleaseVersion[0] + "_" +  WatchdogTimerReleaseVersion[1] + "_" + 
+                      WatchdogTimerReleaseVersion[2]  + "_" + WatchdogTimerReleaseVersion[3];
+
+/*****************************************************************
+ ************************ Release Banner *************************
+ *****************************************************************/
+
+print ("************* Watchdog Timer Module Build Information *************");
+print ("Watchdog Timer Install : " + WatchdogTimerInstallType);
+print ("Watchdog Timer Version : " + WatchdogTimerReleaseVersion);
+print ("Tools Directory        : " + toolsBaseDir);
+print ("RTSC File Name        : " + WatchdogTimerRTSCFileName);
+print ("Watchdog Timer Path    : " + WatchdogTimerPath);
+print ("Coverity Analysis      : " + (coverityAnalysis == "ON" ? "ON" : "OFF"));
+print ("C66  LE opts           : " + C66LE.ccOpts.prefix);
+print ("C66  BE opts           : " + C66BE.ccOpts.prefix);
+print ("***********************************************************");
+
+/* Create the release package for the Watchdog Timer Module */
+Pkg.defaultRelease = Pkg.addRelease (WatchdogTimerRTSCFileName, {prefix: "./packages/"});
+
+/* Moving forward we need to set the Archiver of the package to be ZIP. This is currently
+ * not supported in the XDC tools being used. Currenly builds need to be done with the 
+ * following options:-
+ *   xdc MK_FIXLISTOPTS=-t release 
+ * ZIP is a better option as it works natively with INSTALL Jammer and we can remove the
+ * uncompression into a temporary directory. XDC Tools with xdc-rXX support the ZIP archiver. */
+//Pkg.attrs = {archiver : "zip"};
+
+/* Cycle through all the sub-directories and build all the files */
+for (var i = 0; i < subDirectories.length; i++) 
+{
+    /* Load the capsule in the sub directory. */
+    var caps = xdc.loadCapsule (subDirectories[i]+"/Module.xs");
+
+    print ("Building directory " + subDirectories[i]);
+
+    /* Build the capsule. */
+    caps.modBuild();
+
+    /* Package the module.xs files for building via package */
+    Pkg.otherFiles[Pkg.otherFiles.length++] = subDirectories[i]+"/Module.xs";
+}
+
+/* Package the remaining files */
+Pkg.otherFiles[Pkg.otherFiles.length++] = "config.bld";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "package.bld";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "package.xdc";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "Settings.xdc";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "WatchdogTimer.xdc";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "WatchdogTimer.xs";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "WatchdogTimer.h";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "WatchdogTimerver.h";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/Doxyfile";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "build/buildlib.xs";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "docs/ReleaseNotes_WatchdogTimer.pdf";
+Pkg.otherFiles[Pkg.otherFiles.length++] = "makefile";
+
+/* Generate Users Manual Doxyfile */
+var tplt = xdc.loadTemplate("./docs/doxyfile.xdt");
+tplt.genFile("./docs/Doxyfile",WatchdogTimerReleaseVersion); 
+
+/* Generate Settings.xdc */
+var tplt = xdc.loadTemplate("./Settings.xdc.xdt");
+tplt.genFile("./Settings.xdc",WatchdogTimerReleaseVersion); 
+
+/* Generate WatchdogTimerver.h */
+var tplt = xdc.loadTemplate("./WatchdogTimerver.h.xdt");
+tplt.genFile("./WatchdogTimerver.h",WatchdogTimerReleaseVersion);      
+
+/* Check if we need to create the mini package? */
+var miniBuild = java.lang.System.getenv("MINI_PACKAGE");
+
+if (miniBuild == "ON")
+{
+    /***************************************************************************
+     ********************************* MINI Package ****************************
+     ***************************************************************************/
+    /* Create the MINI RTSC Package */
+    var libUtility = xdc.loadCapsule ("build/buildlib.xs");
+    libUtility.createMiniPkg(WatchdogTimerRTSCFileName);
+}
+
+/********************************************************************* 
+ *********************** INSTALL-JAMMER Support **********************
+ * In order to create the InstallJammer Application; we need to UNTAR
+ * the package into a temporary directory. This is required because 
+ * currently the InstallJammer does not support the TAR Files and thus
+ * creating an UNTAR of the file. So to work-around the problem we will
+ * do the following in the EPILOGUE Section:-
+ *  (a) Create a temporary directory called 'tmp'
+ *  (b) UNTAR the package into 'tmp'
+ *  (c) Run the INSTALL Jammer on 'tmp'
+ *  (d) Remove the 'tmp' directory.
+ *
+ * This can be done only after the 'release' package has been created.
+ * Thus all of this work is being done in the EPILOGUE.
+ *********************************************************************/
+if (WatchdogTimerInstallType == "SETUP")
+{
+    /* Create the Install Jammer Version Variable. This is used inside the 
+     * MPI File to create the Final executable. 
+     *  The format supported is as follows:-
+     *   - setupwin32_WatchdogTimer-<part_number>-<version>.exe 
+     *      This is for WatchdogTimer libraries and Header files
+     */
+    var InstallJammerVersion = "-DVersion " + WatchdogTimerPartNumber + "_" +
+                               WatchdogTimerReleaseVersion[0] + "_" +  WatchdogTimerReleaseVersion[1]  + "_" + 
+                               WatchdogTimerReleaseVersion[2]  + "_" + WatchdogTimerReleaseVersion[3];
+
+    /* This is the location where the tmp directory is located; this is used as 
+     * the input directory for the Install Jammer. */ 
+    var PackageBaseDir = " -DPackageBaseDir " + WatchdogTimerPath + "./tmp";
+
+    /* This is the location where the WatchdogTimer module will be installed by default. */
+    var WinInstallDir = " -DWinInstallDir C:/Program Files/Texas Instruments/WatchdogTimer" + "_" + 
+                            WatchdogTimerPartNumber + "_" + 
+                            WatchdogTimerReleaseVersion[0] + "_" + WatchdogTimerReleaseVersion[1] + "_" +  
+                            WatchdogTimerReleaseVersion[2]  + "_" + WatchdogTimerReleaseVersion[3];
+
+    /* Create the actual EPILOGUE Section for the INSTALLER */
+    Pkg.makeEpilogue += "release: install_application\n";
+    Pkg.makeEpilogue += "install_application:\n";
+    Pkg.makeEpilogue += "\t @echo -------------------------------------------------------\n";
+    Pkg.makeEpilogue += "\t @echo Creating the Install\n";
+    Pkg.makeEpilogue += "\t @echo -------------------------------------------------------\n";
+    Pkg.makeEpilogue += "\t -$(MKDIR) tmp\n";
+    Pkg.makeEpilogue += "\t -$(MKDIR) tmp/packages\n";
+    Pkg.makeEpilogue += "\t -$(MKDIR) tmp/eclipse\n";
+    Pkg.makeEpilogue += "\t -$(CP) -R eclipse tmp\n";
+    Pkg.makeEpilogue += "\t tar -xf ./packages/" + WatchdogTimerRTSCFileName + ".tar" + " -Ctmp/packages \n";
+    Pkg.makeEpilogue += "\t installjammer " + InstallJammerVersion + PackageBaseDir + WinInstallDir + 
+                        " --output-dir packages/ --build install/WatchdogTimer.mpi\n";
+    Pkg.makeEpilogue += "\t -$(RMDIR) /S /Q tmp\n\n";
+
+/* We need to clean after ourselves; extend the 'clean' target to take care of this. */
+Pkg.makeEpilogue += "clean::\n";
+    Pkg.makeEpilogue += "\t -$(RM) packages/*.exe\n";
+    Pkg.makeEpilogue += "\t -$(RM) packages/*.bin\n";
+}
diff --git a/package.xdc b/package.xdc
new file mode 100644 (file)
index 0000000..7f106b7
--- /dev/null
@@ -0,0 +1,16 @@
+/******************************************************************************
+ * FILE PURPOSE: Package specification file 
+ ******************************************************************************
+ * FILE NAME: package.xdc
+ *
+ * DESCRIPTION: 
+ *  This file contains the package specification for the Watchdog Timer Module
+ *
+ * Copyright (C) 2012-2014 Texas Instruments, Inc.
+ *****************************************************************************/
+
+package ti.instrumentation.wdtimer[1, 0, 0, 2] {
+    module Settings;
+    module WatchdogTimer;
+}
+
diff --git a/package.xs b/package.xs
new file mode 100644 (file)
index 0000000..12028a2
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *  ======== package.xs ========
+ *
+ */
+
+
+/*
+ *  ======== Package.getLibs ========
+ *  This function is called when a program's configuration files are
+ *  being generated and it returns the name of a library appropriate
+ *  for the program's configuration.
+ */
+
+function getLibs(prog)
+{
+    var suffix;
+
+    /* find a compatible suffix */
+    if ("findSuffix" in prog.build.target) {
+        suffix = prog.build.target.findSuffix(this);
+    }
+    else {
+        suffix = prog.build.target.suffix;
+    }
+
+    var name = this.$name + ".a" + suffix;
+    var lib = "";
+
+    lib = "lib/" + name;
+    if (java.io.File(this.packageBase + lib).exists()) {
+        return lib;
+    }
+
+    /* could not find any library, throw exception */
+    throw Error("Library not found: " + name);
+}
+
+/*
+ *  ======== package.close ========
+ */
+function close()
+{    
+    if (xdc.om.$name != 'cfg') {
+        return;
+    }
+}
diff --git a/src/Module.xs b/src/Module.xs
new file mode 100644 (file)
index 0000000..8a9abd5
--- /dev/null
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * FILE PURPOSE: WatchdogTimer Source module specification file.
+ ******************************************************************************
+ * FILE NAME: module.xs
+ *
+ * DESCRIPTION: 
+ *  This file contains the module specification for the WatchdogTimer source directory.
+ *
+ * Copyright (C) 2012 Texas Instruments, Inc.
+ *****************************************************************************/
+
+/* Load the library utility. */
+var libUtility = xdc.loadCapsule ("../build/buildlib.xs");
+
+var WatchdogTimerFiles = [
+                    "src/WatchdogTimer.c",
+                    ];
+
+/**************************************************************************
+ * FUNCTION NAME : modBuild
+ **************************************************************************
+ * DESCRIPTION   :
+ *  The function is used to build all the components of the WatchdogTimer module
+ **************************************************************************/
+function modBuild() 
+{
+    /* Build the libraries for all the targets specified. */
+    for (var targets=0; targets < Build.targets.length; targets++)
+    {
+        var libOptions = {
+            incs: WatchdogTimerIncludePath, 
+        };
+        
+        libUtility.buildLibrary (libOptions, "ti.instrumentation.wdtimer", Build.targets[targets], WatchdogTimerFiles);
+    }
+
+    /* Add all the .c files to the release package. */
+    var testFiles = libUtility.listAllFiles (".c", "src", true);
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+
+    /* Add all the .h files to the release package. */
+    var testFiles = libUtility.listAllFiles (".h", "src", true);
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+}
diff --git a/src/WatchdogTimer.c b/src/WatchdogTimer.c
new file mode 100644 (file)
index 0000000..530bf5e
--- /dev/null
@@ -0,0 +1,443 @@
+/**
+ *   @file  WatchdogTimer.c
+ *
+ *   @brief   
+ *      The file implements the WatchdogTimer module.
+ *
+ *  \par
+ *  NOTE:
+ *      (C) Copyright 2012 Texas Instruments, Inc.
+ * 
+ *  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.
+ *
+ */
+
+/**  @mainpage Watchdog Timer Module
+ *
+ *   @section intro  Introduction
+ *
+ *  The Watchdog Timer Module provides configuration and use of the watchdog timer mode
+ *  for the DSP local timers.  The watchdog mode is a 64-bit timer mode for the local timers.
+ *  When configured in the watchdog mode the timer will count up to a configured 64-bit
+ *  period value.  The count is incremented for each DSP clock tick.  Periodically the DSP must
+ *  "service" the watchdog timer by writing a sequence of values to the timer control registers.
+ *  When the watchdog timer is serviced correctly the count will reset to zero and then resume
+ *  counting up to the timer period value.  If for any reason the count value reaches the timer
+ *  period a watchdog timer event will be triggered.  The actions taken by the triggered event
+ *  are based on the watchdog timer configurations in the timer control registers and the device
+ *  reset block.
+ *
+ *  In general, a device's timer n maps to DSP core n's local timer.  The DSP local timers are
+ *  the only timers in the system capable of operating in the watchdog timer mode.  This means
+ *  that each DSP core has only one timer capable of acting as its watchdog timer.  Please keep
+ *  this in mind when using this module.  Any applications integrated with this module must not
+ *  make use of the DSP local timer as it will taken by this module to be used as the watchdog
+ *  timer.  Module configuration parameters are specifically provided to handle reconfiguring
+ *  the timer used by BIOS at startup for the Clock module.
+ *
+ *  Watchdog Timer Mapping:
+ *    DSP Timer 0 -> Core 0 Local/Watchdog Timer <br>
+ *    DSP Timer 1 -> Core 1 Local/Watchdog Timer <br>
+ *    DSP Timer 2 -> Core 2 Local/Watchdog Timer <br>
+ *    DSP Timer 3 -> Core 3 Local/Watchdog Timer <br>
+ *    DSP Timer n -> Core n Local/Watchdog Timer <br>
+ *
+ *  DSPs can be configured to take different actions if its configured watchdog timer were to
+ *  expire.  These actions can be configured via the configuration structure passed to
+ *  the Watchdog Timer module's _Init function.  The watchdog timer can be configured to 
+ *  generate local hard and soft resets when the watchdog expires.  It can also be configured
+ *  to generate an NMI or an NMI followed by a local reset after a configurable number of 
+ *  clock cycles.  A major functionality of the watchdog timer expiration actions is the
+ *  generation of a System event that can be registered as a system exception in the 
+ *  INTC exception combiner.  This allows the BIOS Exception module to handle an exception
+ *  generated by the expiration of the watchdog timer.  Since the BIOS Exception module
+ *  is capable of handling the watchdog timer expiration exception other fault management
+ *  capabilities, like core dumps, can be executed when the watchdog timer expires.
+ *
+ *  For Watchdog Timer Module API information please see the WatchdogTimer.xdc file.
+ *
+ *  For device information on the watchdog timer operation please see: <br>
+ *  SPRUGV5A - Keystone Architecture Timer64P User Guide  
+ */
+
+/** @defgroup WATCHDOGTIMER_API   DSP Watchdog Timer
+ */
+/**************************************************************************
+ *************************** Include Files ********************************
+ **************************************************************************/
+
+/* Standard Include Files. */
+#include <c6x.h>
+
+/* BIOS/XDC Include Files. */
+#include <xdc/std.h>
+#include <ti/sysbios/family/c64p/Exception.h>
+
+/* WatchdogTimer Includes */
+#include <ti/instrumentation/wdtimer/WatchdogTimer.h>
+#include "package/internal/WatchdogTimer.xdc.h"
+
+/**
+@defgroup WATCHDOGTIMER_FUNCTION                DSP Watchdog Timer Functions
+@ingroup WATCHDOGTIMER_API
+*/
+/**
+@defgroup WATCHDOGTIMER_DATA_STRUCTURE          DSP Watchdog Timer Data Structures
+@ingroup WATCHDOGTIMER_API
+*/
+
+/**************************************************************************
+ ************************** Global Variables ******************************
+ **************************************************************************/
+
+/** @addtogroup WATCHDOGTIMER_DATA_STRUCTURE
+ @{ */
+
+/**
+ * @brief
+ *  Base address for all Watchdog Timer registers.  An offset based on the DSP core number
+ *  will be added to the register base address at initialization time to access each core's 
+ *  watchdog timer registers
+ */
+#define WatchdogTimer_REG_BASE 0x02200000
+
+/**
+ * @brief
+ * Register field write macro
+ */
+#define WatchdogTimer_REG_FIELD_WRITE(reg, mask, offset, val) \
+                   reg = ((reg & ((uint32_t) (~(mask << offset)))) | ((val & mask) << offset))
+                   
+
+/**
+ * @brief
+ *  Watchdog timer's register overlay
+ */
+volatile WatchdogTimer_regOverlay *wdRegOverlay;
+
+/**
+@}
+*/
+
+
+
+/**********************************************************************
+ ********************* Internal Functions *********************
+ **********************************************************************/
+/**
+ *  @b Description
+ *  @n  
+ *      This function configures the corepac reset action to take if the watchdog
+ *      timer expires.
+ *
+ *  @param[in]  omode
+ *      RSTMUX register output mode configured
+ *  @param[in]  delay
+ *      RSTMUX register configured delay between NMI and local reset
+ */
+void configureResetMuxReg(WatchdogTimer_RstmuxOmode omode, 
+                                                     WatchdogTimer_RstmuxDelay delay)
+{
+    volatile uint32_t *rstmux = (volatile uint32_t *) (WatchdogTimer_RSTMUXnBASE);
+    uint32_t omodeVal = (uint32_t) omode;
+    uint32_t delayVal = (uint32_t) delay;
+    
+    /* Set the output mode making sure to offset the RSTMUXn register pointer based on the core number */
+    WatchdogTimer_REG_FIELD_WRITE(rstmux[DNUM], WatchdogTimer_RSTMUXn_OMODE_MASK, 
+                                                               WatchdogTimer_RSTMUXn_OMODE_SHIFT, omodeVal);
+    
+
+    /* Set the delay field if NMI followed by a local reset is selected */
+    if (omode == WatchdogTimer_RstmuxOmode_NMI_INPUT_PLUS_LOCAL_RESET_INPUT)
+    {
+        /* Offset the RSTMUXn register pointer based on the core number */
+        WatchdogTimer_REG_FIELD_WRITE(rstmux[DNUM], WatchdogTimer_RSTMUXn_DELAY_MASK, 
+                                                                   WatchdogTimer_RSTMUXn_DELAY_SHIFT, delayVal);
+    }
+
+    return;
+}
+
+
+/**********************************************************************
+ ********************* External Functions *********************
+ **********************************************************************/
+
+/** @addtogroup WATCHDOGTIMER_FUNCTION
+ @{ */
+
+/**
+ *  @b Description
+ *  @n 
+ *      This function is called to configure and start the watchdog timer for a DSP core.
+ *      The input configuration controls watchdog running conditions, timeout conditions,
+ *      and timeout actions.
+ *
+ *  @param[in]  wdCfg
+ *      Watchdog timer configuration structure.  For more information on the configuration
+ *      parameters please see WatchdogTimer.xdc
+ *
+ *  @retval
+ *      WatchdogTimer_Status - For more information on status return values please see
+ *                                           WatchdogTimer.xdc
+ */
+WatchdogTimer_Status WatchdogTimer_Init (WatchdogTimer_InitCfg *wdCfg)
+{
+    volatile uint32_t *rstctrl = (volatile uint32_t *)WatchdogTimer_RSTCTRL;
+    volatile uint32_t *rstcfg = (volatile uint32_t *)WatchdogTimer_RSTCFG;
+
+    /* Set the Watchdog timer register overlay address based on DSP core number */
+    wdRegOverlay = (volatile WatchdogTimer_regOverlay *) (WatchdogTimer_REG_BASE + (0x10000 * DNUM));
+
+    /* Configure how the reset block handles the watchdog timer timeout event */
+    configureResetMuxReg(wdCfg->rstOmode, wdCfg->rstDelay);
+
+    /* Check the RSTCFG reset type value */
+    if ((wdCfg->wdResetType != WatchdogTimer_RstcfgResetType_HARD_RESET) &&
+        (wdCfg->wdResetType != WatchdogTimer_RstcfgResetType_SOFT_RESET))
+    {
+        return (WatchdogTimer_Status_ERROR_INVALID_RSTCFG_VAL);
+    }
+    
+    /* Configure the type of reset to occur if the watchdog timer expires */
+    WatchdogTimer_REG_FIELD_WRITE(*rstctrl, WatchdogTimer_RSTCTRL_KEY_MASK, 
+                                                               WatchdogTimer_RSTCTRL_KEY_SHIFT, 
+                                                               (uint32_t) WatchdogTimer_RSTCTRL_KEY_VALUE);
+    /* Configure the core's watchdog timer reset type */
+    WatchdogTimer_REG_FIELD_WRITE(*rstcfg, WatchdogTimer_RSTCFG_WDTYPE_MASK, 
+                                                               DNUM, (uint32_t) wdCfg->wdResetType);
+
+    if (wdCfg->wdRegisterTimeoutExc)
+    {
+        /* Register the TINTLn GEM event as an exception causing event */
+        Exception_evtEvtClear(WatchdogTimer_TINTLDSPINT);
+        Exception_evtExpMaskEnable(WatchdogTimer_TINTLDSPINT);
+    }
+      
+    /* Enable interrupt generation for watchdog mode */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->INTCTLSTAT, 
+                                   WatchdogTimer_INTCTRLSTAT_PRDINTEN_MASK, 
+                                   WatchdogTimer_INTCTRLSTAT_PRDINTEN_LO_SHIFT, 
+                                   (uint32_t) WatchdogTimer_INTCTRLSTAT_PRDINTEN_ENABLE_INT);
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->INTCTLSTAT, 
+                                   WatchdogTimer_INTCTRLSTAT_PRDINTEN_MASK, 
+                                   WatchdogTimer_INTCTRLSTAT_PRDINTEN_HI_SHIFT, 
+                                   (uint32_t) WatchdogTimer_INTCTRLSTAT_PRDINTEN_ENABLE_INT);
+
+    /* Move the timer from disabled to initial state (watchdog mode is still disabled)
+      * TIMLORS = not in reset
+      * TIMHIRS = not in reset
+      * TIMMODE = 64-bit watchdog timer mode */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->TGCR, 
+                                   WatchdogTimer_TGCR_TIMLORS_MASK, 
+                                   WatchdogTimer_TGCR_TIMLORS_SHIFT, 
+                                   (uint32_t) WatchdogTimer_TGCR_TIMLORS_NOT_IN_RESET);
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->TGCR, 
+                                   WatchdogTimer_TGCR_TIMHIRS_MASK, 
+                                   WatchdogTimer_TGCR_TIMHIRS_SHIFT, 
+                                   (uint32_t) WatchdogTimer_TGCR_TIMHIRS_NOT_IN_RESET);      
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->TGCR, 
+                                   WatchdogTimer_TGCR_TIMMODE_MASK, 
+                                   WatchdogTimer_TGCR_TIMMODE_SHIFT, 
+                                   (uint32_t) WatchdogTimer_TGCR_TIMMODE_64BIT_WD_MODE);      
+
+    /* Configure the watchdog timer period */
+    wdRegOverlay->PRDLO = wdCfg->wdPeriodLo;
+    wdRegOverlay->PRDHI = wdCfg->wdPeriodHi;
+
+    /* Clear the count registers to zero */
+    wdRegOverlay->CNTLO = 0;
+    wdRegOverlay->CNTHI = 0;
+
+    /* Enable timer mode: Only write ENAMODE_LO */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->TCR, 
+                                   WatchdogTimer_TCR_ENAMODE_LO_MASK, 
+                                   WatchdogTimer_TCR_ENAMODE_LO_SHIFT, 
+                                   (uint32_t) WatchdogTimer_TCR_ENAMODE_LO_CONTINUOUS_INC);      
+
+    /* Enable watchdog timer mode, moves the watchdog timer into the pre-active state */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDEN_MASK, 
+                                   WatchdogTimer_WDTCR_WDEN_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WATCHDOG_ENABLE);     
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR,
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY1);         
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_PRE_ACTIVE;
+
+    /* Activate the timer */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY2);      
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_ACTIVE;
+
+    return (WatchdogTimer_Status_OKAY);
+}
+
+/**
+ *  @b Description
+ *  @n 
+ *      This function is called to perform a full reset of the watchdog timer count.  It will
+ *      move the watchdog timer from the Active state to the Service state then back
+ *      to the Active state in order to reset the watchdog timer.
+ *
+ *  @retval
+ *      WatchdogTimer_Status - For more information on status return values please see
+ *                                           WatchdogTimer.xdc
+ */
+WatchdogTimer_Status WatchdogTimer_ResetTimer(void)
+{
+    /* Reset the timer by moving it to the service state then back to the active state */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY1);            
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_SERVICE;
+    /* Reset timer count value */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY2);            
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_ACTIVE;
+
+    return (WatchdogTimer_Status_OKAY); 
+}
+
+/**
+ *  @b Description
+ *  @n 
+ *      This function is called to move the Watchdog timer from the Active state to
+ *      the Service state.  This will NOT reset the watchdog timer count.  A call to this
+ *      function must be followed by a call to the WatchdogTimer_MoveToActiveState 
+ *      function in order to fully reset the watchdog timer count.
+ *
+ *  @retval
+ *      WatchdogTimer_Status - For more information on status return values please see
+ *                                           WatchdogTimer.xdc
+ */
+WatchdogTimer_Status WatchdogTimer_MoveToServiceState(void)
+{
+    if (WatchdogTimer_module->wdTimerState == WatchdogTimer_wdStates_SERVICE)
+    {
+        return (WatchdogTimer_Status_ERROR_ALREADY_IN_SERVICE_STATE);
+    }
+
+    /* Move the timer to the service state */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY1);            
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_SERVICE;
+
+    return (WatchdogTimer_Status_OKAY);     
+}
+
+/**
+ *  @b Description
+ *  @n  
+ *      This function is called to move the Watchdog timer from the Service state to
+ *      the Active state.  This will reset the watchdog timer count as long as the watchdog
+ *      timer resides in the Service state at the time of calling this API.  A call to this
+ *      function must be preceeded by a call to the WatchdogTimer_MoveToServiceState 
+ *      function in order to fully reset the watchdog timer count.
+ *
+ *  @retval
+ *      Not Applicable    
+ */
+WatchdogTimer_Status WatchdogTimer_MoveToActiveState(void)
+{
+    if (WatchdogTimer_module->wdTimerState == WatchdogTimer_wdStates_ACTIVE)
+    {
+        return (WatchdogTimer_Status_ERROR_ALREADY_IN_ACTIVE_STATE);
+    }
+
+    /* Reset the timer by moving it back to the active state */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) WatchdogTimer_WDTCR_WDKEY_KEY2);            
+    WatchdogTimer_module->wdTimerState = WatchdogTimer_wdStates_ACTIVE;
+
+    return (WatchdogTimer_Status_OKAY);     
+}
+
+/**
+ *  @b Description
+ *  @n  
+ *      This function is called to force a timeout of the watchdog timer by writing an
+ *      invalid value to the watchdog timer control registers
+ */
+void WatchdogTimer_ForceTimeout(void)
+{
+    /* Force a timeout by writing a bad key value to WDKEY.  Does't matter what state
+      * the watchdog timer is in. */
+    WatchdogTimer_REG_FIELD_WRITE(wdRegOverlay->WDTCR, 
+                                   WatchdogTimer_WDTCR_WDKEY_MASK, 
+                                   WatchdogTimer_WDTCR_WDKEY_SHIFT, 
+                                   (uint32_t) 0xFFFF);
+}
+
+/**
+ *  @b Description
+ *  @n  
+ *      This function is called to check the Watchdog Timer control registers to see if
+ *      a timeout has occurred.  This function should be used to check for a timeout 
+ *      when the Watchdog Timer module has not been hooked up to the BIOS
+ *      Exception module.
+ *
+ *  @retval
+ *      TRUE - A Watchdog Timer timeout has occurred.
+ *  @retval
+ *      FALSE - A Watchdog Timer timeout has not occurred.
+ */
+Bool WatchdogTimer_HasTimeoutOccurred (void)
+{
+    /* If the WDFLAG bit is set in WDTCR register a timeout has occurred */
+    if ((wdRegOverlay->WDTCR & (WatchdogTimer_WDTCR_WDFLAG_MASK << WatchdogTimer_WDTCR_WDFLAG_SHIFT)) >>
+         WatchdogTimer_WDTCR_WDFLAG_SHIFT)
+    {
+        return(TRUE);
+    }
+
+    /* Timeout has not occurred.  The watchdog is still running */
+    return(FALSE);
+}
+
+/**
+@}
+*/
+
+/**
+@}
+*/
+
diff --git a/test/Module.xs b/test/Module.xs
new file mode 100644 (file)
index 0000000..cf8fb87
--- /dev/null
@@ -0,0 +1,55 @@
+/******************************************************************************
+ * FILE PURPOSE: Watchdog Timer Test files.
+ ******************************************************************************
+ * FILE NAME: module.xs
+ *
+ * DESCRIPTION: 
+ *  This file contains the module specification for Watchdog Timer Test
+ *  Files
+ *
+ * Copyright (C) 2012-2014 Texas Instruments, Inc.
+ *****************************************************************************/
+
+/* Load the library utility. */
+var libUtility = xdc.loadCapsule ("../build/buildlib.xs");
+
+/**************************************************************************
+ * FUNCTION NAME : modBuild
+ **************************************************************************
+ * DESCRIPTION   :
+ *  The function is used to add all the source files in the test 
+ *  directory into the package.
+ **************************************************************************/
+function modBuild() 
+{
+    /* Add all the .c files to the release package. */
+    var testFiles = libUtility.listAllFiles (".c", "test");
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+
+    /* Add all the .h files to the release package. */
+    var testFiles = libUtility.listAllFiles (".h", "test");
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+
+    /* Add all the .cfg files to the release package. */
+    var testFiles = libUtility.listAllFiles (".cfg", "test");
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+
+    /* Add all the .cmd files to the release package. */
+    var testFiles = libUtility.listAllFiles (".cmd", "test");
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+
+    /* Add the README files to the release package. */
+    var testFiles = libUtility.listAllFiles ("README.txt", "test");
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];
+        
+    /* Add the .txt to the package */
+    var testFiles = libUtility.listAllFiles (".txt", "test", true);
+    for (var k = 0 ; k < testFiles.length; k++)
+        Pkg.otherFiles[Pkg.otherFiles.length++] = testFiles[k];        
+}
+
diff --git a/test/README.txt b/test/README.txt
new file mode 100644 (file)
index 0000000..6dcec72
--- /dev/null
@@ -0,0 +1,50 @@
+Watchdog Timer Example
+
+
+
+
+
+A simple example demonstrating how to configure and use the Watchdog Timer module to monitor the DSP for application corruptions and failures.
+
+
+
+
+
+Steps to build the test application:
+
+
+
+
+1. Import the CCS WatchdogTimerTestProject from instrumentation\wdtimer\test directory. (in CCSv5.1, File->Import... Select Existing CCS/CCE Eclipse Projects)
+
+
+
+2. Clean the WatchdogTimerTestProject project, delete the Debug and Release directories, and re-build the project.  After the build is complete, WatchdogTimerTestProject.out will be generated under instrumentation\wdtimer\test\Debug (or \Release depending on the build configuration) directory.
+
+
+
+
+
+Steps to run WatchdogTimerTestProject in CCSv5.1:
+
+
+
+
+1. Be sure to set the boot mode dip switch to no boot/EMIF16 boot mode on the EVM.
+
+
+
+2. Group all DSP cores and then connect to the group.
+
+3. Load instrumentation\wdtimer\test\Debug\WatchdogTimerTestProject.out on all cores.
+
+
+
+4. Run the project.  DSP exceptions should occur on all cores.
+
+5. Parse the I/O output for the following prints:
+
+Core n: wdExceptionFunction - The watchdog timer has expired.
+Core n: Watchdog Timer Test PASSED.
+
+The latter print should exist for all cores in the DSP group.  The ordering of the prints will be random since the prints are based on order in which the cores received the Watchdog Timer timeout exception.  If all cores in the DSP group print PASSED the Watchdog Timer test has passed.  If at least one DSP prints FAILED the test fails.
\ No newline at end of file
diff --git a/test/src/test.c b/test/src/test.c
new file mode 100644 (file)
index 0000000..c55575c
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+ *   @file  test.c
+ *
+ *   @brief   
+ *      Test Code to test the Watchdog Timer Module
+ *
+ *  \par
+ *  NOTE:
+ *      (C) Copyright 2012 Texas Instruments, Inc.
+ * 
+ *  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.
+ *
+ */
+#include <c6x.h>
+#include <stdint.h>
+#include <string.h>
+
+/* BIOS/XDC Include Files. */
+#include <xdc/std.h>
+#include <xdc/runtime/System.h>
+#include <ti/sysbios/BIOS.h>
+#include <ti/sysbios/knl/Task.h>
+
+/* WatchdogTimer module includes */
+#include <ti/instrumentation/wdtimer/WatchdogTimer.h>
+
+/* API test result */
+Bool apiTestPassed = FALSE;
+
+/**********************************************************************
+ ************************* Unit Test Functions ************************
+ **********************************************************************/
+
+/* Exception function that is plugged into exception module */
+void wdExceptionFunction (void)
+{
+    System_printf ("Core %d: wdExceptionFunction - The watchdog timer has expired.\n", DNUM);
+
+    if (apiTestPassed)
+    {
+        System_printf ("Core %d: Watchdog Timer Test PASSED.\n", DNUM);
+    }
+    else
+    {
+        System_printf ("Core %d: Watchdog Timer Test FAILED.\n", DNUM);
+    }      
+}
+
+/* Test task which configures the watchdog timer API tests */
+void testTask (void)
+{
+    WatchdogTimer_InitCfg wdCfg;
+
+    /* Initialize the watchdog timer configuration structure to all zeros */
+    memset ((void *)&wdCfg, 0, sizeof(WatchdogTimer_InitCfg));
+
+    System_printf ("Core %d: Configuring Watchdog Timer for API tests.\n", DNUM);
+
+    /* Configure the watchdog timer with a low period and no output event
+     * This scenario is used to test the different watchdog reset APIs.  After 
+     * testing all reset APIs the watchdog will be forcefully timed out.  The period
+     * is configured to be low enough so that if none of the reset APIs work the
+     * reset will occur prior to the forced timeout. */
+    wdCfg.wdPeriodLo = 0x00001000;
+    wdCfg.wdPeriodHi = 0x00000000;
+    wdCfg.wdResetType = WatchdogTimer_RstcfgResetType_SOFT_RESET;
+    wdCfg.wdRegisterTimeoutExc = TRUE;
+    wdCfg.rstOmode = WatchdogTimer_RstmuxOmode_DEFAULT_NO_OUTPUT_EVENT;
+    wdCfg.rstDelay = WatchdogTimer_RstmuxDelay_4096CPU_DIV_6_CYCLES_DEFAULT;
+
+    /* Initialize and start the timer */
+    WatchdogTimer_Init(&wdCfg);
+
+    /* Test ResetTimer API */
+    System_printf ("Core %d: Servicing Watchdog Timer via ResetTimer API.\n", DNUM);
+    WatchdogTimer_ResetTimer();
+
+    /* Test individual service state APIs */
+    System_printf ("Core %d: Servicing Watchdog Timer via MoveTo APIs.\n", DNUM);
+    WatchdogTimer_MoveToServiceState();
+    WatchdogTimer_MoveToActiveState();
+
+    /* If reached here the API tests passed.  Force the watchdog timeout */
+    apiTestPassed = TRUE;
+    System_printf ("Core %d: Forcing Timeout.\n", DNUM);
+    WatchdogTimer_ForceTimeout();      
+
+    /* If the force timeout API doesn't work the exception will not execute and this
+     * code will be reached. */
+    System_printf ("\nCore %d: ForceTimeout API Test FAILED.", DNUM);
+}
+
+int32_t main(int32_t argc, char* argv[])
+{
+    Task_Params         taskParams;
+
+    System_printf ("**********************************************\n");
+    System_printf ("********** Watchdog Timer Unit Test **********\n");
+    System_printf ("**********************************************\n");
+
+    /* Initialize the Task Parameters. */
+    Task_Params_init(&taskParams);
+
+    /* Create a task that causes an exception */
+    Task_create((Task_FuncPtr)testTask, &taskParams, NULL);
+
+    BIOS_start();
+    return 0;
+}
+
diff --git a/test/test.cfg b/test/test.cfg
new file mode 100644 (file)
index 0000000..263626c
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 2012 by Texas Instruments Incorporated.
+ *
+ *  All rights reserved. Property of Texas Instruments Incorporated.
+ *  Restricted rights to use, duplicate or disclose this code are
+ *  granted through contract.
+ *
+ */
+
+/* Load and use the various BIOS modules. */
+var BIOS    = xdc.useModule('ti.sysbios.BIOS');
+var Task    = xdc.useModule('ti.sysbios.knl.Task');
+var Exception = xdc.useModule('ti.sysbios.family.c64p.Exception');
+
+/* Load and use the Fault Management package */
+var WatchdogTimer = xdc.useModule('ti.instrumentation.wdtimer.WatchdogTimer'); 
+
+/* Plug the test exception function into the BIOS Exception module.  This function will
+  * be executed by the Exception module when the watchdog timer expires */
+Exception.exceptionHook = '&wdExceptionFunction';
+
+/* Enable BIOS Task Scheduler */
+BIOS.taskEnabled = true;
+
+/*
+ * The SysMin used here vs StdMin, as trace buffer address is required for
+ * Linux trace debug driver, plus provides better performance.
+ */
+Program.global.sysMinBufSize = 0x8000;
+var System = xdc.useModule('xdc.runtime.System');
+var SysMin = xdc.useModule('xdc.runtime.SysMin');
+System.SupportProxy = SysMin;
+SysMin.bufSize = Program.global.sysMinBufSize;
+
diff --git a/test/wdtimer_C6614TestInstrumentationProject.txt b/test/wdtimer_C6614TestInstrumentationProject.txt
new file mode 100644 (file)
index 0000000..534212c
--- /dev/null
@@ -0,0 +1,4 @@
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/src/test.c"
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/test.cfg" 
+-ccs.setCompilerOptions "-mv6600 -g --diag_warning=225"
+-rtsc.enableRtsc
diff --git a/test/wdtimer_K2ETestInstrumentationProject.txt b/test/wdtimer_K2ETestInstrumentationProject.txt
new file mode 100644 (file)
index 0000000..534212c
--- /dev/null
@@ -0,0 +1,4 @@
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/src/test.c"
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/test.cfg" 
+-ccs.setCompilerOptions "-mv6600 -g --diag_warning=225"
+-rtsc.enableRtsc
diff --git a/test/wdtimer_K2HTestInstrumentationProject.txt b/test/wdtimer_K2HTestInstrumentationProject.txt
new file mode 100644 (file)
index 0000000..534212c
--- /dev/null
@@ -0,0 +1,4 @@
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/src/test.c"
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/test.cfg" 
+-ccs.setCompilerOptions "-mv6600 -g --diag_warning=225"
+-rtsc.enableRtsc
diff --git a/test/wdtimer_K2KTestInstrumentationProject.txt b/test/wdtimer_K2KTestInstrumentationProject.txt
new file mode 100644 (file)
index 0000000..534212c
--- /dev/null
@@ -0,0 +1,4 @@
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/src/test.c"
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/test.cfg" 
+-ccs.setCompilerOptions "-mv6600 -g --diag_warning=225"
+-rtsc.enableRtsc
diff --git a/test/wdtimer_K2LTestInstrumentationProject.txt b/test/wdtimer_K2LTestInstrumentationProject.txt
new file mode 100644 (file)
index 0000000..534212c
--- /dev/null
@@ -0,0 +1,4 @@
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/src/test.c"
+-ccs.linkFile "PDK_INSTALL_PATH/ti/instrumentation/wdtimer/test/test.cfg" 
+-ccs.setCompilerOptions "-mv6600 -g --diag_warning=225"
+-rtsc.enableRtsc