int adiv5_swdp_scan(void) { uint8_t ack; target_list_free(); ADIv5_DP_t *dp = (void*)calloc(1, sizeof(*dp)); swdptap_init(); /* Read the SW-DP IDCODE register to syncronise */ /* This could be done with adiv_swdp_low_access(), but this doesn't * allow the ack to be checked here. */ swdptap_seq_out(0xA5, 8); ack = swdptap_seq_in(3); if((ack != SWDP_ACK_OK) || swdptap_seq_in_parity(&dp->idcode, 32)) { DEBUG("\n"); morse("NO TARGETS.", 1); free(dp); return -1; } dp->dp_read = adiv5_swdp_read; dp->error = adiv5_swdp_error; dp->low_access = adiv5_swdp_low_access; dp->abort = adiv5_swdp_abort; adiv5_swdp_error(dp); adiv5_dp_init(dp); if(!target_list) morse("NO TARGETS.", 1); else morse(NULL, 0); return target_list?1:0; }
uint32_t Swdp::Up (char *data, uint32_t len) { if (!len) { return swdptap_init(); } memcpy (&UxD, data, len); uint8_t res = swdptap_low_access (UxD.APnDP, UxD.RnW, UxD.adr, & UxD.val); UxD.RnW = res; memcpy (data, &UxD, len); return len; }