kopia lustrzana https://github.com/stlink-org/stlink
fix for stlink old DFU serial number
omit the hla serial aka 'openocd serial' Only one valid serial is used which matches the serial as displayed in STM32CubeProgrammer and official ST tools. Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>pull/1106/head
rodzic
9956bdeaab
commit
9ed3d46c24
|
@ -37,9 +37,6 @@ Display the chip ID of the device
|
|||
.B \-\-serial
|
||||
Display the serial code of the device
|
||||
.TP
|
||||
.B \-\-hla\-serial
|
||||
Display the hex escaped serial code of the device
|
||||
.TP
|
||||
.B \-\-probe
|
||||
Display the summarized information of the connected programmers and
|
||||
devices
|
||||
|
|
|
@ -13,7 +13,7 @@ st-info - Provides information about connected STLink and STM32 devices
|
|||
# DESCRIPTION
|
||||
|
||||
Provides information about connected STLink programmers and STM32 devices:
|
||||
Serial code, OpenOCD hla-serial, flash, page size, sram, chipid, description.
|
||||
Serial code, flash, page size, sram, chipid, description.
|
||||
|
||||
The STLink device to probe can be specified via the environment variable
|
||||
STLINK_DEVICE on the format <USB_BUS>:<USB_ADDR>.
|
||||
|
@ -29,9 +29,6 @@ STLINK_DEVICE on the format <USB_BUS>:<USB_ADDR>.
|
|||
\--serial
|
||||
: Display the serial code of the device
|
||||
|
||||
\--hla-serial
|
||||
: Display the hex escaped serial code of the device
|
||||
|
||||
\--flash
|
||||
: Display amount of flash memory available in the device
|
||||
|
||||
|
@ -53,8 +50,7 @@ Display information about connected programmers and devices
|
|||
|
||||
$ st-info --probe
|
||||
Found 1 stlink programmers
|
||||
serial: 303033413030323233343338353130323334333133393339
|
||||
hla-serial: "\x30\x30\x33\x41\x30\x30\x32\x32\x33\x34\x33\x38\x35\x31\x30\x32\x33\x34\x33\x31\x33\x39\x33\x39"
|
||||
serial: 57FF72067265575742132067
|
||||
flash: 131072 (pagesize: 128)
|
||||
sram: 20480
|
||||
chipid: 0x0447
|
||||
|
|
|
@ -79,7 +79,8 @@ enum target_state {
|
|||
#define STLINK_SWDCLK_15KHZ_DIVISOR 265
|
||||
#define STLINK_SWDCLK_5KHZ_DIVISOR 798
|
||||
|
||||
#define STLINK_SERIAL_MAX_SIZE 64
|
||||
#define STLINK_SERIAL_LENGTH 24
|
||||
#define STLINK_SERIAL_BUFFER_SIZE (STLINK_SERIAL_LENGTH + 1)
|
||||
|
||||
#define STLINK_V3_MAX_FREQ_NB 10
|
||||
|
||||
|
@ -191,8 +192,7 @@ struct _stlink {
|
|||
uint32_t chip_id; // set by stlink_load_device_params(), used to identify flash and sram
|
||||
enum target_state core_stat; // set by stlink_status()
|
||||
|
||||
char serial[STLINK_SERIAL_MAX_SIZE];
|
||||
int serial_size;
|
||||
char serial[STLINK_SERIAL_BUFFER_SIZE];
|
||||
int freq; // set by stlink_open_usb(), values: STLINK_SWDCLK_xxx_DIVISOR
|
||||
|
||||
enum stlink_flash_type flash_type;
|
||||
|
|
|
@ -14,7 +14,7 @@ enum flash_format {FLASH_FORMAT_BINARY = 0, FLASH_FORMAT_IHEX = 1};
|
|||
enum flash_area {FLASH_MAIN_MEMORY = 0, FLASH_SYSTEM_MEMORY = 1, FLASH_OTP = 2, FLASH_OPTION_BYTES = 3, FLASH_OPTION_BYTES_BOOT_ADD = 4, FLASH_OPTCR = 5, FLASH_OPTCR1 = 6};
|
||||
struct flash_opts {
|
||||
enum flash_cmd cmd;
|
||||
uint8_t serial[STLINK_SERIAL_MAX_SIZE];
|
||||
uint8_t serial[STLINK_SERIAL_BUFFER_SIZE];
|
||||
const char* filename;
|
||||
stm32_addr_t addr;
|
||||
size_t size;
|
||||
|
|
|
@ -106,18 +106,8 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
|
|||
serial = av[0] + strlen("--serial=");
|
||||
}
|
||||
|
||||
/** @todo This is not really portable, as strlen really returns size_t we need to obey
|
||||
and not cast it to a signed type. */
|
||||
int j = (int)strlen(serial);
|
||||
int length = j / 2; // the length of the destination-array
|
||||
memcpy(o->serial, serial, STLINK_SERIAL_BUFFER_SIZE);
|
||||
|
||||
if (j % 2 != 0) { return(-1); }
|
||||
|
||||
for (size_t k = 0; j >= 0 && k < sizeof(o->serial); ++k, j -= 2) {
|
||||
char buffer[3] = {0};
|
||||
memcpy(buffer, serial + j, 2);
|
||||
o->serial[length - k] = (uint8_t)strtol(buffer, NULL, 16);
|
||||
}
|
||||
} else if (strcmp(av[0], "--area") == 0 || starts_with(av[0], "--area=")) {
|
||||
const char * area;
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@ static void usage(void) {
|
|||
puts("st-info --version");
|
||||
puts("st-info --probe");
|
||||
puts("st-info --serial");
|
||||
puts("st-info --hla-serial");
|
||||
puts("st-info --flash [--connect-under-reset]");
|
||||
puts("st-info --pagesize [--connect-under-reset]");
|
||||
puts("st-info --sram [--connect-under-reset]");
|
||||
|
@ -17,24 +16,6 @@ static void usage(void) {
|
|||
puts("st-info --descr [--connect-under-reset]");
|
||||
}
|
||||
|
||||
/* Print normal or OpenOCD hla_serial with newline */
|
||||
static void stlink_print_serial(stlink_t *sl, bool openocd) {
|
||||
const char *fmt;
|
||||
|
||||
if (openocd) {
|
||||
printf("\"");
|
||||
fmt = "\\x%02x";
|
||||
} else {
|
||||
fmt = "%02x";
|
||||
}
|
||||
|
||||
for (int n = 0; n < sl->serial_size; n++) { printf(fmt, sl->serial[n]); }
|
||||
|
||||
if (openocd) { printf("\""); }
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void stlink_print_version(stlink_t *sl) {
|
||||
// Implementation of version printing is minimalistic
|
||||
// but contains all available information from sl->version
|
||||
|
@ -53,10 +34,7 @@ static void stlink_print_info(stlink_t *sl) {
|
|||
|
||||
printf(" version: ");
|
||||
stlink_print_version(sl);
|
||||
printf(" serial: ");
|
||||
stlink_print_serial(sl, false);
|
||||
printf(" hla-serial: ");
|
||||
stlink_print_serial(sl, true);
|
||||
printf(" serial: %s\n", sl->serial);
|
||||
printf(" flash: %u (pagesize: %u)\n",
|
||||
(uint32_t)sl->flash_size, (uint32_t)sl->flash_pgsz);
|
||||
printf(" sram: %u\n", (uint32_t)sl->sram_size);
|
||||
|
@ -131,9 +109,7 @@ static int print_data(int ac, char **av) {
|
|||
if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) { stlink_enter_swd_mode(sl); }
|
||||
|
||||
if (strcmp(av[1], "--serial") == 0) {
|
||||
stlink_print_serial(sl, false);
|
||||
} else if (strcmp(av[1], "--hla-serial") == 0) {
|
||||
stlink_print_serial(sl, true);
|
||||
printf("%s\n", sl->serial);
|
||||
} else if (strcmp(av[1], "--flash") == 0) {
|
||||
printf("0x%x\n", (uint32_t)sl->flash_size);
|
||||
} else if (strcmp(av[1], "--pagesize") == 0) {
|
||||
|
|
|
@ -191,25 +191,8 @@ bool parse_options(int argc, char** argv, st_settings_t *settings) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static void convert_serial_number_text_to_binary(const char* text, char binary_out[STLINK_SERIAL_MAX_SIZE]) {
|
||||
size_t length = 0;
|
||||
for (uint32_t n = 0; n < strlen(text) && length < STLINK_SERIAL_MAX_SIZE; n += 2) {
|
||||
char buffer[3] = { 0 };
|
||||
memcpy(buffer, text + n, 2);
|
||||
binary_out[length++] = (uint8_t)strtol(buffer, NULL, 16);
|
||||
}
|
||||
}
|
||||
|
||||
static stlink_t* stlink_connect(const st_settings_t* settings) {
|
||||
if (settings->serial_number) {
|
||||
// Open this specific stlink.
|
||||
char binary_serial_number[STLINK_SERIAL_MAX_SIZE] = { 0 };
|
||||
convert_serial_number_text_to_binary(settings->serial_number, binary_serial_number);
|
||||
return stlink_open_usb(settings->logging_level, false, binary_serial_number, 0);
|
||||
} else {
|
||||
// Otherwise, open any stlink.
|
||||
return stlink_open_usb(settings->logging_level, false, NULL, 0);
|
||||
}
|
||||
return stlink_open_usb(settings->logging_level, false, settings->serial_number, 0);
|
||||
}
|
||||
|
||||
static bool enable_trace(stlink_t* stlink, const st_settings_t* settings, uint32_t trace_frequency) {
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
static stlink_t *connected_stlink = NULL;
|
||||
static bool semihosting = false;
|
||||
static bool serial_specified = false;
|
||||
static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};
|
||||
static char serialnumber[STLINK_SERIAL_BUFFER_SIZE] = {0};
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define close_socket win32_close_socket
|
||||
|
@ -192,20 +192,7 @@ int parse_options(int argc, char** argv, st_state_t *st) {
|
|||
break;
|
||||
case SERIAL_OPTION:
|
||||
printf("use serial %s\n", optarg);
|
||||
/* TODO: This is not really portable, as strlen really returns size_t,
|
||||
* we need to obey and not cast it to a signed type.
|
||||
*/
|
||||
int j = (int)strlen(optarg);
|
||||
int length = j / 2; // the length of the destination-array
|
||||
|
||||
if (j % 2 != 0) { return(-1); }
|
||||
|
||||
for (size_t k = 0; j >= 0 && k < sizeof(serialnumber); ++k, j -= 2) {
|
||||
char buffer[3] = {0};
|
||||
memcpy(buffer, optarg + j, 2);
|
||||
serialnumber[length - k] = (uint8_t)strtol(buffer, NULL, 16);
|
||||
}
|
||||
|
||||
memcpy(serialnumber, optarg, STLINK_SERIAL_BUFFER_SIZE);
|
||||
serial_specified = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1159,7 +1159,44 @@ static stlink_backend_t _stlink_usb_backend = {
|
|||
_stlink_usb_read_trace
|
||||
};
|
||||
|
||||
stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_MAX_SIZE], int freq) {
|
||||
/* return the length of serial or (0) in case of errors */
|
||||
size_t stlink_serial(struct libusb_device_handle *handle, struct libusb_device_descriptor *desc, char *serial) {
|
||||
unsigned char desc_serial[(STLINK_SERIAL_LENGTH) * 2];
|
||||
|
||||
/* truncate the string in the serial buffer */
|
||||
serial[0] = '\0';
|
||||
|
||||
/* get the LANGID from String Descriptor Zero */
|
||||
int ret = libusb_get_string_descriptor(handle, 0, 0, desc_serial, sizeof(desc_serial));
|
||||
if (ret < 4) return 0;
|
||||
|
||||
uint32_t langid = desc_serial[2] | (desc_serial[3] << 8);
|
||||
|
||||
/* get the serial */
|
||||
ret = libusb_get_string_descriptor(handle, desc->iSerialNumber, langid, desc_serial,
|
||||
sizeof(desc_serial));
|
||||
if (ret < 0) return 0; // could not read serial
|
||||
|
||||
unsigned char len = desc_serial[0];
|
||||
|
||||
if (len == ((STLINK_SERIAL_LENGTH + 1) * 2)) { /* len == 50 */
|
||||
/* good ST-Link adapter */
|
||||
ret = libusb_get_string_descriptor_ascii(
|
||||
handle, desc->iSerialNumber, (unsigned char *)serial, STLINK_SERIAL_BUFFER_SIZE);
|
||||
if (ret < 0) return 0;
|
||||
} else if (len == ((STLINK_SERIAL_LENGTH / 2 + 1) * 2)) { /* len == 26 */
|
||||
/* fix-up the buggy serial */
|
||||
for (unsigned int i = 0; i < STLINK_SERIAL_LENGTH; i += 2)
|
||||
sprintf(serial + i, "%02X", desc_serial[i + 2]);
|
||||
serial[STLINK_SERIAL_LENGTH] = '\0';
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return strlen(serial);
|
||||
}
|
||||
|
||||
stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_BUFFER_SIZE], int freq) {
|
||||
stlink_t* sl = NULL;
|
||||
struct stlink_libusb* slu = NULL;
|
||||
int ret = -1;
|
||||
|
@ -1236,15 +1273,14 @@ stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STL
|
|||
|
||||
if (ret) { continue; } // could not open device
|
||||
|
||||
sl->serial_size = libusb_get_string_descriptor_ascii(
|
||||
handle, desc.iSerialNumber, (unsigned char *)sl->serial, sizeof(sl->serial));
|
||||
size_t serial_len = stlink_serial(handle, &desc, sl->serial);
|
||||
|
||||
libusb_close(handle);
|
||||
|
||||
if (sl->serial_size < 0) { continue; } // could not read serial
|
||||
if (serial_len != STLINK_SERIAL_LENGTH) { continue; } // could not read the serial
|
||||
|
||||
// if no serial provided, or if serial match device, fixup version and protocol
|
||||
if (((serial == NULL) || (*serial == 0)) || (memcmp(serial, &sl->serial, sl->serial_size) == 0)) {
|
||||
if (((serial == NULL) || (*serial == 0)) || (memcmp(serial, &sl->serial, STLINK_SERIAL_LENGTH) == 0)) {
|
||||
if (STLINK_V1_USB_PID(desc.idProduct)) {
|
||||
slu->protocoll = 1;
|
||||
sl->version.stlink_v = 1;
|
||||
|
@ -1433,7 +1469,7 @@ static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) {
|
|||
if (!STLINK_SUPPORTED_USB_PID(desc.idProduct)) { continue; }
|
||||
|
||||
struct libusb_device_handle* handle;
|
||||
char serial[STLINK_SERIAL_MAX_SIZE] = {0, };
|
||||
char serial[STLINK_SERIAL_BUFFER_SIZE] = {0, };
|
||||
|
||||
ret = libusb_open(dev, &handle);
|
||||
|
||||
|
@ -1447,11 +1483,11 @@ static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) {
|
|||
break;
|
||||
}
|
||||
|
||||
ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial));
|
||||
size_t serial_len = stlink_serial(handle, &desc, serial);
|
||||
|
||||
libusb_close(handle);
|
||||
|
||||
if (ret < 0) { continue; }
|
||||
if (serial_len != STLINK_SERIAL_LENGTH) { continue; }
|
||||
|
||||
stlink_t *sl = stlink_open_usb(0, 1, serial, 0);
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ struct stlink_libusb {
|
|||
* @retval NULL Error while opening the stlink
|
||||
* @retval !NULL Stlink found and ready to use
|
||||
*/
|
||||
stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_MAX_SIZE], int freq);
|
||||
stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_BUFFER_SIZE], int freq);
|
||||
size_t stlink_probe_usb(stlink_t **stdevs[]);
|
||||
void stlink_probe_usb_free(stlink_t **stdevs[], size_t size);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue