Merge commit '1e10b96b03da71b1a101c108ca9511c8a613666e' into sam-update
This commit is contained in:
commit
21989d4142
@ -204,7 +204,11 @@ static bool cmd_jtag_scan(target *t, int argc, char **argv)
|
|||||||
int devs = -1;
|
int devs = -1;
|
||||||
volatile struct exception e;
|
volatile struct exception e;
|
||||||
TRY_CATCH (e, EXCEPTION_ALL) {
|
TRY_CATCH (e, EXCEPTION_ALL) {
|
||||||
|
#if PC_HOSTED == 1
|
||||||
|
devs = platform_jtag_scan(argc > 1 ? irlens : NULL);
|
||||||
|
#else
|
||||||
devs = jtag_scan(argc > 1 ? irlens : NULL);
|
devs = jtag_scan(argc > 1 ? irlens : NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case EXCEPTION_TIMEOUT:
|
case EXCEPTION_TIMEOUT:
|
||||||
@ -238,8 +242,12 @@ bool cmd_swdp_scan(target *t, int argc, char **argv)
|
|||||||
int devs = -1;
|
int devs = -1;
|
||||||
volatile struct exception e;
|
volatile struct exception e;
|
||||||
TRY_CATCH (e, EXCEPTION_ALL) {
|
TRY_CATCH (e, EXCEPTION_ALL) {
|
||||||
|
#if PC_HOSTED == 1
|
||||||
|
devs = platform_adiv5_swdp_scan();
|
||||||
|
#else
|
||||||
devs = adiv5_swdp_scan();
|
devs = adiv5_swdp_scan();
|
||||||
}
|
#endif
|
||||||
|
}
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case EXCEPTION_TIMEOUT:
|
case EXCEPTION_TIMEOUT:
|
||||||
gdb_outf("Timeout during scan. Is target stuck in WFI?\n");
|
gdb_outf("Timeout during scan. Is target stuck in WFI?\n");
|
||||||
|
@ -34,6 +34,13 @@ typedef struct target_s target;
|
|||||||
typedef uint32_t target_addr;
|
typedef uint32_t target_addr;
|
||||||
struct target_controller;
|
struct target_controller;
|
||||||
|
|
||||||
|
#if defined(PC_HOSTED)
|
||||||
|
int platform_adiv5_swdp_scan(void);
|
||||||
|
int platform_jtag_scan(const uint8_t *lrlens);
|
||||||
|
#endif
|
||||||
|
int adiv5_swdp_scan(void);
|
||||||
|
int jtag_scan(const uint8_t *lrlens);
|
||||||
|
|
||||||
int adiv5_swdp_scan(void);
|
int adiv5_swdp_scan(void);
|
||||||
int jtag_scan(const uint8_t *lrlens);
|
int jtag_scan(const uint8_t *lrlens);
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "gdb_if.h"
|
#include "gdb_if.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
#include "target.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -180,6 +181,16 @@ cable_desc_t cable_desc[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int platform_adiv5_swdp_scan(void)
|
||||||
|
{
|
||||||
|
return adiv5_swdp_scan();
|
||||||
|
}
|
||||||
|
|
||||||
|
int platform_jtag_scan(const uint8_t *lrlens)
|
||||||
|
{
|
||||||
|
return jtag_scan(lrlens);
|
||||||
|
}
|
||||||
|
|
||||||
void platform_init(int argc, char **argv)
|
void platform_init(int argc, char **argv)
|
||||||
{
|
{
|
||||||
BMP_CL_OPTIONS_t cl_opts = {0};
|
BMP_CL_OPTIONS_t cl_opts = {0};
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
|
#include "target.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
@ -33,6 +34,16 @@
|
|||||||
#include "cl_utils.h"
|
#include "cl_utils.h"
|
||||||
static BMP_CL_OPTIONS_t cl_opts; /* Portable way to nullify the struct*/
|
static BMP_CL_OPTIONS_t cl_opts; /* Portable way to nullify the struct*/
|
||||||
|
|
||||||
|
int platform_adiv5_swdp_scan(void)
|
||||||
|
{
|
||||||
|
return adiv5_swdp_scan();
|
||||||
|
}
|
||||||
|
|
||||||
|
int platform_jtag_scan(const uint8_t *lrlens)
|
||||||
|
{
|
||||||
|
return jtag_scan(lrlens);
|
||||||
|
}
|
||||||
|
|
||||||
void platform_init(int argc, char **argv)
|
void platform_init(int argc, char **argv)
|
||||||
{
|
{
|
||||||
cl_opts.opt_idstring = "Blackmagic Debug Probe Remote";
|
cl_opts.opt_idstring = "Blackmagic Debug Probe Remote";
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1];
|
struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1];
|
||||||
int jtag_dev_count;
|
int jtag_dev_count;
|
||||||
|
|
||||||
int jtag_scan(const uint8_t *irlens)
|
int jtag_scan_stlinkv2(const uint8_t *irlens)
|
||||||
{
|
{
|
||||||
uint32_t idcodes[JTAG_MAX_DEVS+1];
|
uint32_t idcodes[JTAG_MAX_DEVS+1];
|
||||||
(void) *irlens;
|
(void) *irlens;
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include "gdb_if.h"
|
#include "gdb_if.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
#include "target.h"
|
||||||
|
#include "target_internal.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -39,6 +41,34 @@ const char *platform_target_voltage(void)
|
|||||||
return stlink_target_voltage();
|
return stlink_target_voltage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int adiv5_swdp_scan_stlinkv2(void)
|
||||||
|
{
|
||||||
|
target_list_free();
|
||||||
|
ADIv5_DP_t *dp = (void*)calloc(1, sizeof(*dp));
|
||||||
|
if (stlink_enter_debug_swd())
|
||||||
|
return 0;
|
||||||
|
dp->idcode = stlink_read_coreid();
|
||||||
|
dp->dp_read = stlink_dp_read;
|
||||||
|
dp->error = stlink_dp_error;
|
||||||
|
dp->low_access = stlink_dp_low_access;
|
||||||
|
dp->abort = stlink_dp_abort;
|
||||||
|
|
||||||
|
stlink_dp_error(dp);
|
||||||
|
adiv5_dp_init(dp);
|
||||||
|
|
||||||
|
return target_list?1:0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int platform_adiv5_swdp_scan(void)
|
||||||
|
{
|
||||||
|
return adiv5_swdp_scan_stlinkv2();
|
||||||
|
}
|
||||||
|
|
||||||
|
int platform_jtag_scan(const uint8_t *lrlens)
|
||||||
|
{
|
||||||
|
return jtag_scan_stlinkv2(lrlens);
|
||||||
|
}
|
||||||
|
|
||||||
void platform_init(int argc, char **argv)
|
void platform_init(int argc, char **argv)
|
||||||
{
|
{
|
||||||
stlink_init(argc, argv);
|
stlink_init(argc, argv);
|
||||||
|
@ -44,5 +44,5 @@ void stlink_check_detach(int state);
|
|||||||
void platform_buffer_flush(void);
|
void platform_buffer_flush(void);
|
||||||
int platform_buffer_write(const uint8_t *data, int size);
|
int platform_buffer_write(const uint8_t *data, int size);
|
||||||
int platform_buffer_read(uint8_t *data, int size);
|
int platform_buffer_read(uint8_t *data, int size);
|
||||||
|
int jtag_scan_stlinkv2(const uint8_t *irlens);
|
||||||
#endif
|
#endif
|
||||||
|
@ -275,9 +275,9 @@ int cl_execute(BMP_CL_OPTIONS_t *opt)
|
|||||||
printf("Running in Test Mode\n");
|
printf("Running in Test Mode\n");
|
||||||
printf("Target voltage: %s Volt\n", platform_target_voltage());
|
printf("Target voltage: %s Volt\n", platform_target_voltage());
|
||||||
if (opt->opt_usejtag) {
|
if (opt->opt_usejtag) {
|
||||||
num_targets = jtag_scan(NULL);
|
num_targets = platform_jtag_scan(NULL);
|
||||||
} else {
|
} else {
|
||||||
num_targets = adiv5_swdp_scan();
|
num_targets = platform_adiv5_swdp_scan();
|
||||||
}
|
}
|
||||||
if (!num_targets) {
|
if (!num_targets) {
|
||||||
DEBUG("No target found\n");
|
DEBUG("No target found\n");
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
#include "general.h"
|
|
||||||
#include "jtagtap.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
jtagtap_init(void)
|
|
||||||
{
|
|
||||||
TMS_SET_MODE();
|
|
||||||
|
|
||||||
for(int i = 0; i <= 50; i++) jtagtap_next(1,0);
|
|
||||||
jtagtap_tms_seq(0xE73C, 16);
|
|
||||||
jtagtap_soft_reset();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
jtagtap_reset(void)
|
|
||||||
{
|
|
||||||
#ifdef TRST_PORT
|
|
||||||
volatile int i;
|
|
||||||
gpio_clear(TRST_PORT, TRST_PIN);
|
|
||||||
for(i = 0; i < 10000; i++) asm("nop");
|
|
||||||
gpio_set(TRST_PORT, TRST_PIN);
|
|
||||||
#endif
|
|
||||||
jtagtap_soft_reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t
|
|
||||||
jtagtap_next(const uint8_t dTMS, const uint8_t dTDI)
|
|
||||||
{
|
|
||||||
uint16_t ret;
|
|
||||||
|
|
||||||
gpio_set_val(TMS_PORT, TMS_PIN, dTMS);
|
|
||||||
gpio_set_val(TDI_PORT, TDI_PIN, dTDI);
|
|
||||||
gpio_set(TCK_PORT, TCK_PIN);
|
|
||||||
ret = gpio_get(TDO_PORT, TDO_PIN);
|
|
||||||
gpio_clear(TCK_PORT, TCK_PIN);
|
|
||||||
|
|
||||||
DEBUG("jtagtap_next(TMS = %d, TDI = %d) = %d\n", dTMS, dTDI, ret);
|
|
||||||
|
|
||||||
return ret != 0;
|
|
||||||
}
|
|
||||||
|
|
@ -317,9 +317,11 @@ static bool adiv5_component_probe(ADIv5_AP_t *ap, uint32_t addr, int recursion,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (int i = 0; i < 960; i++) {
|
for (int i = 0; i < 960; i++) {
|
||||||
|
adiv5_dp_error(ap->dp);
|
||||||
uint32_t entry = adiv5_mem_read32(ap, addr + i*4);
|
uint32_t entry = adiv5_mem_read32(ap, addr + i*4);
|
||||||
if (adiv5_dp_error(ap->dp)) {
|
if (adiv5_dp_error(ap->dp)) {
|
||||||
DEBUG("%sFault reading ROM table entry\n", indent);
|
DEBUG("%sFault reading ROM table entry %d\n", indent, i);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry == 0)
|
if (entry == 0)
|
||||||
@ -518,6 +520,7 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
|
|||||||
if (ap->base == last_base) {
|
if (ap->base == last_base) {
|
||||||
DEBUG("AP %d: Duplicate base\n", i);
|
DEBUG("AP %d: Duplicate base\n", i);
|
||||||
adiv5_ap_cleanup(i);
|
adiv5_ap_cleanup(i);
|
||||||
|
free(ap);
|
||||||
/* FIXME: Should we expect valid APs behind duplicate ones? */
|
/* FIXME: Should we expect valid APs behind duplicate ones? */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -586,7 +589,7 @@ static void ap_mem_access_setup(ADIv5_AP_t *ap, uint32_t addr, enum align align)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Extract read data from data lane based on align and src address */
|
/* Extract read data from data lane based on align and src address */
|
||||||
static void * extract(void *dest, uint32_t src, uint32_t val, enum align align)
|
void * extract(void *dest, uint32_t src, uint32_t val, enum align align)
|
||||||
{
|
{
|
||||||
switch (align) {
|
switch (align) {
|
||||||
case ALIGN_BYTE:
|
case ALIGN_BYTE:
|
||||||
|
@ -197,4 +197,5 @@ void adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len)
|
|||||||
void adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src,
|
void adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src,
|
||||||
size_t len, enum align align);
|
size_t len, enum align align);
|
||||||
uint64_t adiv5_ap_read_pidr(ADIv5_AP_t *ap, uint32_t addr);
|
uint64_t adiv5_ap_read_pidr(ADIv5_AP_t *ap, uint32_t addr);
|
||||||
|
void * extract(void *dest, uint32_t src, uint32_t val, enum align align);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user