/* ###################################################################
**     This component module is generated by Processor Expert. Do not modify it.
**     Filename    : McuArmTools.h
**     Project     : FRDM-K64F_Generator
**     Processor   : MK64FN1M0VLL12
**     Component   : KinetisTools
**     Version     : Component 01.043, Driver 01.00, CPU db: 3.00.000
**     Compiler    : GNU C Compiler
**     Date/Time   : 2021-01-30, 15:10, # CodeGen: 729
**     Abstract    :
**
**     Settings    :
**          Component name                                 : McuArmTools
**          Utility                                        : McuUtility
**          SDK                                            : McuLib
**          Shell                                          : Enabled
**            Shell                                        : McuShell
**     Contents    :
**         SoftwareReset          - void McuArmTools_SoftwareReset(void);
**         UIDGet                 - uint8_t McuArmTools_UIDGet(McuArmTools_UID *uid);
**         UIDSame                - bool McuArmTools_UIDSame(const McuArmTools_UID *src, const McuArmTools_UID...
**         UIDtoString            - uint8_t McuArmTools_UIDtoString(const McuArmTools_UID *uid, uint8_t *buf,...
**         GetKinetisFamilyString - McuArmTools_ConstCharPtr McuArmTools_GetKinetisFamilyString(void);
**         GetPC                  - void* McuArmTools_GetPC(void);
**         GetSP                  - void* McuArmTools_GetSP(void);
**         SetPSP                 - void McuArmTools_SetPSP(void *setval);
**         SetLR                  - void McuArmTools_SetLR(uint32_t setval);
**         InitCycleCounter       - void McuArmTools_InitCycleCounter(void);
**         ResetCycleCounter      - void McuArmTools_ResetCycleCounter(void);
**         EnableCycleCounter     - void McuArmTools_EnableCycleCounter(void);
**         DisableCycleCounter    - void McuArmTools_DisableCycleCounter(void);
**         GetCycleCounter        - uint32_t McuArmTools_GetCycleCounter(void);
**         ParseCommand           - uint8_t McuArmTools_ParseCommand(const unsigned char* cmd, bool *handled,...
**         Deinit                 - void McuArmTools_Deinit(void);
**         Init                   - void McuArmTools_Init(void);
**
** * Copyright (c) 2014-2021, Erich Styger
**  * Web:         https://mcuoneclipse.com
**  * SourceForge: https://sourceforge.net/projects/mcuoneclipse
**  * Git:         https://github.com/ErichStyger/McuOnEclipse_PEx
**  * 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.
**  *
**  * 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 HOLDER 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.
** ###################################################################*/
/*!
** @file McuArmTools.h
** @version 01.00
** @brief
**
*/         
/*!
**  @addtogroup McuArmTools_module McuArmTools module documentation
**  @{
*/         

#ifndef __McuArmTools_H
#define __McuArmTools_H

/* MODULE McuArmTools. */
#include "McuLib.h" /* SDK and API used */
#include "McuArmToolsconfig.h" /* configuration */

#include <stddef.h> /* for size_t */
#if McuArmTools_CONFIG_PARSE_COMMAND_ENABLED
  #include "McuShell.h" /* Command line shell */
#endif


#ifndef __BWUserType_McuArmTools_ConstCharPtr
#define __BWUserType_McuArmTools_ConstCharPtr
  typedef const uint8_t *McuArmTools_ConstCharPtr; /* Pointer to constant string */
#endif


#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
  /* DWT (Data Watchpoint and Trace) registers, only exists on ARM Cortex with a DWT unit */
  #define McuArmTools_DWT_CONTROL             (*((volatile uint32_t*)0xE0001000))
    /*!< DWT Control register */
  #define McuArmTools_DWT_CYCCNTENA_BIT       (1UL<<0)
    /*!< CYCCNTENA bit in DWT_CONTROL register */
  #define McuArmTools_DWT_CYCCNT              (*((volatile uint32_t*)0xE0001004))
    /*!< DWT Cycle Counter register */
  #define McuArmTools_DEMCR                   (*((volatile uint32_t*)0xE000EDFC))
    /*!< DEMCR: Debug Exception and Monitor Control Register */
  #define McuArmTools_TRCENA_BIT              (1UL<<24)
    /*!< Trace enable bit in DEMCR register */
#endif

typedef struct {
  uint8_t id[16]; /* 128 bit ID */
} McuArmTools_UID;

typedef enum {
  McuArmTools_FAMILY_K10_K12,          /* K10 or K12 */
  McuArmTools_FAMILY_K20_K22,          /* K10 or K12 */
  McuArmTools_FAMILY_K30_K11_K61,      /* K30, K11 or K61 */
  McuArmTools_FAMILY_K40_K21,          /* K40 or K21 */
  McuArmTools_FAMILY_K70,              /* K70 */
  McuArmTools_FAMILY_UNKONWN,          /* Unknown */
  McuArmTools_FAMILY_LAST              /* Must be last one! */
} McuArmTools_FAMILY;

#define McuArmTools_PARSE_COMMAND_ENABLED  McuArmTools_CONFIG_PARSE_COMMAND_ENABLED
  /*!< set to 1 if method ParseCommand() is present, 0 otherwise */

#ifdef __cplusplus
extern "C" {
#endif

#if McuArmTools_CONFIG_PARSE_COMMAND_ENABLED
uint8_t McuArmTools_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io);
/*
** ===================================================================
**     Method      :  ParseCommand (component KinetisTools)
**
**     Description :
**         Shell Command Line parser. Method is only available if Shell
**         is enabled in the component properties.
**     Parameters  :
**         NAME            - DESCRIPTION
**         cmd             - Pointer to command string
**       * handled         - Pointer to variable which tells if
**                           the command has been handled or not
**       * io              - Pointer to I/O structure
**     Returns     :
**         ---             - Error code
** ===================================================================
*/
#endif

