From 241a92d0f2d2ab57d29a665dd34f0000709c13a7 Mon Sep 17 00:00:00 2001 From: Lieven Hollevoet Date: Fri, 25 Mar 2016 15:05:35 +0100 Subject: [PATCH] Support for debug interface lock of EFM32 controllers The capability to lock the debug interface on EFM32 controllers was lacking in OpenOCD. After receiving some pointers by zapb_ and PaulFertser on IRC (thanks guys!) I have added this capability. This works by writing the required bits in the debug lock word to '0'. Note: there is currently no way to re-enable the debug interface from OpenOCD as doing this requires specific pin wiggling that is currently not implemented yet. However: having the capability to lock the debug interface is useful when building a volume programming jig. You can flash the program code, verify and then lock the debug interface so that the device cannot be read when it is deployed in the field. Change-Id: If2d562dfdb4b95519785a4395f755d9ae3d0cf12 Signed-off-by: Lieven Hollevoet Reviewed-on: http://openocd.zylin.com/3389 Tested-by: jenkins Reviewed-by: Freddie Chopin --- doc/openocd.texi | 8 ++++++++ src/flash/nor/efm32.c | 47 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/doc/openocd.texi b/doc/openocd.texi index 7e51c470ad..ec0e926895 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -5175,6 +5175,14 @@ autoconfigures itself. @example flash bank $_FLASHNAME efm32 0 0 0 0 $_TARGETNAME @end example +A special feature of efm32 controllers is that it is possible to completely disable the +debug interface by writing the correct values to the 'Debug Lock Word'. OpenOCD supports +this via the following command: +@example +efm32 debuglock num +@end example +The @var{num} parameter is a value shown by @command{flash banks}. +Note that in order for this command to take effect, the target needs to be reset. @emph{The current implementation is incomplete. Unprotecting flash pages is not supported.} @end deffn diff --git a/src/flash/nor/efm32.c b/src/flash/nor/efm32.c index 0c66d4db3d..ab543d6111 100644 --- a/src/flash/nor/efm32.c +++ b/src/flash/nor/efm32.c @@ -25,9 +25,7 @@ * 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, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + * along with this program. * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -997,7 +995,50 @@ static int get_efm32x_info(struct flash_bank *bank, char *buf, int buf_size) return efm32x_decode_info(&info, buf, buf_size); } +COMMAND_HANDLER(efm32x_handle_debuglock_command) +{ + struct target *target = NULL; + + if (CMD_ARGC < 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); + if (ERROR_OK != retval) + return retval; + + struct efm32x_flash_bank *efm32x_info = bank->driver_priv; + + target = bank->target; + + if (target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); + return ERROR_TARGET_NOT_HALTED; + } + + uint32_t *ptr; + ptr = efm32x_info->lb_page + 127; + *ptr = 0; + + retval = efm32x_write_lock_data(bank); + if (ERROR_OK != retval) { + LOG_ERROR("Failed to write LB page"); + return retval; + } + + command_print(CMD_CTX, "efm32x debug interface locked, reset the device to apply"); + + return ERROR_OK; +} + static const struct command_registration efm32x_exec_command_handlers[] = { + { + .name = "debuglock", + .handler = efm32x_handle_debuglock_command, + .mode = COMMAND_EXEC, + .usage = "bank_id", + .help = "Lock the debug interface of the device.", + }, COMMAND_REGISTRATION_DONE }; -- 2.30.2