add etm trace pinmux for 4088 quickstart
This commit is contained in:
parent
ef49b93532
commit
210fc7d038
|
@ -31,6 +31,41 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LED_PORT 2
|
||||||
|
#define LED_PIN 19
|
||||||
|
|
||||||
|
#define BUTTON_PORT 2
|
||||||
|
#define BUTTON_PIN 10
|
||||||
|
#define BUTTON_ACTIV_STATE 0
|
||||||
|
|
||||||
|
/* System oscillator rate and RTC oscillator rate */
|
||||||
|
const uint32_t OscRateIn = 12000000;
|
||||||
|
const uint32_t RTCOscRateIn = 32768;
|
||||||
|
|
||||||
|
/* Pin muxing configuration */
|
||||||
|
static const PINMUX_GRP_T pinmuxing[] = {
|
||||||
|
// LED
|
||||||
|
{ 2, 19, (IOCON_FUNC0 | IOCON_MODE_INACT) },
|
||||||
|
|
||||||
|
// Button
|
||||||
|
{ 2, 10, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_MODE_PULLUP) },
|
||||||
|
|
||||||
|
// USB1 as Host
|
||||||
|
{ 0, 29, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D+1
|
||||||
|
{ 0, 30, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D-1
|
||||||
|
{ 1, 18, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // UP LED1
|
||||||
|
{ 1, 19, (IOCON_FUNC2 | IOCON_MODE_INACT) }, // PPWR1
|
||||||
|
// {2, 14, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // VBUS1
|
||||||
|
// {2, 15, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // OVRCR1
|
||||||
|
|
||||||
|
// USB2 as Device
|
||||||
|
{ 0, 31, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D+2
|
||||||
|
{ 0, 13, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // UP LED
|
||||||
|
{ 0, 14, (IOCON_FUNC3 | IOCON_MODE_INACT) }, // CONNECT2
|
||||||
|
|
||||||
|
/* VBUS is not connected on this board, so leave the pin at default setting. */
|
||||||
|
/*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,238 @@
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* OnProjectLoad
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Project load routine. Required.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
void OnProjectLoad (void) {
|
||||||
|
Edit.SysVar (VAR_POWER_SAMPLING_SPEED, FREQ_100_KHZ);
|
||||||
|
Project.AddSvdFile ("$(InstallDir)/Config/CPU/Cortex-M4F.svd");
|
||||||
|
Project.AddSvdFile ("../../../../../../../cmsis-svd/data/NXP/LPC408x_7x_v0.7.svd");
|
||||||
|
|
||||||
|
Project.SetDevice ("LPC4088");
|
||||||
|
Project.SetHostIF ("USB", "");
|
||||||
|
Project.SetTargetIF ("SWD");
|
||||||
|
Project.SetTIFSpeed ("50 MHz");
|
||||||
|
Project.SetTraceSource ("Trace Pins");
|
||||||
|
Project.SetTracePortWidth (4);
|
||||||
|
|
||||||
|
// User settings
|
||||||
|
File.Open ("../../../../../../examples/device/cdc_msc/cmake-build-ea4088-quickstart/cdc_msc.elf");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* TargetReset
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Replaces the default target device reset routine. Optional.
|
||||||
|
*
|
||||||
|
* Notes
|
||||||
|
* This example demonstrates the usage when
|
||||||
|
* debugging a RAM program on a Cortex-M target device
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void TargetReset (void) {
|
||||||
|
//
|
||||||
|
// unsigned int SP;
|
||||||
|
// unsigned int PC;
|
||||||
|
// unsigned int VectorTableAddr;
|
||||||
|
//
|
||||||
|
// Exec.Reset();
|
||||||
|
//
|
||||||
|
// VectorTableAddr = Elf.GetBaseAddr();
|
||||||
|
//
|
||||||
|
// if (VectorTableAddr != 0xFFFFFFFF) {
|
||||||
|
//
|
||||||
|
// Util.Log("Resetting Program.");
|
||||||
|
//
|
||||||
|
// SP = Target.ReadU32(VectorTableAddr);
|
||||||
|
// Target.SetReg("SP", SP);
|
||||||
|
//
|
||||||
|
// PC = Target.ReadU32(VectorTableAddr + 4);
|
||||||
|
// Target.SetReg("PC", PC);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* BeforeTargetReset
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void BeforeTargetReset (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AfterTargetReset
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine.
|
||||||
|
* - Sets the PC register to program reset value.
|
||||||
|
* - Sets the SP register to program reset value on Cortex-M.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
void AfterTargetReset (void) {
|
||||||
|
unsigned int SP;
|
||||||
|
unsigned int PC;
|
||||||
|
unsigned int VectorTableAddr;
|
||||||
|
|
||||||
|
VectorTableAddr = Elf.GetBaseAddr();
|
||||||
|
|
||||||
|
if (VectorTableAddr == 0xFFFFFFFF) {
|
||||||
|
Util.Log("Project file error: failed to get program base");
|
||||||
|
} else {
|
||||||
|
SP = Target.ReadU32(VectorTableAddr);
|
||||||
|
Target.SetReg("SP", SP);
|
||||||
|
|
||||||
|
PC = Target.ReadU32(VectorTableAddr + 4);
|
||||||
|
Target.SetReg("PC", PC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* DebugStart
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Replaces the default debug session startup routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void DebugStart (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* TargetConnect
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Replaces the default target IF connection routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void TargetConnect (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* BeforeTargetConnect
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
void BeforeTargetConnect (void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AfterTargetConnect
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void AfterTargetConnect (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* TargetDownload
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Replaces the default program download routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void TargetDownload (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* BeforeTargetDownload
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void BeforeTargetDownload (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AfterTargetDownload
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine.
|
||||||
|
* - Sets the PC register to program reset value.
|
||||||
|
* - Sets the SP register to program reset value on Cortex-M.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
void AfterTargetDownload (void) {
|
||||||
|
unsigned int SP;
|
||||||
|
unsigned int PC;
|
||||||
|
unsigned int VectorTableAddr;
|
||||||
|
|
||||||
|
VectorTableAddr = Elf.GetBaseAddr();
|
||||||
|
|
||||||
|
if (VectorTableAddr == 0xFFFFFFFF) {
|
||||||
|
Util.Log("Project file error: failed to get program base");
|
||||||
|
} else {
|
||||||
|
SP = Target.ReadU32(VectorTableAddr);
|
||||||
|
Target.SetReg("SP", SP);
|
||||||
|
|
||||||
|
PC = Target.ReadU32(VectorTableAddr + 4);
|
||||||
|
Target.SetReg("PC", PC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* BeforeTargetDisconnect
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void BeforeTargetDisconnect (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AfterTargetDisconnect
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void AfterTargetDisconnect (void) {
|
||||||
|
//}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AfterTargetHalt
|
||||||
|
*
|
||||||
|
* Function description
|
||||||
|
* Event handler routine. Optional.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
//void AfterTargetHalt (void) {
|
||||||
|
//}
|
|
@ -31,8 +31,7 @@
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// USB Interrupt Handler
|
// USB Interrupt Handler
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void USB_IRQHandler(void)
|
void USB_IRQHandler(void) {
|
||||||
{
|
|
||||||
#if CFG_TUD_ENABLED
|
#if CFG_TUD_ENABLED
|
||||||
tud_int_handler(0);
|
tud_int_handler(0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -45,63 +44,33 @@ void USB_IRQHandler(void)
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
#define LED_PORT 2
|
|
||||||
#define LED_PIN 19
|
|
||||||
|
|
||||||
#define BUTTON_PORT 2
|
|
||||||
#define BUTTON_PIN 10
|
|
||||||
#define BUTTON_ACTIV_STATE 0
|
|
||||||
|
|
||||||
|
|
||||||
/* System oscillator rate and RTC oscillator rate */
|
|
||||||
const uint32_t OscRateIn = 12000000;
|
|
||||||
const uint32_t RTCOscRateIn = 32768;
|
|
||||||
|
|
||||||
/* Pin muxing configuration */
|
|
||||||
static const PINMUX_GRP_T pinmuxing[] =
|
|
||||||
{
|
|
||||||
// LED
|
|
||||||
{2, 19, (IOCON_FUNC0 | IOCON_MODE_INACT)},
|
|
||||||
|
|
||||||
// Button
|
|
||||||
{2, 10, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_MODE_PULLUP)},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const PINMUX_GRP_T pin_usb_mux[] =
|
|
||||||
{
|
|
||||||
// USB1 as Host
|
|
||||||
{0, 29, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D+1
|
|
||||||
{0, 30, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D-1
|
|
||||||
{1, 18, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // UP LED1
|
|
||||||
{1, 19, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // PPWR1
|
|
||||||
// {2, 14, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // VBUS1
|
|
||||||
// {2, 15, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // OVRCR1
|
|
||||||
|
|
||||||
// USB2 as Device
|
|
||||||
{0, 31, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D+2
|
|
||||||
{0, 13, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // UP LED
|
|
||||||
{0, 14, (IOCON_FUNC3 | IOCON_MODE_INACT)}, // CONNECT2
|
|
||||||
|
|
||||||
/* VBUS is not connected on this board, so leave the pin at default setting. */
|
|
||||||
/*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */
|
|
||||||
};
|
|
||||||
|
|
||||||
// Invoked by startup code
|
// Invoked by startup code
|
||||||
void SystemInit(void)
|
void SystemInit(void) {
|
||||||
{
|
|
||||||
#ifdef __USE_LPCOPEN
|
#ifdef __USE_LPCOPEN
|
||||||
extern void (* const g_pfnVectors[])(void);
|
extern void (*const g_pfnVectors[])(void);
|
||||||
unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08;
|
unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08;
|
||||||
*pSCB_VTOR = (unsigned int) g_pfnVectors;
|
*pSCB_VTOR = (unsigned int) g_pfnVectors;
|
||||||
|
|
||||||
#if __FPU_USED == 1
|
#if __FPU_USED == 1
|
||||||
fpuInit();
|
fpuInit();
|
||||||
#endif
|
#endif
|
||||||
#endif // __USE_LPCOPEN
|
#endif // __USE_LPCOPEN
|
||||||
|
|
||||||
Chip_IOCON_Init(LPC_IOCON);
|
Chip_IOCON_Init(LPC_IOCON);
|
||||||
Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));
|
Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));
|
||||||
|
|
||||||
|
#ifdef TRACE_ETM
|
||||||
|
const PINMUX_GRP_T trace_pinmux[] = {
|
||||||
|
{2, 2, IOCON_FUNC5 | IOCON_FASTSLEW_EN },
|
||||||
|
{2, 3, IOCON_FUNC5 | IOCON_FASTSLEW_EN },
|
||||||
|
{2, 4, IOCON_FUNC5 | IOCON_FASTSLEW_EN },
|
||||||
|
{2, 5, IOCON_FUNC5 | IOCON_FASTSLEW_EN },
|
||||||
|
{2, 6, IOCON_FUNC5 | IOCON_FASTSLEW_EN },
|
||||||
|
};
|
||||||
|
Chip_IOCON_SetPinMuxing(LPC_IOCON, trace_pinmux, sizeof(trace_pinmux) / sizeof(PINMUX_GRP_T));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* CPU clock source starts with IRC */
|
/* CPU clock source starts with IRC */
|
||||||
/* Enable PBOOST for CPU clock over 100MHz */
|
/* Enable PBOOST for CPU clock over 100MHz */
|
||||||
Chip_SYSCTL_EnableBoost();
|
Chip_SYSCTL_EnableBoost();
|
||||||
|
@ -109,8 +78,7 @@ void SystemInit(void)
|
||||||
Chip_SetupXtalClocking();
|
Chip_SetupXtalClocking();
|
||||||
}
|
}
|
||||||
|
|
||||||
void board_init(void)
|
void board_init(void) {
|
||||||
{
|
|
||||||
SystemCoreClockUpdate();
|
SystemCoreClockUpdate();
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_NONE
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
|
@ -132,14 +100,13 @@ void board_init(void)
|
||||||
// UART
|
// UART
|
||||||
|
|
||||||
//------------- USB -------------//
|
//------------- USB -------------//
|
||||||
Chip_IOCON_SetPinMuxing(LPC_IOCON, pin_usb_mux, sizeof(pin_usb_mux) / sizeof(PINMUX_GRP_T));
|
|
||||||
|
|
||||||
// Port1 as Host, Port2: Device
|
// Port1 as Host, Port2: Device
|
||||||
Chip_USB_Init();
|
Chip_USB_Init();
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
USBCLK_DEVCIE = 0x12, // AHB + Device
|
USBCLK_DEVCIE = 0x12, // AHB + Device
|
||||||
USBCLK_HOST = 0x19 , // AHB + OTG + Host
|
USBCLK_HOST = 0x19, // AHB + OTG + Host
|
||||||
USBCLK_ALL = 0x1B // Host + Device + OTG + AHB
|
USBCLK_ALL = 0x1B // Host + Device + OTG + AHB
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -154,40 +121,37 @@ void board_init(void)
|
||||||
// Board porting API
|
// Board porting API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
void board_led_write(bool state)
|
void board_led_write(bool state) {
|
||||||
{
|
|
||||||
Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state);
|
Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t board_button_read(void)
|
uint32_t board_button_read(void) {
|
||||||
{
|
|
||||||
// active low
|
|
||||||
return BUTTON_ACTIV_STATE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);
|
return BUTTON_ACTIV_STATE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
int board_uart_read(uint8_t* buf, int len)
|
int board_uart_read(uint8_t *buf, int len) {
|
||||||
{
|
|
||||||
//return UART_ReceiveByte(BOARD_UART_PORT);
|
//return UART_ReceiveByte(BOARD_UART_PORT);
|
||||||
(void) buf; (void) len;
|
(void) buf;
|
||||||
|
(void) len;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int board_uart_write(void const * buf, int len)
|
int board_uart_write(void const *buf, int len) {
|
||||||
{
|
|
||||||
//UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
|
//UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
|
||||||
(void) buf; (void) len;
|
(void) buf;
|
||||||
|
(void) len;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_NONE
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
volatile uint32_t system_ticks = 0;
|
volatile uint32_t system_ticks = 0;
|
||||||
void SysTick_Handler (void)
|
|
||||||
{
|
void SysTick_Handler(void) {
|
||||||
system_ticks++;
|
system_ticks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t board_millis(void)
|
uint32_t board_millis(void) {
|
||||||
{
|
|
||||||
return system_ticks;
|
return system_ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue