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>
This commit is contained in:
Lieven Hollevoet 2016-03-25 15:05:35 +01:00 committed by Freddie Chopin
parent b28c9d32ca
commit 241a92d0f2
2 changed files with 52 additions and 3 deletions

View File

@ -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

View File

@ -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
};