X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fstlink_usb.c;h=5e0411ff609dc3c2d4949ef1cbacdd9cc21f8823;hp=a0ee44c44ac7cc369bc3479f56e64dc1d3cabb21;hb=861730f73230d764e0309422556bc5f7ab33e94f;hpb=ab9221f80592bd99c017c3689ae3b805c01a0743 diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c index a0ee44c44a..5e0411ff60 100644 --- a/src/jtag/drivers/stlink_usb.c +++ b/src/jtag/drivers/stlink_usb.c @@ -278,6 +278,9 @@ enum stlink_mode { * version of stlink */ #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 @@ -674,6 +677,18 @@ static int stlink_usb_version(void *handle) if (h->version.jtag >= 13) flags |= STLINK_F_HAS_TRACE; + /* API to set SWD frequency from J22 */ + if (h->version.jtag >= 22) + flags |= STLINK_F_HAS_SWD_SET_FREQ; + + /* API to set JTAG frequency from J24 */ + 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; @@ -729,8 +744,7 @@ static int stlink_usb_set_swdclk(void *handle, uint16_t clk_divisor) assert(handle != NULL); - /* only supported by stlink/v2 and for firmware >= 22 */ - if (h->version.stlink == 1 || h->version.jtag < 22) + if (!(h->version.flags & STLINK_F_HAS_SWD_SET_FREQ)) return ERROR_COMMAND_NOTFOUND; stlink_usb_init_buffer(handle, h->rx_ep, 2); @@ -754,8 +768,7 @@ static int stlink_usb_set_jtagclk(void *handle, uint16_t clk_divisor) assert(handle != NULL); - /* only supported by stlink/v2 and for firmware >= 24 */ - if (h->version.stlink == 1 || h->version.jtag < 24) + if (!(h->version.flags & STLINK_F_HAS_JTAG_SET_FREQ)) return ERROR_COMMAND_NOTFOUND; stlink_usb_init_buffer(handle, h->rx_ep, 2); @@ -1738,9 +1751,7 @@ static int stlink_usb_read_mem16(void *handle, uint32_t addr, uint16_t len, 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 */ @@ -1777,9 +1788,7 @@ static int stlink_usb_write_mem16(void *handle, uint32_t addr, uint16_t len, 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 */ @@ -1891,8 +1900,7 @@ static int stlink_usb_read_mem(void *handle, uint32_t addr, uint32_t size, 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) { @@ -1977,8 +1985,7 @@ static int stlink_usb_write_mem(void *handle, uint32_t addr, uint32_t size, 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) { @@ -2115,8 +2122,8 @@ static int stlink_speed_swd(void *handle, int khz, bool query) int speed_index; struct stlink_usb_handle_s *h = handle; - /* only supported by stlink/v2 and for firmware >= 22 */ - if (h->version.stlink == 1 || h->version.jtag < 22) + /* old firmware cannot change it */ + if (!(h->version.flags & STLINK_F_HAS_SWD_SET_FREQ)) return khz; speed_index = stlink_match_speed_map(stlink_khz_to_speed_map_swd, @@ -2138,8 +2145,8 @@ static int stlink_speed_jtag(void *handle, int khz, bool query) int speed_index; struct stlink_usb_handle_s *h = handle; - /* only supported by stlink/v2 and for firmware >= 24 */ - if (h->version.stlink == 1 || h->version.jtag < 24) + /* old firmware cannot change it */ + if (!(h->version.flags & STLINK_F_HAS_JTAG_SET_FREQ)) return khz; speed_index = stlink_match_speed_map(stlink_khz_to_speed_map_jtag, @@ -2391,14 +2398,12 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd) } if (h->transport == HL_TRANSPORT_JTAG) { - /* jtag clock speed only supported by stlink/v2 and for firmware >= 24 */ - if (h->version.stlink >= 2 && h->version.jtag >= 24) { + if (h->version.flags & STLINK_F_HAS_JTAG_SET_FREQ) { stlink_dump_speed_map(stlink_khz_to_speed_map_jtag, ARRAY_SIZE(stlink_khz_to_speed_map_jtag)); stlink_speed(h, param->initial_interface_speed, false); } } else if (h->transport == HL_TRANSPORT_SWD) { - /* clock speed only supported by stlink/v2 and for firmware >= 22 */ - if (h->version.stlink >= 2 && h->version.jtag >= 22) { + if (h->version.flags & STLINK_F_HAS_SWD_SET_FREQ) { stlink_dump_speed_map(stlink_khz_to_speed_map_swd, ARRAY_SIZE(stlink_khz_to_speed_map_swd)); stlink_speed(h, param->initial_interface_speed, false); }