stlink: fix open AP for v2j37 and v3j7

The new stlink firmware requires opening the AP before issuing
any operation.
In the current code we have a 'questionable' check about the core
model to set the TAR autoincrement, that is issued without opening
the AP, thus causing a STLINK_BAD_AP_ERROR.

Modify the AP open API to handle this case and open AP#0 before
the memory access to check the core model.

Change-Id: I576955b5094bd41d63ff1fbad7b4fd9433253321
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reported-by: Andreas Bolsch <hyphen0break@gmail.com>
Reviewed-on: http://openocd.zylin.com/5691
Tested-by: jenkins
Reviewed-by: Andreas Bolsch <hyphen0break@gmail.com>
This commit is contained in:
Antonio Borneo 2020-05-21 13:24:32 +02:00
parent b342c67f77
commit 7456e6bac5
1 changed files with 11 additions and 4 deletions

View File

@ -361,6 +361,7 @@ static int stlink_swim_status(void *handle);
void stlink_dump_speed_map(const struct speed_map *map, unsigned int map_size);
static int stlink_get_com_freq(void *handle, bool is_jtag, struct speed_map *map);
static int stlink_speed(void *handle, int khz, bool query);
static int stlink_usb_open_ap(void *handle, unsigned short apsel);
/** */
static unsigned int stlink_usb_block(void *handle)
@ -2972,6 +2973,7 @@ static int stlink_usb_open(struct hl_interface_param_s *param, enum stlink_mode
h->max_mem_packet = (1 << 10);
uint8_t buffer[4];
stlink_usb_open_ap(h, 0);
err = stlink_usb_read_mem32(h, CPUID, 4, buffer);
if (err == ERROR_OK) {
uint32_t cpuid = le_to_h_u32(buffer);
@ -3204,13 +3206,13 @@ static int stlink_dap_get_and_clear_error(void)
return retval;
}
/** */
static int stlink_dap_open_ap(unsigned short apsel)
static int stlink_usb_open_ap(void *handle, unsigned short apsel)
{
struct stlink_usb_handle_s *h = handle;
int retval;
/* nothing to do on old versions */
if (!(stlink_dap_handle->version.flags & STLINK_F_HAS_AP_INIT))
if (!(h->version.flags & STLINK_F_HAS_AP_INIT))
return ERROR_OK;
if (apsel > DP_APSEL_MAX)
@ -3219,7 +3221,7 @@ static int stlink_dap_open_ap(unsigned short apsel)
if (test_bit(apsel, opened_ap))
return ERROR_OK;
retval = stlink_usb_init_access_port(stlink_dap_handle, apsel);
retval = stlink_usb_init_access_port(h, apsel);
if (retval != ERROR_OK)
return retval;
@ -3228,6 +3230,11 @@ static int stlink_dap_open_ap(unsigned short apsel)
return ERROR_OK;
}
static int stlink_dap_open_ap(unsigned short apsel)
{
return stlink_usb_open_ap(stlink_dap_handle, apsel);
}
/** */
static int stlink_dap_closeall_ap(void)
{