/***********************************************************************
*                    SEGGER Microcontroller GmbH                       *
*                        The Embedded Experts                          *
************************************************************************
*                                                                      *
*                  (c) SEGGER Microcontroller GmbH                     *
*                        All rights reserved                           *
*                          www.segger.com                              *
*                                                                      *
************************************************************************
*                                                                      *
************************************************************************
*                                                                      *
*                                                                      *
*  Licensing terms                                                     *
*                                                                      *
* The use in source and binary forms, with or without modification,    *
* is permitted for internal use only. The redistribution to any        *
* third party is prohibited.                                           *
*                                                                      *
*                                                                      *
* THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDER "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 COPYRIGHT HOLDER 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.                                                              *
*                                                                      *
************************************************************************

-------------------------- END-OF-HEADER -----------------------------

Purpose: Contains device specific handling for HPMicro HPM628x (CPU1)
*/

/*********************************************************************
*
*       Constants (similar to defines)
*
**********************************************************************
*/

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

/*********************************************************************
*
*       Global functions
*
**********************************************************************
*/
void _SBWriteEnable(void) {
  U32 v;

  JLINK_RISCV_DMI_ReadReg(0x38, &v);
  v = v & ~(1 << 20);
  JLINK_RISCV_DMI_WriteReg(0x38, v);
  return;
}

void _SBReadEnable(void) {
  U32 v;

  JLINK_RISCV_DMI_ReadReg(0x38, &v);
  v = v | (1 << 20);
  JLINK_RISCV_DMI_WriteReg(0x38, v);
  return;
}

void _SBWrite(U32 address, U32 value) {
  JLINK_RISCV_DMI_WriteReg(0x39, address);
  JLINK_RISCV_DMI_WriteReg(0x3C, value);
  return;
}

U32 _SBRead(U32 address) {
  U32 v;

  JLINK_RISCV_DMI_WriteReg(0x39, address);
  JLINK_RISCV_DMI_ReadReg(0x3C, &v);
  return v;
}

int InitTarget (void) {

  JLINK_RISCV_DMI_AutodetectDMISettings();
  _SBWriteEnable();
  _SBWrite(0xF4002C08, 0x20012588);  // Set start point for HART 1
  _SBWrite(0xF4002C0C, 0xC1BEF1A9);  // Set boot flag for HART 1
  _SBWrite(0xF4002C00, 0x1000);      // Release HART 1
  return 0;
}

/*********************************************************************
*
*       ResetTarget
*/
void ResetTarget(void) {
  JLINK_SYS_Report("Reset skipped.");
  //
  // Reset on multi-core devices is kind of tricky and highly depends on the use case.
  // In order to avoid any issues, we skip reset by default. If a reset is required, it
  // needs to be implemented according to the custom needs.
  //
}

/*************************** end of file ****************************/
