+ const chip_params_t *params = NULL;
+
+ if (!sl)
+ return;
+
+ printf(" serial: ");
+ stlink_print_serial(sl, false);
+ printf("openocd: ");
+ stlink_print_serial(sl, true);
+
+ printf(" flash: %zu (pagesize: %zu)\n", sl->flash_size, sl->flash_pgsz);
+ printf(" sram: %zu\n", sl->sram_size);
+ printf(" chipid: 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(" descr: %s\n", params->description);
+}
+
+static void stlink_probe(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);
+}
+
+static stlink_t *stlink_open_first(void)
+{
+ stlink_t* sl = NULL;
+ sl = stlink_v1_open(0, 1);
+ if (sl == NULL)
+ sl = stlink_open_usb(0, 1, NULL);
+
+ return sl;
+}
+
+static int print_data(char **av)
+{
+ stlink_t* sl = NULL;
+
+ // Probe needs all devices unclaimed
+ if (strcmp(av[1], "--probe") == 0) {
+ stlink_probe();
+ return 0;
+ }
+
+ sl = stlink_open_first();
+
+ if (sl == NULL) {
+ return -1;
+ }
+
+ sl->verbose = 0;
+
+ if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
+ stlink_exit_dfu_mode(sl);
+
+ if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE)
+ stlink_enter_swd_mode(sl);
+