2 * Copyright (c) 2010 "Capt'ns Missing Link" Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style
4 * license that can be found in the LICENSE file.
6 * A linux stlink access demo. The purpose of this file is to mitigate the usual
7 * "reinventing the wheel" force by incompatible licenses and give you an idea,
8 * how to access the stlink device. That doesn't mean you should be a free-loader
9 * and not contribute your improvements to this code.
11 * Author: Martin Capitanio <m@capitanio.org>
12 * The stlink related constants kindly provided by Oliver Spencer (OpenOCD)
13 * for use in a GPL compatible license.
15 * Tested compatibility: linux, gcc >= 4.3.3
17 * The communication is based on standard USB mass storage device
18 * BOT (Bulk Only Transfer)
19 * - Endpoint 1: BULK_IN, 64 bytes max
20 * - Endpoint 2: BULK_OUT, 64 bytes max
22 * All CBW transfers are ordered with the LSB (byte 0) first (little endian).
23 * Any command must be answered before sending the next command.
24 * Each USB transfer must complete in less than 1s.
26 * SB Device Class Definition for Mass Storage Devices:
27 * www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf
29 * dt - Data Transfer (IN/OUT)
30 * CBW - Command Block Wrapper
31 * CSW - Command Status Wrapper
32 * RFU - Reserved for Future Use
34 * Originally, this driver used scsi pass through commands, which required the
35 * usb-storage module to be loaded, providing the /dev/sgX links. The USB mass
36 * storage implementation on the STLinkv1 is however terribly broken, and it can
37 * take many minutes for the kernel to give up.
39 * However, in Nov 2011, the scsi pass through was replaced by raw libusb, so
40 * instead of having to let usb-storage struggle with the device, and also greatly
41 * limiting the portability of the driver, you can now tell usb-storage to simply
42 * ignore this device completely.
45 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=Documentation/kernel-parameters.txt
46 * Each entry has the form VID:PID:Flags where VID and PID are Vendor and Product
47 * ID values (4-digit hex numbers) and Flags is a set of characters, each corresponding
48 * to a common usb-storage quirk flag as follows:
50 * a = SANE_SENSE (collect more than 18 bytes of sense data);
51 * b = BAD_SENSE (don't collect more than 18 bytes of sense data);
52 * c = FIX_CAPACITY (decrease the reported device capacity by one sector);
53 * h = CAPACITY_HEURISTICS (decrease the reported device capacity by one sector if the number is odd);
54 * i = IGNORE_DEVICE (don't bind to this device);
55 * l = NOT_LOCKABLE (don't try to lock and unlock ejectable media);
56 * m = MAX_SECTORS_64 (don't transfer more than 64 sectors = 32 KB at a time);
57 * o = CAPACITY_OK (accept the capacity reported by the device);
58 * r = IGNORE_RESIDUE (the device reports bogus residue values);
59 * s = SINGLE_LUN (the device has only one Logical Unit);
60 * w = NO_WP_DETECT (don't test whether the medium is write-protected).
62 * Example: quirks=0419:aaf5:rl,0421:0433:rc
63 * http://permalink.gmane.org/gmane.linux.usb.general/35053
65 * For the stlinkv1, you just want the following
67 * modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i
69 * Equivalently, you can add a line saying
71 * options usb-storage quirks=483:3744:i
73 * to your /etc/modprobe.conf or /etc/modprobe.d/local.conf (or add the "quirks=..."
74 * part to an existing options line for usb-storage).
86 #include <sys/types.h>
90 #include "stlink-common.h"
91 #include "stlink-sg.h"
92 #include "uglylogging.h"
94 #define LOG_TAG __FILE__
95 #define DLOG(format, args...) ugly_log(UDEBUG, LOG_TAG, format, ## args)
96 #define ILOG(format, args...) ugly_log(UINFO, LOG_TAG, format, ## args)
97 #define WLOG(format, args...) ugly_log(UWARN, LOG_TAG, format, ## args)
98 #define fatal(format, args...) ugly_log(UFATAL, LOG_TAG, format, ## args)
100 static void clear_cdb(struct stlink_libsg *sl) {
101 for (size_t i = 0; i < sizeof (sl->cdb_cmd_blk); i++)
102 sl->cdb_cmd_blk[i] = 0;
104 sl->cdb_cmd_blk[0] = STLINK_DEBUG_COMMAND;
105 sl->q_data_dir = Q_DATA_IN;
109 * Close and free any _backend_ related information...
112 void _stlink_sg_close(stlink_t *sl) {
114 struct stlink_libsg *slsg = sl->backend_data;
115 libusb_close(slsg->usb_handle);
116 libusb_exit(slsg->libusb_ctx);
121 static int get_usb_mass_storage_status(libusb_device_handle *handle, uint8_t endpoint, uint32_t *tag)
123 unsigned char csw[13];
124 memset(csw, 0, sizeof(csw));
129 ret = libusb_bulk_transfer(handle, endpoint, (unsigned char *)&csw, sizeof(csw),
130 &transferred, SG_TIMEOUT_MSEC);
131 if (ret == LIBUSB_ERROR_PIPE) {
132 libusb_clear_halt(handle, endpoint);
135 } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
136 if (ret != LIBUSB_SUCCESS) {
137 WLOG("%s: receiving failed: %d\n", __func__, ret);
140 if (transferred != sizeof(csw)) {
141 WLOG("%s: received unexpected amount: %d\n", __func__, transferred);
145 uint32_t rsig = read_uint32(csw, 0);
146 uint32_t rtag = read_uint32(csw, 4);
147 /* uint32_t residue = read_uint32(csw, 8); */
148 #define USB_CSW_SIGNATURE 0x53425355 // 'U' 'S' 'B' 'S' (reversed)
149 if (rsig != USB_CSW_SIGNATURE) {
150 WLOG("status signature was invalid: %#x\n", rsig);
154 uint8_t rstatus = csw[12];
158 static int dump_CDB_command(uint8_t *cdb, uint8_t cdb_len) {
160 char *dbugp = dbugblah;
161 dbugp += sprintf(dbugp, "Sending CDB [");
162 for (uint8_t i = 0; i < cdb_len; i++) {
163 dbugp += sprintf(dbugp, " %#02x", (unsigned int) cdb[i]);
165 sprintf(dbugp, "]\n");
171 * Wraps a CDB mass storage command in the appropriate gunk to get it down
178 * @param expected_rx_size
181 int send_usb_mass_storage_command(libusb_device_handle *handle, uint8_t endpoint_out,
182 uint8_t *cdb, uint8_t cdb_length,
183 uint8_t lun, uint8_t flags, uint32_t expected_rx_size) {
184 DLOG("Sending usb m-s cmd: cdblen:%d, rxsize=%d\n", cdb_length, expected_rx_size);
185 dump_CDB_command(cdb, cdb_length);
194 int real_transferred;
197 uint8_t c_buf[STLINK_SG_SIZE];
198 // tag is allegedly ignored... TODO - verify
203 write_uint32(&c_buf[i], tag);
204 uint32_t this_tag = tag++;
205 write_uint32(&c_buf[i+4], expected_rx_size);
210 c_buf[i++] = cdb_length;
212 // Now the actual CDB request
213 assert(cdb_length <= CDB_SL);
214 memcpy(&(c_buf[i]), cdb, cdb_length);
216 int sending_length = STLINK_SG_SIZE;
220 ret = libusb_bulk_transfer(handle, endpoint_out, c_buf, sending_length,
221 &real_transferred, SG_TIMEOUT_MSEC);
222 if (ret == LIBUSB_ERROR_PIPE) {
223 libusb_clear_halt(handle, endpoint_out);
226 } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
227 if (ret != LIBUSB_SUCCESS) {
228 WLOG("sending failed: %d\n", ret);
236 * Straight from stm8 stlink code...
239 * @param endpoint_out
242 get_sense(libusb_device_handle *handle, uint8_t endpoint_in, uint8_t endpoint_out)
244 DLOG("Fetching sense...\n");
246 memset(cdb, 0, sizeof(cdb));
247 #define REQUEST_SENSE 0x03
248 #define REQUEST_SENSE_LENGTH 18
249 cdb[0] = REQUEST_SENSE;
250 cdb[4] = REQUEST_SENSE_LENGTH;
251 uint32_t tag = send_usb_mass_storage_command(handle, endpoint_out, cdb, sizeof(cdb), 0,
252 LIBUSB_ENDPOINT_IN, REQUEST_SENSE_LENGTH);
254 WLOG("refusing to send request sense with tag 0\n");
257 unsigned char sense[REQUEST_SENSE_LENGTH];
262 ret = libusb_bulk_transfer(handle, endpoint_in, sense, sizeof(sense),
263 &transferred, SG_TIMEOUT_MSEC);
264 if (ret == LIBUSB_ERROR_PIPE) {
265 libusb_clear_halt(handle, endpoint_in);
268 } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
269 if (ret != LIBUSB_SUCCESS) {
270 WLOG("receiving sense failed: %d\n", ret);
273 if (transferred != sizeof(sense)) {
274 WLOG("received unexpected amount of sense: %d != %d\n", transferred, sizeof(sense));
276 uint32_t received_tag;
277 int status = get_usb_mass_storage_status(handle, endpoint_in, &received_tag);
279 WLOG("receiving sense failed with status: %02x\n", status);
282 if (sense[0] != 0x70 && sense[0] != 0x71) {
283 WLOG("No sense data\n");
285 WLOG("Sense KCQ: %02X %02X %02X\n", sense[2] & 0x0f, sense[12], sense[13]);
290 * Just send a buffer on an endpoint, no questions asked.
291 * Handles repeats, and time outs. Also handles reading status reports and sense
292 * @param handle libusb device *
293 * @param endpoint_out sends
294 * @param endpoint_in used to read status reports back in
295 * @param cbuf what to send
296 * @param length how much to send
297 * @return number of bytes actually sent, or -1 for failures.
299 int send_usb_data_only(libusb_device_handle *handle, unsigned char endpoint_out,
300 unsigned char endpoint_in, unsigned char *cbuf, unsigned int length) {
302 int real_transferred;
305 ret = libusb_bulk_transfer(handle, endpoint_out, cbuf, length,
306 &real_transferred, SG_TIMEOUT_MSEC);
307 if (ret == LIBUSB_ERROR_PIPE) {
308 libusb_clear_halt(handle, endpoint_out);
311 } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
312 if (ret != LIBUSB_SUCCESS) {
313 WLOG("sending failed: %d\n", ret);
317 // now, swallow up the status, so that things behave nicely...
318 uint32_t received_tag;
319 // -ve is for my errors, 0 is good, +ve is libusb sense status bytes
320 int status = get_usb_mass_storage_status(handle, endpoint_in, &received_tag);
322 WLOG("receiving status failed: %d\n", status);
326 WLOG("receiving status not passed :(: %02x\n", status);
329 get_sense(handle, endpoint_in, endpoint_out);
333 return real_transferred;
337 int stlink_q(stlink_t *sl) {
338 struct stlink_libsg* sg = sl->backend_data;
339 //uint8_t cdb_len = 6; // FIXME varies!!!
340 uint8_t cdb_len = 10; // FIXME varies!!!
341 uint8_t lun = 0; // always zero...
342 uint32_t tag = send_usb_mass_storage_command(sg->usb_handle, sg->ep_req,
343 sg->cdb_cmd_blk, cdb_len, lun, LIBUSB_ENDPOINT_IN, sl->q_len);
346 // now wait for our response...
347 // length copied from stlink-usb...
348 int rx_length = sl->q_len;
350 int real_transferred;
354 ret = libusb_bulk_transfer(sg->usb_handle, sg->ep_rep, sl->q_buf, rx_length,
355 &real_transferred, SG_TIMEOUT_MSEC);
356 if (ret == LIBUSB_ERROR_PIPE) {
357 libusb_clear_halt(sg->usb_handle, sg->ep_req);
360 } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
362 if (ret != LIBUSB_SUCCESS) {
363 WLOG("Receiving failed: %d\n", ret);
367 if (real_transferred != rx_length) {
368 WLOG("received unexpected amount: %d != %d\n", real_transferred, rx_length);
372 uint32_t received_tag;
373 // -ve is for my errors, 0 is good, +ve is libusb sense status bytes
374 int status = get_usb_mass_storage_status(sg->usb_handle, sg->ep_rep, &received_tag);
376 WLOG("receiving status failed: %d\n", status);
380 WLOG("receiving status not passed :(: %02x\n", status);
383 get_sense(sg->usb_handle, sg->ep_rep, sg->ep_req);
386 if (received_tag != tag) {
387 WLOG("received tag %d but expected %d\n", received_tag, tag);
390 if (rx_length > 0 && real_transferred != rx_length) {
396 // TODO thinking, cleanup
398 void stlink_stat(stlink_t *stl, char *txt) {
402 stlink_print_data(stl);
404 switch (stl->q_buf[0]) {
406 DLOG(" %s: ok\n", txt);
409 DLOG(" %s: false\n", txt);
412 DLOG(" %s: unknown\n", txt);
417 void _stlink_sg_version(stlink_t *stl) {
418 struct stlink_libsg *sl = stl->backend_data;
420 sl->cdb_cmd_blk[0] = STLINK_GET_VERSION;
427 // STLINK_DEV_DFU_MODE || STLINK_DEV_MASS_MODE || STLINK_DEV_DEBUG_MODE
428 // usb dfu || usb mass || jtag or swd
430 int _stlink_sg_current_mode(stlink_t *stl) {
431 struct stlink_libsg *sl = stl->backend_data;
433 sl->cdb_cmd_blk[0] = STLINK_GET_CURRENT_MODE;
437 return stl->q_buf[0];
440 // Exit the mass mode and enter the swd debug mode.
442 void _stlink_sg_enter_swd_mode(stlink_t *sl) {
443 struct stlink_libsg *sg = sl->backend_data;
445 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
446 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_SWD;
447 sl->q_len = 0; // >0 -> aboard
451 // Exit the mass mode and enter the jtag debug mode.
452 // (jtag is disabled in the discovery's stlink firmware)
454 void _stlink_sg_enter_jtag_mode(stlink_t *sl) {
455 struct stlink_libsg *sg = sl->backend_data;
456 DLOG("\n*** stlink_enter_jtag_mode ***\n");
458 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
459 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_JTAG;
464 // XXX kernel driver performs reset, the device temporally disappears
465 // Suspect this is no longer the case when we have ignore on? RECHECK
466 void _stlink_sg_exit_dfu_mode(stlink_t *sl) {
467 struct stlink_libsg *sg = sl->backend_data;
468 DLOG("\n*** stlink_exit_dfu_mode ***\n");
470 sg->cdb_cmd_blk[0] = STLINK_DFU_COMMAND;
471 sg->cdb_cmd_blk[1] = STLINK_DFU_EXIT;
475 [135121.844564] sd 19:0:0:0: [sdb] Unhandled error code
476 [135121.844569] sd 19:0:0:0: [sdb] Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
477 [135121.844574] sd 19:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 10 00 00 00 08 00
478 [135121.844584] end_request: I/O error, dev sdb, sector 4096
479 [135121.844590] Buffer I/O error on device sdb, logical block 512
480 [135130.122567] usb 6-1: reset full speed USB device using uhci_hcd and address 7
481 [135130.274551] usb 6-1: device firmware changed
482 [135130.274618] usb 6-1: USB disconnect, address 7
483 [135130.275186] VFS: busy inodes on changed media or resized disk sdb
484 [135130.275424] VFS: busy inodes on changed media or resized disk sdb
485 [135130.286758] VFS: busy inodes on changed media or resized disk sdb
486 [135130.292796] VFS: busy inodes on changed media or resized disk sdb
487 [135130.301481] VFS: busy inodes on changed media or resized disk sdb
488 [135130.304316] VFS: busy inodes on changed media or resized disk sdb
489 [135130.431113] usb 6-1: new full speed USB device using uhci_hcd and address 8
490 [135130.629444] usb-storage 6-1:1.0: Quirks match for vid 0483 pid 3744: 102a1
491 [135130.629492] scsi20 : usb-storage 6-1:1.0
492 [135131.625600] scsi 20:0:0:0: Direct-Access STM32 PQ: 0 ANSI: 0
493 [135131.627010] sd 20:0:0:0: Attached scsi generic sg2 type 0
494 [135131.633603] sd 20:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
495 [135131.633613] sd 20:0:0:0: [sdb] Assuming Write Enabled
496 [135131.633620] sd 20:0:0:0: [sdb] Assuming drive cache: write through
497 [135131.640584] sd 20:0:0:0: [sdb] Assuming Write Enabled
498 [135131.640592] sd 20:0:0:0: [sdb] Assuming drive cache: write through
500 [135131.652634] sd 20:0:0:0: [sdb] Assuming Write Enabled
501 [135131.652639] sd 20:0:0:0: [sdb] Assuming drive cache: write through
502 [135131.652645] sd 20:0:0:0: [sdb] Attached SCSI removable disk
503 [135131.671536] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
504 [135131.671548] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
505 [135131.671553] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
506 [135131.671560] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
507 [135131.671570] end_request: I/O error, dev sdb, sector 63872
508 [135131.671575] Buffer I/O error on device sdb, logical block 7984
509 [135131.678527] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
510 [135131.678532] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
511 [135131.678537] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
512 [135131.678542] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
513 [135131.678551] end_request: I/O error, dev sdb, sector 63872
515 [135131.853565] end_request: I/O error, dev sdb, sector 4096
519 void _stlink_sg_core_id(stlink_t *sl) {
520 struct stlink_libsg *sg = sl->backend_data;
522 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READCOREID;
526 sl->core_id = read_uint32(sl->q_buf, 0);
529 // Arm-core reset -> halted state.
531 void _stlink_sg_reset(stlink_t *sl) {
532 struct stlink_libsg *sg = sl->backend_data;
534 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RESETSYS;
538 stlink_stat(sl, "core reset");
541 // Arm-core reset -> halted state.
543 void _stlink_sg_jtag_reset(stlink_t *sl, int value) {
544 struct stlink_libsg *sg = sl->backend_data;
546 sg->cdb_cmd_blk[1] = STLINK_JTAG_DRIVE_NRST;
547 sg->cdb_cmd_blk[2] = (value)?0:1;
551 stlink_stat(sl, "core reset");
554 // Arm-core status: halted or running.
556 void _stlink_sg_status(stlink_t *sl) {
557 struct stlink_libsg *sg = sl->backend_data;
559 sg->cdb_cmd_blk[1] = STLINK_DEBUG_GETSTATUS;
565 // Force the core into the debug mode -> halted state.
567 void _stlink_sg_force_debug(stlink_t *sl) {
568 struct stlink_libsg *sg = sl->backend_data;
570 sg->cdb_cmd_blk[1] = STLINK_DEBUG_FORCEDEBUG;
574 stlink_stat(sl, "force debug");
577 // Read all arm-core registers.
579 void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) {
580 struct stlink_libsg *sg = sl->backend_data;
583 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS;
587 stlink_print_data(sl);
589 // TODO - most of this should be re-extracted up....
591 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
592 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
593 for (int i = 0; i < 16; i++) {
594 regp->r[i] = read_uint32(sl->q_buf, 4 * i);
596 DLOG("r%2d = 0x%08x\n", i, regp->r[i]);
598 regp->xpsr = read_uint32(sl->q_buf, 64);
599 regp->main_sp = read_uint32(sl->q_buf, 68);
600 regp->process_sp = read_uint32(sl->q_buf, 72);
601 regp->rw = read_uint32(sl->q_buf, 76);
602 regp->rw2 = read_uint32(sl->q_buf, 80);
606 DLOG("xpsr = 0x%08x\n", regp->xpsr);
607 DLOG("main_sp = 0x%08x\n", regp->main_sp);
608 DLOG("process_sp = 0x%08x\n", regp->process_sp);
609 DLOG("rw = 0x%08x\n", regp->rw);
610 DLOG("rw2 = 0x%08x\n", regp->rw2);
613 // Read an arm-core register, the index must be in the range 0..20.
614 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
615 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
617 void _stlink_sg_read_reg(stlink_t *sl, int r_idx, reg *regp) {
618 struct stlink_libsg *sg = sl->backend_data;
620 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READREG;
621 sg->cdb_cmd_blk[2] = r_idx;
625 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
626 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
627 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
628 stlink_print_data(sl);
630 uint32_t r = read_uint32(sl->q_buf, 0);
631 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
641 regp->process_sp = r;
644 regp->rw = r; //XXX ?(primask, basemask etc.)
647 regp->rw2 = r; //XXX ?(primask, basemask etc.)
654 // Write an arm-core register. Index:
655 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
656 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
658 void _stlink_sg_write_reg(stlink_t *sl, uint32_t reg, int idx) {
659 struct stlink_libsg *sg = sl->backend_data;
661 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEREG;
664 sg->cdb_cmd_blk[2] = idx;
665 write_uint32(sg->cdb_cmd_blk + 3, reg);
669 stlink_stat(sl, "write reg");
672 // Write a register of the debug module of the core.
673 // XXX ?(atomic writes)
676 void stlink_write_dreg(stlink_t *sl, uint32_t reg, uint32_t addr) {
677 struct stlink_libsg *sg = sl->backend_data;
678 DLOG("\n*** stlink_write_dreg ***\n");
680 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEDEBUGREG;
681 // 2-5: address of reg of the debug module
683 write_uint32(sg->cdb_cmd_blk + 2, addr);
684 write_uint32(sg->cdb_cmd_blk + 6, reg);
688 stlink_stat(sl, "write debug reg");
691 // Force the core exit the debug mode.
693 void _stlink_sg_run(stlink_t *sl) {
694 struct stlink_libsg *sg = sl->backend_data;
696 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RUNCORE;
700 stlink_stat(sl, "run core");
703 // Step the arm-core.
705 void _stlink_sg_step(stlink_t *sl) {
706 struct stlink_libsg *sg = sl->backend_data;
708 sg->cdb_cmd_blk[1] = STLINK_DEBUG_STEPCORE;
712 stlink_stat(sl, "step core");
716 // see Cortex-M3 Technical Reference Manual
717 // TODO make delegate!
718 void stlink_set_hw_bp(stlink_t *sl, int fp_nr, uint32_t addr, int fp) {
719 DLOG("\n*** stlink_set_hw_bp ***\n");
720 struct stlink_libsg *sg = sl->backend_data;
722 sg->cdb_cmd_blk[1] = STLINK_DEBUG_SETFP;
723 // 2:The number of the flash patch used to set the breakpoint
724 // 3-6: Address of the breakpoint (LSB)
725 // 7: FP_ALL (0x02) / FP_UPPER (0x01) / FP_LOWER (0x00)
726 sl->q_buf[2] = fp_nr;
727 write_uint32(sl->q_buf, addr);
732 stlink_stat(sl, "set flash breakpoint");
737 // TODO make delegate!
738 void stlink_clr_hw_bp(stlink_t *sl, int fp_nr) {
739 struct stlink_libsg *sg = sl->backend_data;
740 DLOG("\n*** stlink_clr_hw_bp ***\n");
742 sg->cdb_cmd_blk[1] = STLINK_DEBUG_CLEARFP;
743 sg->cdb_cmd_blk[2] = fp_nr;
747 stlink_stat(sl, "clear flash breakpoint");
750 // Read a "len" bytes to the sl->q_buf from the memory, max 6kB (6144 bytes)
752 void _stlink_sg_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
753 struct stlink_libsg *sg = sl->backend_data;
755 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READMEM_32BIT;
758 write_uint32(sg->cdb_cmd_blk + 2, addr);
759 write_uint16(sg->cdb_cmd_blk + 6, len);
761 // data_in 0-0x40-len
762 // !!! len _and_ q_len must be max 6k,
763 // i.e. >1024 * 6 = 6144 -> aboard)
764 // !!! if len < q_len: 64*k, 1024*n, n=1..5 -> aboard
765 // (broken residue issue)
769 stlink_print_data(sl);
772 // Write a "len" bytes from the sl->q_buf to the memory, max 64 Bytes.
774 void _stlink_sg_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
775 struct stlink_libsg *sg = sl->backend_data;
777 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_8BIT;
779 // 6-7: len (>0x40 (64) -> aboard)
780 write_uint32(sg->cdb_cmd_blk + 2, addr);
781 write_uint16(sg->cdb_cmd_blk + 6, len);
783 // this sends the command...
784 send_usb_mass_storage_command(sg->usb_handle, sg->ep_req, sg->cdb_cmd_blk, CDB_SL, 0, 0, 0);
785 // This sends the data...
786 send_usb_data_only(sg->usb_handle, sg->ep_req, sg->ep_rep, sl->q_buf, len);
787 stlink_print_data(sl);
790 // Write a "len" bytes from the sl->q_buf to the memory, max Q_BUF_LEN bytes.
792 void _stlink_sg_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
793 struct stlink_libsg *sg = sl->backend_data;
795 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_32BIT;
797 // 6-7: len "unlimited"
798 write_uint32(sg->cdb_cmd_blk + 2, addr);
799 write_uint16(sg->cdb_cmd_blk + 6, len);
801 // this sends the command...
802 send_usb_mass_storage_command(sg->usb_handle, sg->ep_req, sg->cdb_cmd_blk, CDB_SL, 0, 0, 0);
803 // This sends the data...
804 send_usb_data_only(sg->usb_handle, sg->ep_req, sg->ep_rep, sl->q_buf, len);
806 stlink_print_data(sl);
809 // Write one DWORD data to memory
811 void _stlink_sg_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
812 struct stlink_libsg *sg = sl->backend_data;
814 sg->cdb_cmd_blk[1] = STLINK_JTAG_WRITEDEBUG_32BIT;
816 write_uint32(sg->cdb_cmd_blk + 2, addr);
817 write_uint32(sg->cdb_cmd_blk + 6, data);
823 // Read one DWORD data from memory
825 uint32_t _stlink_sg_read_debug32(stlink_t *sl, uint32_t addr) {
826 struct stlink_libsg *sg = sl->backend_data;
828 sg->cdb_cmd_blk[1] = STLINK_JTAG_READDEBUG_32BIT;
830 write_uint32(sg->cdb_cmd_blk + 2, addr);
834 return read_uint32(sl->q_buf, 4);
837 // Exit the jtag or swd mode and enter the mass mode.
839 void _stlink_sg_exit_debug_mode(stlink_t *stl) {
842 struct stlink_libsg* sl = stl->backend_data;
844 sl->cdb_cmd_blk[1] = STLINK_DEBUG_EXIT;
845 stl->q_len = 0; // >0 -> aboard
851 // 1) open a sg device, switch the stlink from dfu to mass mode
852 // 2) wait 5s until the kernel driver stops reseting the broken device
853 // 3) reopen the device
854 // 4) the device driver is now ready for a switch to jtag/swd mode
855 // TODO thinking, better error handling, wait until the kernel driver stops reseting the plugged-in device
857 stlink_backend_t _stlink_sg_backend = {
859 _stlink_sg_exit_debug_mode,
860 _stlink_sg_enter_swd_mode,
861 _stlink_sg_enter_jtag_mode,
862 _stlink_sg_exit_dfu_mode,
865 _stlink_sg_jtag_reset,
869 _stlink_sg_read_debug32,
870 _stlink_sg_read_mem32,
871 _stlink_sg_write_debug32,
872 _stlink_sg_write_mem32,
873 _stlink_sg_write_mem8,
874 _stlink_sg_read_all_regs,
876 NULL, /* read_all_unsupported_regs */
877 NULL, /* read_unsupported_regs */
878 NULL, /* write_unsupported_regs */
879 _stlink_sg_write_reg,
881 _stlink_sg_current_mode,
882 _stlink_sg_force_debug,
886 static stlink_t* stlink_open(const int verbose) {
888 stlink_t *sl = malloc(sizeof (stlink_t));
889 memset(sl, 0, sizeof(stlink_t));
890 struct stlink_libsg *slsg = malloc(sizeof (struct stlink_libsg));
891 if (sl == NULL || slsg == NULL) {
892 WLOG("Couldn't malloc stlink and stlink_sg structures out of memory!\n");
896 if (libusb_init(&(slsg->libusb_ctx))) {
897 WLOG("failed to init libusb context, wrong version of libraries?\n");
903 libusb_set_debug(slsg->libusb_ctx, 3);
905 slsg->usb_handle = libusb_open_device_with_vid_pid(slsg->libusb_ctx, USB_ST_VID, USB_STLINK_PID);
906 if (slsg->usb_handle == NULL) {
907 WLOG("Failed to find an stlink v1 by VID:PID\n");
908 libusb_close(slsg->usb_handle);
909 libusb_exit(slsg->libusb_ctx);
916 // Could read the interface config descriptor, and assert lots of the assumptions
918 // assumption: numInterfaces is always 1...
919 if (libusb_kernel_driver_active(slsg->usb_handle, 0) == 1) {
920 int r = libusb_detach_kernel_driver(slsg->usb_handle, 0);
922 WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
923 libusb_close(slsg->usb_handle);
924 libusb_exit(slsg->libusb_ctx);
929 DLOG("Kernel driver was successfully detached\n");
933 if (libusb_get_configuration(slsg->usb_handle, &config)) {
934 /* this may fail for a previous configured device */
935 WLOG("libusb_get_configuration()\n");
936 libusb_close(slsg->usb_handle);
937 libusb_exit(slsg->libusb_ctx);
944 // assumption: bConfigurationValue is always 1
946 WLOG("Your stlink got into a real weird configuration, trying to fix it!\n");
947 DLOG("setting new configuration (%d -> 1)\n", config);
948 if (libusb_set_configuration(slsg->usb_handle, 1)) {
949 /* this may fail for a previous configured device */
950 WLOG("libusb_set_configuration() failed\n");
951 libusb_close(slsg->usb_handle);
952 libusb_exit(slsg->libusb_ctx);
959 if (libusb_claim_interface(slsg->usb_handle, 0)) {
960 WLOG("libusb_claim_interface() failed\n");
961 libusb_close(slsg->usb_handle);
962 libusb_exit(slsg->libusb_ctx);
968 // assumption: endpoint config is fixed mang. really.
969 slsg->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
970 slsg->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
972 DLOG("Successfully opened stlinkv1 by libusb :)\n");
974 sl->verbose = verbose;
975 sl->backend_data = slsg;
976 sl->backend = &_stlink_sg_backend;
978 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
985 stlink_t* stlink_v1_open_inner(const int verbose) {
987 stlink_t *sl = stlink_open(verbose);
989 fputs("Error: could not open stlink device\n", stderr);
994 if ((sl->version.st_vid != USB_ST_VID) || (sl->version.stlink_pid != USB_STLINK_PID)) {
995 ugly_log(UERROR, LOG_TAG,
996 "WTF? successfully opened, but unable to read version details. BROKEN!\n");
1000 DLOG("Reading current mode...\n");
1001 switch (stlink_current_mode(sl)) {
1002 case STLINK_DEV_MASS_MODE:
1004 case STLINK_DEV_DEBUG_MODE:
1008 ILOG("Current mode unusable, trying to get back to a useful state...\n");
1012 DLOG("Attempting to exit DFU mode\n");
1013 _stlink_sg_exit_dfu_mode(sl);
1015 // re-query device info (and retest)
1017 if ((sl->version.st_vid != USB_ST_VID) || (sl->version.stlink_pid != USB_STLINK_PID)) {
1018 ugly_log(UERROR, LOG_TAG,
1019 "WTF? successfully opened, but unable to read version details. BROKEN!\n");
1026 stlink_t* stlink_v1_open(const int verbose, int reset) {
1027 stlink_t *sl = stlink_v1_open_inner(verbose);
1029 fputs("Error: could not open stlink device\n", stderr);
1032 // by now, it _must_ be fully open and in a useful mode....
1033 stlink_enter_swd_mode(sl);
1034 /* Now we are ready to read the parameters */
1038 stlink_load_device_params(sl);
1039 ILOG("Successfully opened a stlink v1 debugger\n");