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 Code format ~ TAB = 8, K&R, linux kernel source, golang oriented
16 Tested compatibility: linux, gcc >= 4.3.3
18 The communication is based on standard USB mass storage device
19 BOT (Bulk Only Transfer)
20 - Endpoint 1: BULK_IN, 64 bytes max
21 - Endpoint 2: BULK_OUT, 64 bytes max
23 All CBW transfers are ordered with the LSB (byte 0) first (little endian).
24 Any command must be answered before sending the next command.
25 Each USB transfer must complete in less than 1s.
27 SB Device Class Definition for Mass Storage Devices:
28 www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf
30 dt - Data Transfer (IN/OUT)
31 CBW - Command Block Wrapper
32 CSW - Command Status Wrapper
33 RFU - Reserved for Future Use
34 scsi_pt - SCSI pass-through
38 http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=Documentation/kernel-parameters.txt
39 Each entry has the form VID:PID:Flags where VID and PID are Vendor and Product
40 ID values (4-digit hex numbers) and Flags is a set of characters, each corresponding
41 to a common usb-storage quirk flag as follows:
43 a = SANE_SENSE (collect more than 18 bytes of sense data);
44 b = BAD_SENSE (don't collect more than 18 bytes of sense data);
45 c = FIX_CAPACITY (decrease the reported device capacity by one sector);
46 h = CAPACITY_HEURISTICS (decrease the reported device capacity by one sector if the number is odd);
47 i = IGNORE_DEVICE (don't bind to this device);
48 l = NOT_LOCKABLE (don't try to lock and unlock ejectable media);
49 m = MAX_SECTORS_64 (don't transfer more than 64 sectors = 32 KB at a time);
50 o = CAPACITY_OK (accept the capacity reported by the device);
51 r = IGNORE_RESIDUE (the device reports bogus residue values);
52 s = SINGLE_LUN (the device has only one Logical Unit);
53 w = NO_WP_DETECT (don't test whether the medium is write-protected).
55 Example: quirks=0419:aaf5:rl,0421:0433:rc
56 http://permalink.gmane.org/gmane.linux.usb.general/35053
58 modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:l
60 Equivalently, you can add a line saying
62 options usb-storage quirks=483:3744:l
64 to your /etc/modprobe.conf or /etc/modprobe.d/local.conf (or add the "quirks=..."
65 part to an existing options line for usb-storage).
67 https://wiki.kubuntu.org/Kernel/Debugging/USB explains the protocoll and
68 would allow to replace the sg access to pure libusb access
79 #include <sys/types.h>
83 #include "stlink-common.h"
86 // sgutils2 (apt-get install libsgutils2-dev)
87 #include <scsi/sg_lib.h>
88 #include <scsi/sg_pt.h>
89 #include "stlink-sg.h"
93 // Suspends execution of the calling process for
94 // (at least) ms milliseconds.
96 static void delay(int ms) {
97 //fprintf(stderr, "*** wait %d ms\n", ms);
101 static void clear_cdb(struct stlink_libsg *sl) {
102 for (size_t i = 0; i < sizeof (sl->cdb_cmd_blk); i++)
103 sl->cdb_cmd_blk[i] = 0;
105 sl->cdb_cmd_blk[0] = STLINK_DEBUG_COMMAND;
106 sl->q_data_dir = Q_DATA_IN;
109 // E.g. make the valgrind happy.
111 static void clear_buf(stlink_t *sl) {
112 DD(sl, "*** clear_buf ***\n");
113 for (size_t i = 0; i < sizeof (sl->q_buf); i++)
118 // close the device, free the allocated memory
120 void _stlink_sg_close(stlink_t *sl) {
122 struct stlink_libsg *slsg = sl->backend_data;
123 scsi_pt_close_device(slsg->sg_fd);
129 //TODO rewrite/cleanup, save the error in sl
131 static void stlink_confirm_inq(stlink_t *stl, struct sg_pt_base *ptvp) {
132 struct stlink_libsg *sl = stl->backend_data;
133 const int e = sl->do_scsi_pt_err;
135 fprintf(stderr, "scsi_pt error: pass through os error: %s\n",
138 } else if (e == SCSI_PT_DO_BAD_PARAMS) {
139 fprintf(stderr, "scsi_pt error: bad pass through setup\n");
141 } else if (e == SCSI_PT_DO_TIMEOUT) {
142 fprintf(stderr, " pass through timeout\n");
145 const int duration = get_scsi_pt_duration_ms(ptvp);
146 if ((stl->verbose > 1) && (duration >= 0))
147 DD(stl, " duration=%d ms\n", duration);
149 // XXX stlink fw sends broken residue, so ignore it and use the known q_len
150 // "usb-storage quirks=483:3744:r"
151 // forces residue to be ignored and calculated, but this causes aboard if
152 // data_len = 0 and by some other data_len values.
154 const int resid = get_scsi_pt_resid(ptvp);
155 const int dsize = stl->q_len - resid;
157 const int cat = get_scsi_pt_result_category(ptvp);
162 case SCSI_PT_RESULT_GOOD:
163 if (stl->verbose && (resid > 0))
164 DD(stl, " notice: requested %d bytes but "
165 "got %d bytes, ignore [broken] residue = %d\n",
166 stl->q_len, dsize, resid);
168 case SCSI_PT_RESULT_STATUS:
170 sg_get_scsi_status_str(
171 get_scsi_pt_status_response(ptvp), sizeof (buf),
173 DD(stl, " scsi status: %s\n", buf);
176 case SCSI_PT_RESULT_SENSE:
177 slen = get_scsi_pt_sense_len(ptvp);
179 sg_get_sense_str("", sl->sense_buf, slen, (stl->verbose
180 > 1), sizeof (buf), buf);
183 if (stl->verbose && (resid > 0)) {
184 if ((stl->verbose) || (stl->q_len > 0))
185 DD(stl, " requested %d bytes but "
186 "got %d bytes\n", stl->q_len, dsize);
189 case SCSI_PT_RESULT_TRANSPORT_ERR:
191 get_scsi_pt_transport_err_str(ptvp, sizeof (buf), buf);
192 // http://tldp.org/HOWTO/SCSI-Generic-HOWTO/x291.html
193 // These codes potentially come from the firmware on a host adapter
194 // or from one of several hosts that an adapter driver controls.
195 // The 'host_status' field has the following values:
196 // [0x07] Internal error detected in the host adapter.
197 // This may not be fatal (and the command may have succeeded).
198 DD(stl, " transport: %s", buf);
201 case SCSI_PT_RESULT_OS_ERR:
203 get_scsi_pt_os_err_str(ptvp, sizeof (buf), buf);
204 DD(stl, " os: %s", buf);
208 fprintf(stderr, " unknown pass through result "
209 "category (%d)\n", cat);
213 void stlink_q(stlink_t *sl) {
214 struct stlink_libsg* sg = sl->backend_data;
216 for (int i = 0; i < CDB_SL; i++)
217 DD(sl, " 0x%02x", (unsigned int) sg->cdb_cmd_blk[i]);
220 // Get control command descriptor of scsi structure,
221 // (one object per command!!)
222 struct sg_pt_base *ptvp = construct_scsi_pt_obj();
224 fprintf(stderr, "construct_scsi_pt_obj: out of memory\n");
228 set_scsi_pt_cdb(ptvp, sg->cdb_cmd_blk, sizeof (sg->cdb_cmd_blk));
230 // set buffer for sense (error information) data
231 set_scsi_pt_sense(ptvp, sg->sense_buf, sizeof (sg->sense_buf));
233 // Set a buffer to be used for data transferred from device
234 if (sg->q_data_dir == Q_DATA_IN) {
236 set_scsi_pt_data_in(ptvp, sl->q_buf, sl->q_len);
238 set_scsi_pt_data_out(ptvp, sl->q_buf, sl->q_len);
240 // Executes SCSI command (or at least forwards it to lower layers).
241 sg->do_scsi_pt_err = do_scsi_pt(ptvp, sg->sg_fd, SG_TIMEOUT_SEC,
244 // check for scsi errors
245 stlink_confirm_inq(sl, ptvp);
246 // TODO recycle: clear_scsi_pt_obj(struct sg_pt_base * objp);
247 destruct_scsi_pt_obj(ptvp);
250 // TODO thinking, cleanup
252 void stlink_stat(stlink_t *stl, char *txt) {
256 stlink_print_data(stl);
258 switch (stl->q_buf[0]) {
260 DD(stl, " %s: ok\n", txt);
263 DD(stl, " %s: false\n", txt);
266 DD(stl, " %s: unknown\n", txt);
271 void _stlink_sg_version(stlink_t *stl) {
272 struct stlink_libsg *sl = stl->backend_data;
273 D(stl, "\n*** stlink_version ***\n");
275 sl->cdb_cmd_blk[0] = STLINK_GET_VERSION;
282 // STLINK_DEV_DFU_MODE || STLINK_DEV_MASS_MODE || STLINK_DEV_DEBUG_MODE
283 // usb dfu || usb mass || jtag or swd
285 int _stlink_sg_current_mode(stlink_t *stl) {
286 struct stlink_libsg *sl = stl->backend_data;
288 sl->cdb_cmd_blk[0] = STLINK_GET_CURRENT_MODE;
292 return stl->q_buf[0];
295 // Exit the mass mode and enter the swd debug mode.
297 void _stlink_sg_enter_swd_mode(stlink_t *sl) {
298 struct stlink_libsg *sg = sl->backend_data;
300 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
301 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_SWD;
302 sl->q_len = 0; // >0 -> aboard
306 // Exit the mass mode and enter the jtag debug mode.
307 // (jtag is disabled in the discovery's stlink firmware)
309 void _stlink_sg_enter_jtag_mode(stlink_t *sl) {
310 struct stlink_libsg *sg = sl->backend_data;
311 D(sl, "\n*** stlink_enter_jtag_mode ***\n");
313 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
314 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_JTAG;
319 // XXX kernel driver performs reset, the device temporally disappears
321 void _stlink_sg_exit_dfu_mode(stlink_t *sl) {
322 struct stlink_libsg *sg = sl->backend_data;
323 D(sl, "\n*** stlink_exit_dfu_mode ***\n");
325 sg->cdb_cmd_blk[0] = STLINK_DFU_COMMAND;
326 sg->cdb_cmd_blk[1] = STLINK_DFU_EXIT;
330 [135121.844564] sd 19:0:0:0: [sdb] Unhandled error code
331 [135121.844569] sd 19:0:0:0: [sdb] Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
332 [135121.844574] sd 19:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 10 00 00 00 08 00
333 [135121.844584] end_request: I/O error, dev sdb, sector 4096
334 [135121.844590] Buffer I/O error on device sdb, logical block 512
335 [135130.122567] usb 6-1: reset full speed USB device using uhci_hcd and address 7
336 [135130.274551] usb 6-1: device firmware changed
337 [135130.274618] usb 6-1: USB disconnect, address 7
338 [135130.275186] VFS: busy inodes on changed media or resized disk sdb
339 [135130.275424] VFS: busy inodes on changed media or resized disk sdb
340 [135130.286758] VFS: busy inodes on changed media or resized disk sdb
341 [135130.292796] VFS: busy inodes on changed media or resized disk sdb
342 [135130.301481] VFS: busy inodes on changed media or resized disk sdb
343 [135130.304316] VFS: busy inodes on changed media or resized disk sdb
344 [135130.431113] usb 6-1: new full speed USB device using uhci_hcd and address 8
345 [135130.629444] usb-storage 6-1:1.0: Quirks match for vid 0483 pid 3744: 102a1
346 [135130.629492] scsi20 : usb-storage 6-1:1.0
347 [135131.625600] scsi 20:0:0:0: Direct-Access STM32 PQ: 0 ANSI: 0
348 [135131.627010] sd 20:0:0:0: Attached scsi generic sg2 type 0
349 [135131.633603] sd 20:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
350 [135131.633613] sd 20:0:0:0: [sdb] Assuming Write Enabled
351 [135131.633620] sd 20:0:0:0: [sdb] Assuming drive cache: write through
352 [135131.640584] sd 20:0:0:0: [sdb] Assuming Write Enabled
353 [135131.640592] sd 20:0:0:0: [sdb] Assuming drive cache: write through
355 [135131.652634] sd 20:0:0:0: [sdb] Assuming Write Enabled
356 [135131.652639] sd 20:0:0:0: [sdb] Assuming drive cache: write through
357 [135131.652645] sd 20:0:0:0: [sdb] Attached SCSI removable disk
358 [135131.671536] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
359 [135131.671548] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
360 [135131.671553] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
361 [135131.671560] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
362 [135131.671570] end_request: I/O error, dev sdb, sector 63872
363 [135131.671575] Buffer I/O error on device sdb, logical block 7984
364 [135131.678527] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
365 [135131.678532] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
366 [135131.678537] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
367 [135131.678542] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
368 [135131.678551] end_request: I/O error, dev sdb, sector 63872
370 [135131.853565] end_request: I/O error, dev sdb, sector 4096
374 void _stlink_sg_core_id(stlink_t *sl) {
375 struct stlink_libsg *sg = sl->backend_data;
377 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READCOREID;
381 sl->core_id = read_uint32(sl->q_buf, 0);
384 // Arm-core reset -> halted state.
386 void _stlink_sg_reset(stlink_t *sl) {
387 struct stlink_libsg *sg = sl->backend_data;
389 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RESETSYS;
393 stlink_stat(sl, "core reset");
396 // Arm-core status: halted or running.
398 void _stlink_sg_status(stlink_t *sl) {
399 struct stlink_libsg *sg = sl->backend_data;
400 D(sl, "\n*** stlink_status ***\n");
402 sg->cdb_cmd_blk[1] = STLINK_DEBUG_GETSTATUS;
408 // Force the core into the debug mode -> halted state.
410 void _stlink_sg_force_debug(stlink_t *sl) {
411 struct stlink_libsg *sg = sl->backend_data;
412 D(sl, "\n*** stlink_force_debug ***\n");
414 sg->cdb_cmd_blk[1] = STLINK_DEBUG_FORCEDEBUG;
418 stlink_stat(sl, "force debug");
421 // Read all arm-core registers.
423 void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) {
424 struct stlink_libsg *sg = sl->backend_data;
430 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS;
434 stlink_print_data(sl);
436 // TODO - most of this should be re-extracted up....
438 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
439 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
440 for (int i = 0; i < 16; i++) {
441 sg->reg.r[i] = read_uint32(sl->q_buf, 4 * i);
443 DD(sl, "r%2d = 0x%08x\n", i, sg->reg.r[i]);
445 sg->reg.xpsr = read_uint32(sl->q_buf, 64);
446 sg->reg.main_sp = read_uint32(sl->q_buf, 68);
447 sg->reg.process_sp = read_uint32(sl->q_buf, 72);
448 sg->reg.rw = read_uint32(sl->q_buf, 76);
449 sg->reg.rw2 = read_uint32(sl->q_buf, 80);
453 DD(sl, "xpsr = 0x%08x\n", sg->reg.xpsr);
454 DD(sl, "main_sp = 0x%08x\n", sg->reg.main_sp);
455 DD(sl, "process_sp = 0x%08x\n", sg->reg.process_sp);
456 DD(sl, "rw = 0x%08x\n", sg->reg.rw);
457 DD(sl, "rw2 = 0x%08x\n", sg->reg.rw2);
460 // Read an arm-core register, the index must be in the range 0..20.
461 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
462 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
464 void _stlink_sg_read_reg(stlink_t *sl, int r_idx, reg *regp) {
465 struct stlink_libsg *sg = sl->backend_data;
467 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READREG;
468 sg->cdb_cmd_blk[2] = r_idx;
472 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
473 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
474 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
475 stlink_print_data(sl);
477 uint32_t r = read_uint32(sl->q_buf, 0);
478 DD(sl, "r_idx (%2d) = 0x%08x\n", r_idx, r);
488 regp->process_sp = r;
491 regp->rw = r; //XXX ?(primask, basemask etc.)
494 regp->rw2 = r; //XXX ?(primask, basemask etc.)
501 // Write an arm-core register. Index:
502 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
503 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
505 void _stlink_sg_write_reg(stlink_t *sl, uint32_t reg, int idx) {
506 struct stlink_libsg *sg = sl->backend_data;
508 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEREG;
511 sg->cdb_cmd_blk[2] = idx;
512 write_uint32(sg->cdb_cmd_blk + 3, reg);
516 stlink_stat(sl, "write reg");
519 // Write a register of the debug module of the core.
520 // XXX ?(atomic writes)
523 void stlink_write_dreg(stlink_t *sl, uint32_t reg, uint32_t addr) {
524 struct stlink_libsg *sg = sl->backend_data;
525 D(sl, "\n*** stlink_write_dreg ***\n");
527 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEDEBUGREG;
528 // 2-5: address of reg of the debug module
530 write_uint32(sg->cdb_cmd_blk + 2, addr);
531 write_uint32(sg->cdb_cmd_blk + 6, reg);
535 stlink_stat(sl, "write debug reg");
538 // Force the core exit the debug mode.
540 void _stlink_sg_run(stlink_t *sl) {
541 struct stlink_libsg *sg = sl->backend_data;
542 D(sl, "\n*** stlink_run ***\n");
544 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RUNCORE;
548 stlink_stat(sl, "run core");
551 // Step the arm-core.
553 void _stlink_sg_step(stlink_t *sl) {
554 struct stlink_libsg *sg = sl->backend_data;
556 sg->cdb_cmd_blk[1] = STLINK_DEBUG_STEPCORE;
560 stlink_stat(sl, "step core");
564 // see Cortex-M3 Technical Reference Manual
565 // TODO make delegate!
566 void stlink_set_hw_bp(stlink_t *sl, int fp_nr, uint32_t addr, int fp) {
567 D(sl, "\n*** stlink_set_hw_bp ***\n");
568 struct stlink_libsg *sg = sl->backend_data;
570 sg->cdb_cmd_blk[1] = STLINK_DEBUG_SETFP;
571 // 2:The number of the flash patch used to set the breakpoint
572 // 3-6: Address of the breakpoint (LSB)
573 // 7: FP_ALL (0x02) / FP_UPPER (0x01) / FP_LOWER (0x00)
574 sl->q_buf[2] = fp_nr;
575 write_uint32(sl->q_buf, addr);
580 stlink_stat(sl, "set flash breakpoint");
585 // TODO make delegate!
586 void stlink_clr_hw_bp(stlink_t *sl, int fp_nr) {
587 struct stlink_libsg *sg = sl->backend_data;
588 D(sl, "\n*** stlink_clr_hw_bp ***\n");
590 sg->cdb_cmd_blk[1] = STLINK_DEBUG_CLEARFP;
591 sg->cdb_cmd_blk[2] = fp_nr;
595 stlink_stat(sl, "clear flash breakpoint");
598 // Read a "len" bytes to the sl->q_buf from the memory, max 6kB (6144 bytes)
600 void _stlink_sg_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
601 struct stlink_libsg *sg = sl->backend_data;
603 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READMEM_32BIT;
606 write_uint32(sg->cdb_cmd_blk + 2, addr);
607 write_uint16(sg->cdb_cmd_blk + 6, len);
609 // data_in 0-0x40-len
610 // !!! len _and_ q_len must be max 6k,
611 // i.e. >1024 * 6 = 6144 -> aboard)
612 // !!! if len < q_len: 64*k, 1024*n, n=1..5 -> aboard
613 // (broken residue issue)
617 stlink_print_data(sl);
620 // Write a "len" bytes from the sl->q_buf to the memory, max 64 Bytes.
622 void _stlink_sg_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
623 struct stlink_libsg *sg = sl->backend_data;
625 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_8BIT;
627 // 6-7: len (>0x40 (64) -> aboard)
628 write_uint32(sg->cdb_cmd_blk + 2, addr);
629 write_uint16(sg->cdb_cmd_blk + 6, len);
634 sg->q_data_dir = Q_DATA_OUT;
636 stlink_print_data(sl);
639 // Write a "len" bytes from the sl->q_buf to the memory, max Q_BUF_LEN bytes.
641 void _stlink_sg_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
642 struct stlink_libsg *sg = sl->backend_data;
644 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_32BIT;
646 // 6-7: len "unlimited"
647 write_uint32(sg->cdb_cmd_blk + 2, addr);
648 write_uint16(sg->cdb_cmd_blk + 6, len);
650 // data_out 0-0x40-...-len
653 sg->q_data_dir = Q_DATA_OUT;
655 stlink_print_data(sl);
658 #if 0 /* not working */
660 static int write_flash_mem16
661 (struct stlink* sl, uint32_t addr, uint16_t val) {
662 /* half word writes */
663 if (addr % 2) return -1;
665 /* unlock if locked */
668 /* set flash programming chosen bit */
671 write_uint16(sl->q_buf, val);
672 stlink_write_mem16(sl, addr, 2);
674 /* wait for non business */
679 /* check the programmed value back */
680 stlink_read_mem16(sl, addr, 2);
681 if (*(const uint16_t*) sl->q_buf != val) {
682 /* values differ at i * sizeof(uint16_t) */
689 #endif /* not working */
691 // Exit the jtag or swd mode and enter the mass mode.
693 void _stlink_sg_exit_debug_mode(stlink_t *stl) {
696 struct stlink_libsg* sl = stl->backend_data;
698 sl->cdb_cmd_blk[1] = STLINK_DEBUG_EXIT;
699 stl->q_len = 0; // >0 -> aboard
705 // 1) open a sg device, switch the stlink from dfu to mass mode
706 // 2) wait 5s until the kernel driver stops reseting the broken device
707 // 3) reopen the device
708 // 4) the device driver is now ready for a switch to jtag/swd mode
709 // TODO thinking, better error handling, wait until the kernel driver stops reseting the plugged-in device
711 stlink_backend_t _stlink_sg_backend = {
713 _stlink_sg_exit_debug_mode,
714 _stlink_sg_enter_swd_mode,
715 _stlink_sg_enter_jtag_mode,
716 _stlink_sg_exit_dfu_mode,
722 _stlink_sg_read_mem32,
723 _stlink_sg_write_mem32,
724 _stlink_sg_write_mem8,
725 _stlink_sg_read_all_regs,
727 _stlink_sg_write_reg,
729 _stlink_sg_current_mode,
730 _stlink_sg_force_debug
733 stlink_t* stlink_open(const char *dev_name, const int verbose) {
734 fprintf(stderr, "\n*** stlink_open [%s] ***\n", dev_name);
735 int sg_fd = scsi_pt_open_device(dev_name, RDWR, verbose);
737 fprintf(stderr, "error opening device: %s: %s\n", dev_name,
738 safe_strerror(-sg_fd));
742 stlink_t *sl = malloc(sizeof (stlink_t));
743 struct stlink_libsg *slsg = malloc(sizeof (struct stlink_libsg));
744 if (sl == NULL || slsg == NULL) {
745 fprintf(stderr, "Couldn't malloc stlink and stlink_sg structures out of memory!\n");
748 sl->verbose = verbose;
749 sl->backend_data = slsg;
750 sl->backend = &_stlink_sg_backend;
753 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
757 /* flash memory settings */
758 sl->flash_base = STM32_FLASH_BASE;
759 sl->flash_size = STM32_FLASH_SIZE;
760 sl->flash_pgsz = STM32_FLASH_PGSZ;
763 sl->sys_base = STM32_SYSTEM_BASE;
764 sl->sys_size = STM32_SYSTEM_SIZE;
766 /* sram memory settings */
767 sl->sram_base = STM32_SRAM_BASE;
768 sl->sram_size = STM32_SRAM_SIZE;
775 stlink_t* stlink_quirk_open(const char *dev_name, const int verbose) {
777 stlink_t *sl = stlink_open(dev_name, verbose);
779 fputs("Error: could not open stlink device\n", stderr);
784 struct stlink_libsg *sg = sl->backend_data;
786 if ((sl->version.st_vid != USB_ST_VID) || (sl->version.stlink_pid != USB_STLINK_PID)) {
787 fprintf(stderr, "Error: the device %s is not a stlink\n",
789 fprintf(stderr, " VID: got %04x expect %04x \n",
790 sl->version.st_vid, USB_ST_VID);
791 fprintf(stderr, " PID: got %04x expect %04x \n",
792 sl->version.stlink_pid, USB_STLINK_PID);
796 D(sl, "\n*** stlink_force_open ***\n");
797 switch (stlink_current_mode(sl)) {
798 case STLINK_DEV_MASS_MODE:
800 case STLINK_DEV_DEBUG_MODE:
804 DD(sl, "\n*** switch the stlink to mass mode ***\n");
805 _stlink_sg_exit_dfu_mode(sl);
806 // exit the dfu mode -> the device is gone
807 DD(sl, "\n*** reopen the stlink device ***\n");
812 sl = stlink_open(dev_name, verbose);
814 fputs("Error: could not open stlink device\n", stderr);
817 // re-query device info
822 static void __attribute__((unused)) mark_buf(stlink_t *sl) {
829 sl->q_buf[15] = 0x42;
830 sl->q_buf[16] = 0x43;
831 sl->q_buf[63] = 0x42;
832 sl->q_buf[64] = 0x43;
833 sl->q_buf[1024 * 6 - 1] = 0x42; //6kB
834 sl->q_buf[1024 * 8 - 1] = 0x42; //8kB