/*
This file is part of the ChipWhisperer Example Targets
Copyright (C) 2019-2020 NewAE Technology Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "nxp/config/Cpu.h"
#include "nxp/config/canCom1.h"
#include "nxp/config/pin_mux.h"
#include "nxp/config/uart_pal1.h"
#include "nxp/drivers/inc/uart_esci_callback.h"
#include "MPC5676R_hal.h"
#define TIMEOUT (200U)
#include
#include
#include
#if 0
#include "board.h"
#include "fsl_dcp.h"
#include "fsl_lpuart.h"
#include "fsl_snvs_lp.h"
#include "pin_mux.h"
#include "system_MPC5676R.h"
#include "clock_config.h"
#endif
#define LED_PORT PTD
#define LED0 0U
#define LED1 1U
#define BTN_PORT PTE
#define BTN0_PIN 6U
#define BTN1_PIN 7U
#define BTN0_EIRQ 8U
#define BTN1_EIRQ 9U
#define FLASH_REG FLASH_A.BIUCR.R
#define FLASH_DATA 0x00016B35
#define FLASH_REG2 FLASH_A.BIUCR3.R
#define FLASH_DATA2 0x00020015
/* This function is defined in some other functions too */
__attribute__ ((weak)) void uart_puts(char * s){
while(*s){
putch(*(s++));
}
}
void init_uart(void)
{
UART_Init(&uart_pal1_instance, &uart_pal1_Config0);
}
void putch(char c)
{
/* Ensure all the data in the transmit buffer are sent out to bus. */
char local = c;
uint8_t* mssg = &local;
// UART_SendData(&uart_pal1_instance, (uint8_t *)mssg, 1);
ESCI_HW_SendCharacter(0, c);
// while (!ESCI_HW_GetSendReadyFlag(0));
// ESCI_HW_ClearSendReadyFlag(0);
}
char getch(void)
{
char mssg;
while (!ESCI_HW_GetReceiveReadyFlag(0));
ESCI_HW_ClearReceiveReadyFlag(0);
UART_ReceiveDataBlocking(&uart_pal1_instance, &mssg, 1,TIMEOUT);
return mssg;
}
void trigger_setup(void)
{
//Setup is done in pin_mux file
;
}
void trigger_high(void)
{
// PINS_DRV_WritePin(SIU, 160, 1);
pin_settings_config_t trig_config = {
.base = SIU,
.pinPortIdx = 160u,
.mux = PORT_MUX_AS_GPIO,
.outputBuffer = PORT_OUTPUT_BUFFER_ENABLED,
.slewRateCtrl = HALF_STRENGTH_WITH_SLEWRATE_CONTROL,
.openDrain = PORT_OPEN_DRAIN_DISABLED,
.hysteresis = PORT_HYSTERESYS_DISABLED,
.driveSelect = PORT_MINIMUM_DRIVE_STRENGTH,
.inputBuffer = PORT_INPUT_BUFFER_DISABLED,
.pullConfig = PORT_INTERNAL_PULL_NOT_ENABLED,
.initValue = 1u,
};
PINS_DRV_Init(1, &trig_config);
;
}
void trigger_low(void)
{
pin_settings_config_t trig_config = {
.base = SIU,
.pinPortIdx = 160u,
.mux = PORT_MUX_AS_GPIO,
.outputBuffer = PORT_OUTPUT_BUFFER_ENABLED,
.slewRateCtrl = HALF_STRENGTH_WITH_SLEWRATE_CONTROL,
.openDrain = PORT_OPEN_DRAIN_DISABLED,
.hysteresis = PORT_HYSTERESYS_DISABLED,
.driveSelect = PORT_MINIMUM_DRIVE_STRENGTH,
.inputBuffer = PORT_INPUT_BUFFER_DISABLED,
.pullConfig = PORT_INTERNAL_PULL_NOT_ENABLED,
.initValue = 0u,
};
// PINS_DRV_WritePin(SIU, 160, 0);
PINS_DRV_Init(1, &trig_config);
;
}
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_LED_GPIO BOARD_USER_LED_GPIO
#define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_PIN
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
Function Name : Flash_Init
Engineer : b55689
Date : Jan-12-2018
Parameters :
Modifies :
Returns :
Notes : necessary for correct functionality of core 1
Issues :
*******************************************************************************/
static void FlashInit(void)
{
unsigned int mem_write_code [] =
{
/*for processors which support VLE only or for 'VLE on' option*/
0xD0344400, /* stw r3,(0)r4 machine code: writes r3 contents to addr in r4 then se_nop*/
0x7C0006AC, /* mbar machine code: ensure prior store completed */
0x44000004 /* blr machine code: branches to return address in link register */
};
typedef void (*mem_write_code_ptr_t)(unsigned int, unsigned int);
#if defined(FLASH_REG)
#if FLASH_DATA > 0
(*((mem_write_code_ptr_t)mem_write_code)) /* cast mem_write_code as func ptr*/
/* * de-references func ptr, i.e. converts to func*/
(FLASH_DATA, /* which passes integer (in r3) */
(unsigned int)&FLASH_REG);
#endif
#endif
#if defined(FLASH_REG2)
(*((mem_write_code_ptr_t)mem_write_code)) /* cast mem_write_code as func ptr*/
/* * de-references func ptr, i.e. converts to func*/
(FLASH_DATA2, /* which passes integer (in r3) */
(unsigned int)&FLASH_REG2);
#endif
}
/*******************************************************************************
Function Name : XBAR_Init
Engineer : b55689
Date : Jan-12-2018
Parameters :
Modifies :
Returns :
Notes :
Issues :
*******************************************************************************/
static void XbarInit(void)
{
/* set round robin for all slaves */
XBAR.SGPCR0.B.ARB = 1;
XBAR.SGPCR1.B.ARB = 1;
XBAR.SGPCR2.B.ARB = 1;
XBAR.SGPCR3.B.ARB = 1;
XBAR.SGPCR6.B.ARB = 1;
XBAR.SGPCR7.B.ARB = 1;
}
/*******************************************************************************
Function Name : PIT3_Init
Engineer : b05111
Date : Mar-04-2012
Parameters :
Modifies :
Returns :
Notes : expecting fsys = 180MHz, Init PIT for 1 second period
Issues :
*******************************************************************************/
static void PIT3Init(void)
{
/* 30: MDIS = 0 to enable clock for PITs. */
/* 31: FRZ = 1 for Timers stopped in debug mode */
PIT->MCR = 0x00000001;
PIT->TIMER[3].LDVAL = 18000000 - 1;
/* clear the TIF flag */
PIT->TIMER[3].TFLG = 0x00000001;
/* 30: TIE = 1 for interrupt request enabled */
// 31: TEN = 1 for timer active */
PIT->TIMER[3].TCTRL = 0x00000003;
}
/*
* @brief : Initialize clocks, pins and power modes
*/
void BoardInit(void)
{
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
// FMPLL.ESYNCR1.B.CLKCFG = 7; /* Normal mode with crystal osc */
// FMPLL.ESYNCR1.B.CLKCFG = 0; /* Normal mode with crystal osc */
/* Programming PLL to 60 MHz */
/* Fpll = (10Mhz* (EMFD+16)) / ((ERFD+1) * (EPREDIV+1) * DIV2) */
/* Fpll = (10 * 54 / 9) = 60MHz */
// FMPLL.ESYNCR2.R = 0x00000002; /* Output divide ratio: 2+1=3 */
// FMPLL.ESYNCR1.B.EPREDIV = 5; /* Input divide ratio: 5+1=6 */
// FMPLL.ESYNCR1.B.EMFD = 38; /* Feedback divide ratio: 38+16=54 */
// while(!FMPLL.SYNSR.B.LOCK) {;} /* Wait for FMPLL to lock */
// VERY IMPORTANT:
// The endianness of the datasheet is opposite
// To the C representation
// So bit 0 on the datasheet is bit 31 here
// Probably powerpc bs
if (SIU->SYSDIV & (1 << 31)) {
SIU->SYSDIV &= ~(1 << 31);
}
uint32_t sysdiv = SIU->SYSDIV;
//sysclock = xosc
sysdiv &= ~(0b11 << 12);
sysdiv |= 0b01 << 12; //10 for ext oscillator
// turn off bypass
// sysdiv &= ~(0b1 << 4);
sysdiv &= ~(0b11 << 2); // sysclock/2 for m_clk
SIU->SYSDIV = sysdiv;
pin_settings_config_t clkokconfig = {
.base = SIU,
.pinPortIdx = 199,
.mux = PORT_MUX_AS_GPIO,
.outputBuffer = PORT_OUTPUT_BUFFER_ENABLED,
.slewRateCtrl = HALF_STRENGTH_WITH_SLEWRATE_CONTROL,
.openDrain = PORT_OPEN_DRAIN_DISABLED,
.hysteresis = PORT_HYSTERESYS_DISABLED,
.driveSelect = PORT_MINIMUM_DRIVE_STRENGTH,
.inputBuffer = PORT_INPUT_BUFFER_DISABLED,
.pullConfig = PORT_INTERNAL_PULL_NOT_ENABLED,
.initValue = 1u,
};
// PINS_DRV_WritePin(SIU, 160, 0);
PINS_DRV_Init(1, &clkokconfig);
// SIU_SYSDIV_BYPASS_MASK
// SIU->SYSDIV = (SIU->SYSDIV & ~SIU_SYSDIV_BYPASS_MASK) | SIU_SYSDIV_BYPASS(1U);
//SIU->SYSDIV = (SIU->SYSDIV & ~SIU_SYSDIV_SYSCLKSEL_MASK) | SIU_SYSDIV_SYSCLKSEL(2U);
}
/*******************************************************************************
* Variables
******************************************************************************/
volatile uint32_t g_systickCounter;
/* The PIN status */
volatile bool g_pinSet = false;
/*******************************************************************************
* Code
******************************************************************************/
void SysTick_Handler(void)
{
if (g_systickCounter != 0U)
{
g_systickCounter--;
}
}
void SysTick_DelayTicks(uint32_t n)
{
g_systickCounter = n;
while (g_systickCounter != 0U)
{
}
}
void platform_init(void)
{
//FlashInit();
//XbarInit();
BoardInit();
/*
* Initialize FlexCAN driver
* - 8 byte payload size
* - FD disabled
* - Oscillator clock as peripheral engine clock
*/
FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
}
// const uint32_t __attribute__((section (".rchw")))user_rchw[] = {
// 0x005A0000,
// 0x1000
// };
#define MPC56xx_ID 0x005A0000 /* RCHW boot ID for MPC56xx devices */
#define VLE_ENABLE 0x01000000 /* VLE is enabled */
extern void _start(void);
#define ENTRY_POINT _start
#define RCHW_VAL (VLE_ENABLE | MPC56xx_ID)
const uint32_t __attribute__ ((section(".rchw"))) RCHW[] = {RCHW_VAL, (uint32_t)ENTRY_POINT};