ADIv5 share DAP command support
Get rid of needless and undesirable code duplication for all the DAP commands (resolving a FIXME) ... there's no need for coreas to have private copies of that stuff. Stick a pointer to the DAP in "struct arm", letting common code get to it. Also rename the "swjdp_info" symbol; just call it "dap". This is an overall code shrink. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
@@ -739,160 +739,12 @@ int armv7m_maybe_skip_bkpt_inst(struct target *target, bool *inst_found)
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Only stuff below this line should need to verify that its target
|
||||
* is an ARMv7-M node.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Return the debug ap baseaddress in hexadecimal;
|
||||
* no extra output to simplify script processing
|
||||
*/
|
||||
COMMAND_HANDLER(handle_dap_baseaddr_command)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||
struct adiv5_dap *swjdp = &armv7m->swjdp_info;
|
||||
|
||||
if (!is_armv7m(armv7m)) {
|
||||
command_print(CMD_CTX, "current target isn't an ARM7-M");
|
||||
return ERROR_TARGET_INVALID;
|
||||
}
|
||||
|
||||
return CALL_COMMAND_HANDLER(dap_baseaddr_command, swjdp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the debug ap id in hexadecimal;
|
||||
* no extra output to simplify script processing
|
||||
*/
|
||||
COMMAND_HANDLER(handle_dap_apid_command)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||
struct adiv5_dap *swjdp = &armv7m->swjdp_info;
|
||||
|
||||
if (!is_armv7m(armv7m)) {
|
||||
command_print(CMD_CTX, "current target isn't an ARM7-M");
|
||||
return ERROR_TARGET_INVALID;
|
||||
}
|
||||
|
||||
return CALL_COMMAND_HANDLER(dap_apid_command, swjdp);
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(handle_dap_apsel_command)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||
struct adiv5_dap *swjdp = &armv7m->swjdp_info;
|
||||
|
||||
if (!is_armv7m(armv7m)) {
|
||||
command_print(CMD_CTX, "current target isn't an ARM7-M");
|
||||
return ERROR_TARGET_INVALID;
|
||||
}
|
||||
|
||||
return CALL_COMMAND_HANDLER(dap_apsel_command, swjdp);
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(handle_dap_memaccess_command)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||
struct adiv5_dap *swjdp = &armv7m->swjdp_info;
|
||||
|
||||
if (!is_armv7m(armv7m)) {
|
||||
command_print(CMD_CTX, "current target isn't an ARM7-M");
|
||||
return ERROR_TARGET_INVALID;
|
||||
}
|
||||
|
||||
return CALL_COMMAND_HANDLER(dap_memaccess_command, swjdp);
|
||||
}
|
||||
|
||||
|
||||
COMMAND_HANDLER(handle_dap_info_command)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||
struct adiv5_dap *swjdp = &armv7m->swjdp_info;
|
||||
uint32_t apsel;
|
||||
|
||||
if (!is_armv7m(armv7m)) {
|
||||
command_print(CMD_CTX, "current target isn't an ARM7-M");
|
||||
return ERROR_TARGET_INVALID;
|
||||
}
|
||||
|
||||
switch (CMD_ARGC) {
|
||||
case 0:
|
||||
apsel = swjdp->apsel;
|
||||
break;
|
||||
case 1:
|
||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||
break;
|
||||
default:
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
}
|
||||
|
||||
return dap_info_command(CMD_CTX, swjdp, apsel);
|
||||
}
|
||||
|
||||
/* FIXME this table should be part of generic DAP support, and
|
||||
* be shared by the ARMv7-A/R and ARMv7-M support ...
|
||||
*/
|
||||
static const struct command_registration armv7m_exec_command_handlers[] = {
|
||||
{
|
||||
.name = "info",
|
||||
.handler = handle_dap_info_command,
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "display ROM table for MEM-AP "
|
||||
"(default currently selected AP)",
|
||||
.usage = "[ap_num]",
|
||||
},
|
||||
{
|
||||
.name = "apsel",
|
||||
.handler = handle_dap_apsel_command,
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "Set the currently selected AP (default 0) "
|
||||
"and display the result",
|
||||
.usage = "[ap_num]",
|
||||
},
|
||||
{
|
||||
.name = "apid",
|
||||
.handler = handle_dap_apid_command,
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "return ID register from AP "
|
||||
"(default currently selected AP)",
|
||||
.usage = "[ap_num]",
|
||||
},
|
||||
{
|
||||
.name = "baseaddr",
|
||||
.handler = handle_dap_baseaddr_command,
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "return debug base address from MEM-AP "
|
||||
"(default currently selected AP)",
|
||||
.usage = "[ap_num]",
|
||||
},
|
||||
{
|
||||
.name = "memaccess",
|
||||
.handler = handle_dap_memaccess_command,
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "set/get number of extra tck for MEM-AP memory "
|
||||
"bus access [0-255]",
|
||||
.usage = "[cycles]",
|
||||
},
|
||||
COMMAND_REGISTRATION_DONE
|
||||
};
|
||||
const struct command_registration armv7m_command_handlers[] = {
|
||||
{
|
||||
.chain = arm_command_handlers,
|
||||
},
|
||||
{
|
||||
.name = "dap",
|
||||
.mode = COMMAND_EXEC,
|
||||
.help = "Cortex DAP command group",
|
||||
.chain = armv7m_exec_command_handlers,
|
||||
.chain = dap_command_handlers,
|
||||
},
|
||||
COMMAND_REGISTRATION_DONE
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user