AUTOMAKE_OPTIONS = subdir-objects
if MINGW
-bin_PROGRAMS = st-flash st-util st-info
+bin_PROGRAMS = st-flash st-util st-info st-probe
else
-bin_PROGRAMS = st-flash st-util st-term st-info
+bin_PROGRAMS = st-flash st-util st-term st-info st-probe
endif
noinst_LIBRARIES = libstlink.a
st_flash_SOURCES = flash/main.c
st_term_SOURCES = src/st-term.c
st_info_SOURCES = src/st-info.c
+st_probe_SOURCES = src/st-probe.c
st_util_SOURCES = gdbserver/gdb-remote.c gdbserver/gdb-remote.h gdbserver/gdb-server.c mingw/mingw.c mingw/mingw.h
CFILES = \
st_info_LDADD = libstlink.a
st_info_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw
+st_probe_LDADD = libstlink.a
+st_probe_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw
EXTRA_DIST = autogen.sh
-
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include "stlink-common.h"
+
+void stlink_print_info(stlink_t *sl)
+{
+ const chip_params_t *params = NULL;
+
+ for (size_t n = 0; n < sizeof(sl->serial); n++)
+ printf("%02x", sl->serial[n]);
+ printf("\n");
+
+ printf("\t flash: %zu (pagesize: %zu)\n", sl->flash_size, sl->flash_pgsz);
+ printf("\t sram: %zu\n", sl->sram_size);
+ printf("\tchipid: 0x%.4x\n", sl->chip_id);
+
+ for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
+ if(devices[i].chip_id == sl->chip_id) {
+ params = &devices[i];
+ break;
+ }
+ }
+
+ if (params)
+ printf("\t descr: %s\n", params->description);
+}
+
+int main(void)
+{
+ stlink_t **stdevs;
+ size_t size;
+
+ size = stlink_probe_usb(&stdevs);
+
+ printf("Found %zu stlink programmers\n", size);
+
+ for (size_t n = 0; n < size; n++)
+ stlink_print_info(stdevs[n]);
+
+ stlink_probe_usb_free(&stdevs, size);
+
+ return EXIT_SUCCESS;
+}
return size;
}
- return 0;
+ return 0;
}
int error = -1;
int config;
- sl = malloc(sizeof (stlink_t));
- slu = malloc(sizeof (struct stlink_libusb));
+ sl = calloc(1, sizeof (stlink_t));
+ slu = calloc(1, sizeof (struct stlink_libusb));
if (sl == NULL) goto on_malloc_error;
if (slu == NULL) goto on_malloc_error;
- memset(sl, 0, sizeof (stlink_t));
- memset(slu, 0, sizeof (struct stlink_libusb));
ugly_init(verbose);
sl->backend = &_stlink_usb_backend;
if ((libusb_get_bus_number(list[cnt])!=devBus) || (libusb_get_device_address(list[cnt])!=devAddr)) continue;
if ( (desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID) ){
if ((p_usb_iserial != NULL)){
- unsigned char buffer[13];
struct libusb_device_handle* handle;
libusb_open(list[cnt], &handle);
- libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 13);
+ libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)sl->serial, sizeof(sl->serial));
libusb_close(handle);
- if (memcmp(p_usb_iserial,&buffer,12) == 0){
+ if (memcmp(p_usb_iserial,&sl->serial, sizeof(sl->serial) - 1) == 0){
break;
}else{
continue;
int error = libusb_open(list[cnt], &slu->usb_handle);
if( error !=0 ) {
WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n",
- error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
+ error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
goto on_error;
}
}
return NULL;
}
+static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) {
+ stlink_t **_sldevs;
+ libusb_device *dev;
+ int i = 0;
+ size_t slcnt = 0;
+ size_t slcur = 0;
+
+ /* Count stlink */
+ while ((dev = devs[i++]) != NULL) {
+ struct libusb_device_descriptor desc;
+ int r = libusb_get_device_descriptor(dev, &desc);
+ if (r < 0) {
+ fprintf(stderr, "failed to get device descriptor");
+ break;
+ }
+
+ if (desc.idProduct != USB_STLINK_32L_PID &&
+ desc.idProduct != USB_STLINK_NUCLEO_PID)
+ continue;
+
+ slcnt++;
+ }
+
+ /* Allocate list of pointers */
+ _sldevs = calloc(slcnt, sizeof(stlink_t *));
+ if (!_sldevs) {
+ *sldevs = NULL;
+ return 0;
+ }
+
+ /* Open stlinks and attach to list */
+ i = 0;
+ while ((dev = devs[i++]) != NULL) {
+ struct libusb_device_descriptor desc;
+ int r = libusb_get_device_descriptor(dev, &desc);
+ if (r < 0) {
+ fprintf(stderr, "failed to get device descriptor");
+ break;
+ }
+
+ if (desc.idProduct != USB_STLINK_32L_PID &&
+ desc.idProduct != USB_STLINK_NUCLEO_PID)
+ continue;
+
+ struct libusb_device_handle* handle;
+ char serial[13];
+ memset(serial, 0, sizeof(serial));
+
+ libusb_open(dev, &handle);
+ libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial));
+ libusb_close(handle);
+
+ stlink_t *sl = NULL;
+ sl = stlink_open_usb(0, 1, serial);
+ if (!sl)
+ continue;
+
+ _sldevs[slcur] = sl;
+ slcur++;
+ }
+
+ *sldevs = _sldevs;
+ return slcnt;
+}
+
+size_t stlink_probe_usb(stlink_t **stdevs[]) {
+ libusb_device **devs;
+ stlink_t **sldevs;
+
+ size_t slcnt = 0;
+ int r;
+ ssize_t cnt;
+
+ r = libusb_init(NULL);
+ if (r < 0)
+ return 0;
+
+ cnt = libusb_get_device_list(NULL, &devs);
+ if (cnt < 0)
+ return 0;
+
+ slcnt = stlink_probe_usb_devs(devs, &sldevs);
+ libusb_free_device_list(devs, 1);
+
+ libusb_exit(NULL);
+
+ *stdevs = sldevs;
+ return slcnt;
+}
+
+void stlink_probe_usb_free(stlink_t ***stdevs, size_t size) {
+ if (stdevs == NULL || *stdevs == NULL || size == 0)
+ return;
+
+ for (size_t n = 0; n < size; n++)
+ stlink_close((*stdevs)[n]);
+ free(*stdevs);
+ *stdevs = NULL;
+}