target/arm_adi_v5: add helper to get mem_ap spot in configure/cget

This is somehow an extension of existing adiv5_jim_configure(),
but includes the 'address' in the mem_ap.
Rewrite adiv5_jim_configure() using the new helper.

Change-Id: Ia7effeeece044004d459b45126ed4961a98b8568
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5857
Tested-by: jenkins
This commit is contained in:
Antonio Borneo 2020-10-12 00:11:07 +02:00
parent 80a5285ea6
commit 080fab2ecd
2 changed files with 135 additions and 85 deletions

View File

@ -1479,40 +1479,35 @@ int dap_info_command(struct command_invocation *cmd,
enum adiv5_cfg_param { enum adiv5_cfg_param {
CFG_DAP, CFG_DAP,
CFG_AP_NUM CFG_AP_NUM,
CFG_BASEADDR,
}; };
static const Jim_Nvp nvp_config_opts[] = { static const Jim_Nvp nvp_config_opts[] = {
{ .name = "-dap", .value = CFG_DAP }, { .name = "-dap", .value = CFG_DAP },
{ .name = "-ap-num", .value = CFG_AP_NUM }, { .name = "-ap-num", .value = CFG_AP_NUM },
{ .name = "-baseaddr", .value = CFG_BASEADDR },
{ .name = NULL, .value = -1 } { .name = NULL, .value = -1 }
}; };
int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi) static int adiv5_jim_spot_configure(Jim_GetOptInfo *goi,
struct adiv5_dap **dap_p, int *ap_num_p, uint32_t *base_p)
{ {
struct adiv5_private_config *pc; if (!goi->argc)
int e; return JIM_OK;
pc = (struct adiv5_private_config *)target->private_config;
if (pc == NULL) {
pc = calloc(1, sizeof(struct adiv5_private_config));
pc->ap_num = DP_APSEL_INVALID;
target->private_config = pc;
}
target->has_dap = true;
if (goi->argc > 0) {
Jim_Nvp *n;
Jim_SetEmptyResult(goi->interp); Jim_SetEmptyResult(goi->interp);
/* check first if topmost item is for us */ Jim_Nvp *n;
e = Jim_Nvp_name2value_obj(goi->interp, nvp_config_opts, int e = Jim_Nvp_name2value_obj(goi->interp, nvp_config_opts,
goi->argv[0], &n); goi->argv[0], &n);
if (e != JIM_OK) if (e != JIM_OK)
return JIM_CONTINUE; return JIM_CONTINUE;
/* base_p can be NULL, then '-baseaddr' option is treated as unknown */
if (!base_p && n->value == CFG_BASEADDR)
return JIM_CONTINUE;
e = Jim_GetOpt_Obj(goi, NULL); e = Jim_GetOpt_Obj(goi, NULL);
if (e != JIM_OK) if (e != JIM_OK)
return e; return e;
@ -1526,36 +1521,24 @@ int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
if (e != JIM_OK) if (e != JIM_OK)
return e; return e;
dap = dap_instance_by_jim_obj(goi->interp, o_t); dap = dap_instance_by_jim_obj(goi->interp, o_t);
if (dap == NULL) { if (!dap) {
Jim_SetResultString(goi->interp, "DAP name invalid!", -1); Jim_SetResultString(goi->interp, "DAP name invalid!", -1);
return JIM_ERR; return JIM_ERR;
} }
if (pc->dap != NULL && pc->dap != dap) { if (*dap_p && *dap_p != dap) {
Jim_SetResultString(goi->interp, Jim_SetResultString(goi->interp,
"DAP assignment cannot be changed after target was created!", -1); "DAP assignment cannot be changed!", -1);
return JIM_ERR; return JIM_ERR;
} }
if (target->tap_configured) { *dap_p = dap;
Jim_SetResultString(goi->interp,
"-chain-position and -dap configparams are mutually exclusive!", -1);
return JIM_ERR;
}
pc->dap = dap;
target->tap = dap->tap;
target->dap_configured = true;
} else { } else {
if (goi->argc != 0) { if (goi->argc)
Jim_WrongNumArgs(goi->interp, goto err_no_param;
goi->argc, goi->argv, if (!*dap_p) {
"NO PARAMS");
return JIM_ERR;
}
if (pc->dap == NULL) {
Jim_SetResultString(goi->interp, "DAP not configured", -1); Jim_SetResultString(goi->interp, "DAP not configured", -1);
return JIM_ERR; return JIM_ERR;
} }
Jim_SetResultString(goi->interp, adiv5_dap_name(pc->dap), -1); Jim_SetResultString(goi->interp, adiv5_dap_name(*dap_p), -1);
} }
break; break;
@ -1569,23 +1552,67 @@ int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
Jim_SetResultString(goi->interp, "Invalid AP number!", -1); Jim_SetResultString(goi->interp, "Invalid AP number!", -1);
return JIM_ERR; return JIM_ERR;
} }
pc->ap_num = ap_num; *ap_num_p = ap_num;
} else { } else {
if (goi->argc != 0) { if (goi->argc)
Jim_WrongNumArgs(goi->interp, goto err_no_param;
goi->argc, goi->argv, if (*ap_num_p == DP_APSEL_INVALID) {
"NO PARAMS");
return JIM_ERR;
}
if (pc->ap_num == DP_APSEL_INVALID) {
Jim_SetResultString(goi->interp, "AP number not configured", -1); Jim_SetResultString(goi->interp, "AP number not configured", -1);
return JIM_ERR; return JIM_ERR;
} }
Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, pc->ap_num)); Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, *ap_num_p));
} }
break; break;
case CFG_BASEADDR:
if (goi->isconfigure) {
jim_wide base;
e = Jim_GetOpt_Wide(goi, &base);
if (e != JIM_OK)
return e;
*base_p = (uint32_t)base;
} else {
if (goi->argc)
goto err_no_param;
Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, *base_p));
} }
break;
};
return JIM_OK;
err_no_param:
Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
return JIM_ERR;
}
int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
{
struct adiv5_private_config *pc;
int e;
pc = (struct adiv5_private_config *)target->private_config;
if (pc == NULL) {
pc = calloc(1, sizeof(struct adiv5_private_config));
pc->ap_num = DP_APSEL_INVALID;
target->private_config = pc;
}
target->has_dap = true;
e = adiv5_jim_spot_configure(goi, &pc->dap, &pc->ap_num, NULL);
if (e != JIM_OK)
return e;
if (pc->dap && !target->dap_configured) {
if (target->tap_configured) {
pc->dap = NULL;
Jim_SetResultString(goi->interp,
"-chain-position and -dap configparams are mutually exclusive!", -1);
return JIM_ERR;
}
target->tap = pc->dap->tap;
target->dap_configured = true;
} }
return JIM_OK; return JIM_OK;
@ -1602,6 +1629,19 @@ int adiv5_verify_config(struct adiv5_private_config *pc)
return ERROR_OK; return ERROR_OK;
} }
int adiv5_jim_mem_ap_spot_configure(struct adiv5_mem_ap_spot *cfg,
Jim_GetOptInfo *goi)
{
return adiv5_jim_spot_configure(goi, &cfg->dap, &cfg->ap_num, &cfg->base);
}
int adiv5_mem_ap_spot_init(struct adiv5_mem_ap_spot *p)
{
p->dap = NULL;
p->ap_num = DP_APSEL_INVALID;
p->base = 0;
return ERROR_OK;
}
COMMAND_HANDLER(handle_dap_info_command) COMMAND_HANDLER(handle_dap_info_command)
{ {

View File

@ -601,4 +601,14 @@ struct adiv5_private_config {
extern int adiv5_verify_config(struct adiv5_private_config *pc); extern int adiv5_verify_config(struct adiv5_private_config *pc);
extern int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi); extern int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi);
struct adiv5_mem_ap_spot {
struct adiv5_dap *dap;
int ap_num;
uint32_t base;
};
extern int adiv5_mem_ap_spot_init(struct adiv5_mem_ap_spot *p);
extern int adiv5_jim_mem_ap_spot_configure(struct adiv5_mem_ap_spot *cfg,
Jim_GetOptInfo *goi);
#endif /* OPENOCD_TARGET_ARM_ADI_V5_H */ #endif /* OPENOCD_TARGET_ARM_ADI_V5_H */