#define STLINK_F_HAS_TRACE (1UL << 0)
#define STLINK_F_HAS_SWD_SET_FREQ (1UL << 1)
#define STLINK_F_HAS_JTAG_SET_FREQ (1UL << 2)
+#define STLINK_F_HAS_MEM_16BIT (1UL << 3)
/* aliases */
#define STLINK_F_HAS_TARGET_VOLT STLINK_F_HAS_TRACE
if (h->version.jtag >= 24)
flags |= STLINK_F_HAS_JTAG_SET_FREQ;
+ /* API to read/write memory at 16 bit from J26 */
+ if (h->version.jtag >= 26)
+ flags |= STLINK_F_HAS_MEM_16BIT;
+
break;
default:
break;
assert(handle != NULL);
- /* only supported by stlink/v2 and for firmware >= 26 */
- if (h->jtag_api == STLINK_JTAG_API_V1 ||
- (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26))
+ if (!(h->version.flags & STLINK_F_HAS_MEM_16BIT))
return ERROR_COMMAND_NOTFOUND;
/* data must be a multiple of 2 and half-word aligned */
assert(handle != NULL);
- /* only supported by stlink/v2 and for firmware >= 26 */
- if (h->jtag_api == STLINK_JTAG_API_V1 ||
- (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26))
+ if (!(h->version.flags & STLINK_F_HAS_MEM_16BIT))
return ERROR_COMMAND_NOTFOUND;
/* data must be a multiple of 2 and half-word aligned */
count *= size;
/* switch to 8 bit if stlink does not support 16 bit memory read */
- if (size == 2 && (h->jtag_api == STLINK_JTAG_API_V1 ||
- (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26)))
+ if (size == 2 && !(h->version.flags & STLINK_F_HAS_MEM_16BIT))
size = 1;
while (count) {
count *= size;
/* switch to 8 bit if stlink does not support 16 bit memory read */
- if (size == 2 && (h->jtag_api == STLINK_JTAG_API_V1 ||
- (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26)))
+ if (size == 2 && !(h->version.flags & STLINK_F_HAS_MEM_16BIT))
size = 1;
while (count) {