Configuring Cortex M0 core in LPC43xx

Hi everyone.

I’m using OpenOCD with BusPirate as JTAG interface to program and debug LPC4357 micro-controller. This chip has a Cortex M4 core, and a secondary Cortex M0 core. I have successfully used this configuration with M4 core (with M0 target creation disabled), but M0 core gives me troubles.

This is my OpenOCD configuration:

source [find target/swj-dp.tcl]

adapter_khz 1000

if { [info exists CHIPNAME] } {
    set _CHIPNAME $CHIPNAME
} else {
    set _CHIPNAME lpc43xx
}

if { [info exists M4_JTAG_TAPID] } {
    set _M4_JTAG_TAPID $M4_JTAG_TAPID
} else {
    set _M4_JTAG_TAPID 0x4ba00477
}

if { [info exists M4_SWD_TAPID] } {
    set _M4_SWD_TAPID $M4_SWD_TAPID
} else {
    set _M4_SWD_TAPID 0x2ba01477
}

if { [using_jtag] } {
    set _M4_TAPID $_M4_JTAG_TAPID
} {
    set _M4_TAPID $_M4_SWD_TAPID
}

if { [info exists M0_JTAG_TAPID] } {
    set _M0_JTAG_TAPID $M0_JTAG_TAPID
} else {
    set _M0_JTAG_TAPID 0x0ba01477
}

swj_newdap $_CHIPNAME m4 -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_M4_JTAG_TAPID
swj_newdap $_CHIPNAME m0 -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_M0_JTAG_TAPID

target create $_CHIPNAME.m0 cortex_m -chain-position $_CHIPNAME.m0
target create $_CHIPNAME.m4 cortex_m -chain-position $_CHIPNAME.m4

set _WORKAREASIZE 0x2000
$_CHIPNAME.m4 configure -work-area-phys 0x10000000 -work-area-size $_WORKAREASIZE

set _FLASHNAME $_CHIPNAME.flash
flash bank flashA lpc2000 0x1a000000 0x80000 0 0 $_CHIPNAME.m4 lpc4300 107000 calc_checksum
flash bank flashB lpc2000 0x1b000000 0x80000 0 0 $_CHIPNAME.m4 lpc4300 107000 calc_checksum

cortex_m reset_config vectreset

On powering up and starting OpenOCD, the cores are reported correctly:

TargetName Type Endian TapName State


0 lpc43xx.m0 cortex_m little lpc43xx.m0 reset

1* lpc43xx.m4 cortex_m little lpc43xx.m4 halted

Trying to use GDB’s load command to write something to internal flash will give following error:

Error: timed out while waiting for target halted

TARGET: lpc43xx.m0 - Not halted

in procedure ‘reset’

in procedure ‘ocd_bouncer’

in procedure ‘reset’

Error: Target not halted

Error: failed erasing sectors 0 to 3

Error: flash_erase returned -304

target state: halted

target halted due to debug-request, current mode: Thread

xPSR: 0x41000000 pc: 0x10402d5e msp: 0x10089c70, semihosting

Info : Halt timed out, wake up GDB.

Now I suspect the problem is that OpenOCD thinks it has to halt the M0 core, and that core is not responding to halt request. The reason for this is that M0 core is not even running and cannot be halted. Its reset and clock signals are controlled by M4 core and they are enabled only later in boot sequence.

Is there a way to tell OpenOCD that M0 core is not under it’s control until after it’s enabled by M4 firmware?

BTW if I load everything into RAM, everything behaves more or less correctly and I’m able to debug both cores independently from two GDB instances connected to 3333 and 3334 ports.

I have similar problem. Are there any solutions for this dual core processors?