void McuArmTools_SoftwareReset(void);
/*
** ===================================================================
**     Method      :  SoftwareReset (component KinetisTools)
**
**     Description :
**         Performs a reset of the device
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

uint8_t McuArmTools_UIDGet(McuArmTools_UID *uid);
/*
** ===================================================================
**     Method      :  UIDGet (component KinetisTools)
**
**     Description :
**         Return the 128bit UID of the device
**     Parameters  :
**         NAME            - DESCRIPTION
**       * uid             - Pointer to 
**     Returns     :
**         ---             - Error code
** ===================================================================
*/

bool McuArmTools_UIDSame(const McuArmTools_UID *src, const McuArmTools_UID *dst);
/*
** ===================================================================
**     Method      :  UIDSame (component KinetisTools)
**
**     Description :
**         Compares two UID
**     Parameters  :
**         NAME            - DESCRIPTION
**       * src             - Pointer to 
**         Variable_1      - 
**     Returns     :
**         ---             - TRUE if the same, FALSE otherwise
** ===================================================================
*/

uint8_t McuArmTools_UIDtoString(const McuArmTools_UID *uid, uint8_t *buf, size_t bufSize);
/*
** ===================================================================
**     Method      :  UIDtoString (component KinetisTools)
**
**     Description :
**         Returns the value of the UID as string
**     Parameters  :
**         NAME            - DESCRIPTION
**         uid             - 
**       * buf             - Pointer to 
**         bufSize         - 
**     Returns     :
**         ---             - Error code
** ===================================================================
*/

McuArmTools_ConstCharPtr McuArmTools_GetKinetisFamilyString(void);
/*
** ===================================================================
**     Method      :  GetKinetisFamilyString (component KinetisTools)
**
**     Description :
**         Determines the Kinetis Familiy based on SIM_SDID register
**     Parameters  : None
**     Returns     :
**         ---             - String describing the Kinetis Family
** ===================================================================
*/

void* McuArmTools_GetPC(void);
/*
** ===================================================================
**     Method      :  GetPC (component KinetisTools)
**
**     Description :
**         returns the program counter
**     Parameters  : None
**     Returns     :
**         ---             - program counter
** ===================================================================
*/

void* McuArmTools_GetSP(void);
/*
** ===================================================================
**     Method      :  GetSP (component KinetisTools)
**
**     Description :
**         returns the stack pointer
**     Parameters  : None
**     Returns     :
**         ---             - stack pointer
** ===================================================================
*/

void McuArmTools_SetPSP(void *setval);
/*
** ===================================================================
**     Method      :  SetPSP (component KinetisTools)
**
**     Description :
**         sets the process stack pointer
**     Parameters  :
**         NAME            - DESCRIPTION
**         setval          - new PSP value
**     Returns     : Nothing
** ===================================================================
*/

void McuArmTools_SetLR(uint32_t setval);
/*
** ===================================================================
**     Method      :  SetLR (component KinetisTools)
**
**     Description :
**         Sets the link register
**     Parameters  :
**         NAME            - DESCRIPTION
**         setval          - new LR value
**     Returns     : Nothing
** ===================================================================
*/

#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
#define McuArmTools_InitCycleCounter() \
  McuArmTools_DEMCR |= McuArmTools_TRCENA_BIT
  /*!< TRCENA: Enable trace and debug block DEMCR (Debug Exception and Monitor Control Register */
/*
** ===================================================================
**     Method      :  InitCycleCounter (component KinetisTools)
**
**     Description :
**         Initializes the cycle counter, available if the core has a
**         DWT (Data Watchpoint and Trace) unit, usually present on
**         M3/M4/M7
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
#endif

#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
#define McuArmTools_ResetCycleCounter() \
  McuArmTools_DWT_CYCCNT = 0
  /*!< Reset cycle counter */
/*
** ===================================================================
**     Method      :  ResetCycleCounter (component KinetisTools)
**
**     Description :
**         Reset the cycle counter (set it to zero)
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
#endif

#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
#define McuArmTools_EnableCycleCounter() \
  McuArmTools_DWT_CONTROL |= McuArmTools_DWT_CYCCNTENA_BIT
  /*!< Enable cycle counter */
/*
** ===================================================================
**     Method      :  EnableCycleCounter (component KinetisTools)
**
**     Description :
**         Enables counting the cycles.
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
#endif

#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
#define McuArmTools_DisableCycleCounter() \
  McuArmTools_DWT_CONTROL &= ~McuArmTools_DWT_CYCCNTENA_BIT
  /*!< Disable cycle counter */
/*
** ===================================================================
**     Method      :  DisableCycleCounter (component KinetisTools)
**
**     Description :
**         Disables the cycle counter.
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
#endif

#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */
#define McuArmTools_GetCycleCounter() \
  McuArmTools_DWT_CYCCNT
  /*!< Read cycle counter register */
/*
** ===================================================================
**     Method      :  GetCycleCounter (component KinetisTools)
**
**     Description :
**         Return the current cycle counter value
**     Parameters  : None
**     Returns     :
**         ---             - cycle counter
** ===================================================================
*/
#endif

void McuArmTools_Deinit(void);
/*
** ===================================================================
**     Method      :  Deinit (component KinetisTools)
**
**     Description :
**         Driver de-initialization routine
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

void McuArmTools_Init(void);
/*
** ===================================================================
**     Method      :  Init (component KinetisTools)
**
**     Description :
**         Driver initialization routine
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

/* END McuArmTools. */

#ifdef __cplusplus
}  /* extern "C" */
#endif

#endif
/* ifndef __McuArmTools_H */
/*!
** @}
*/
