aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLieven Hollevoet <lieven@quicksand.be>2016-03-25 15:05:35 +0100
committerFreddie Chopin <freddie.chopin@gmail.com>2016-05-05 22:55:56 +0100
commit241a92d0f2d2ab57d29a665dd34f0000709c13a7 (patch)
tree9ff5740420b96f8f45b7f3afbae610aad1c27296
parentb28c9d32ca4c6b5b9a4a2bfb7784e2a5c13a7632 (diff)
downloadriscv-openocd-241a92d0f2d2ab57d29a665dd34f0000709c13a7.zip
riscv-openocd-241a92d0f2d2ab57d29a665dd34f0000709c13a7.tar.gz
riscv-openocd-241a92d0f2d2ab57d29a665dd34f0000709c13a7.tar.bz2
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 <hollie@lika.be> Reviewed-on: http://openocd.zylin.com/3389 Tested-by: jenkins Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
-rw-r--r--doc/openocd.texi8
-rw-r--r--src/flash/nor/efm32.c47
2 files changed, 52 insertions, 3 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi
index 7e51c47..ec0e926 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 0c66d4d..ab543d6 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
};