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"
85 #include "stlink-sg.h"
88 // Suspends execution of the calling process for
89 // (at least) ms milliseconds.
91 static void delay(int ms) {
92 //fprintf(stderr, "*** wait %d ms\n", ms);
96 static void clear_cdb(struct stlink_libsg *sl) {
97 for (size_t i = 0; i < sizeof (sl->cdb_cmd_blk); i++)
98 sl->cdb_cmd_blk[i] = 0;
100 sl->cdb_cmd_blk[0] = STLINK_DEBUG_COMMAND;
101 sl->q_data_dir = Q_DATA_IN;
104 // E.g. make the valgrind happy.
106 static void clear_buf(stlink_t *sl) {
107 DD(sl, "*** clear_buf ***\n");
108 for (size_t i = 0; i < sizeof (sl->q_buf); i++)
113 // close the device, free the allocated memory
115 void _stlink_sg_close(stlink_t *sl) {
118 struct stlink_libsg *slsg = sl->backend_data;
119 scsi_pt_close_device(slsg->sg_fd);
126 //TODO rewrite/cleanup, save the error in sl
129 static void stlink_confirm_inq(stlink_t *stl, struct sg_pt_base *ptvp) {
130 struct stlink_libsg *sl = stl->backend_data;
131 const int e = sl->do_scsi_pt_err;
133 fprintf(stderr, "scsi_pt error: pass through os error: %s\n",
136 } else if (e == SCSI_PT_DO_BAD_PARAMS) {
137 fprintf(stderr, "scsi_pt error: bad pass through setup\n");
139 } else if (e == SCSI_PT_DO_TIMEOUT) {
140 fprintf(stderr, " pass through timeout\n");
143 const int duration = get_scsi_pt_duration_ms(ptvp);
144 if ((stl->verbose > 1) && (duration >= 0))
145 DD(stl, " duration=%d ms\n", duration);
147 // XXX stlink fw sends broken residue, so ignore it and use the known q_len
148 // "usb-storage quirks=483:3744:r"
149 // forces residue to be ignored and calculated, but this causes aboard if
150 // data_len = 0 and by some other data_len values.
152 const int resid = get_scsi_pt_resid(ptvp);
153 const int dsize = stl->q_len - resid;
155 const int cat = get_scsi_pt_result_category(ptvp);
160 case SCSI_PT_RESULT_GOOD:
161 if (stl->verbose && (resid > 0))
162 DD(stl, " notice: requested %d bytes but "
163 "got %d bytes, ignore [broken] residue = %d\n",
164 stl->q_len, dsize, resid);
166 case SCSI_PT_RESULT_STATUS:
168 sg_get_scsi_status_str(
169 get_scsi_pt_status_response(ptvp), sizeof (buf),
171 DD(stl, " scsi status: %s\n", buf);
174 case SCSI_PT_RESULT_SENSE:
175 slen = get_scsi_pt_sense_len(ptvp);
177 sg_get_sense_str("", sl->sense_buf, slen, (stl->verbose
178 > 1), sizeof (buf), buf);
181 if (stl->verbose && (resid > 0)) {
182 if ((stl->verbose) || (stl->q_len > 0))
183 DD(stl, " requested %d bytes but "
184 "got %d bytes\n", stl->q_len, dsize);
187 case SCSI_PT_RESULT_TRANSPORT_ERR:
189 get_scsi_pt_transport_err_str(ptvp, sizeof (buf), buf);
190 // http://tldp.org/HOWTO/SCSI-Generic-HOWTO/x291.html
191 // These codes potentially come from the firmware on a host adapter
192 // or from one of several hosts that an adapter driver controls.
193 // The 'host_status' field has the following values:
194 // [0x07] Internal error detected in the host adapter.
195 // This may not be fatal (and the command may have succeeded).
196 DD(stl, " transport: %s", buf);
199 case SCSI_PT_RESULT_OS_ERR:
201 get_scsi_pt_os_err_str(ptvp, sizeof (buf), buf);
202 DD(stl, " os: %s", buf);
206 fprintf(stderr, " unknown pass through result "
207 "category (%d)\n", cat);
212 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);
251 // TODO thinking, cleanup
253 void stlink_stat(stlink_t *stl, char *txt) {
257 stlink_print_data(stl);
259 switch (stl->q_buf[0]) {
261 DD(stl, " %s: ok\n", txt);
264 DD(stl, " %s: false\n", txt);
267 DD(stl, " %s: unknown\n", txt);
272 static void parse_version(stlink_t *stl) {
273 struct stlink_libsg *sl = stl->backend_data;
278 if (stl->q_len <= 0) {
279 fprintf(stderr, "Error: could not parse the stlink version");
283 uint32_t b0 = stl->q_buf[0]; //lsb
284 uint32_t b1 = stl->q_buf[1];
285 uint32_t b2 = stl->q_buf[2];
286 uint32_t b3 = stl->q_buf[3];
287 uint32_t b4 = stl->q_buf[4];
288 uint32_t b5 = stl->q_buf[5]; //msb
290 // b0 b1 || b2 b3 | b4 b5
291 // 4b | 6b | 6b || 2B | 2B
292 // stlink_v | jtag_v | swim_v || st_vid | stlink_pid
294 sl->stlink_v = (b0 & 0xf0) >> 4;
295 sl->jtag_v = ((b0 & 0x0f) << 2) | ((b1 & 0xc0) >> 6);
296 sl->swim_v = b1 & 0x3f;
297 sl->st_vid = (b3 << 8) | b2;
298 sl->stlink_pid = (b5 << 8) | b4;
301 void _stlink_sg_version(stlink_t *stl) {
302 struct stlink_libsg *sl = stl->backend_data;
303 D(stl, "\n*** stlink_version ***\n");
305 sl->cdb_cmd_blk[0] = STLINK_GET_VERSION;
313 // STLINK_DEV_DFU_MODE || STLINK_DEV_MASS_MODE || STLINK_DEV_DEBUG_MODE
314 // usb dfu || usb mass || jtag or swd
316 int _stlink_sg_current_mode(stlink_t *stl) {
317 struct stlink_libsg *sl = stl->backend_data;
319 sl->cdb_cmd_blk[0] = STLINK_GET_CURRENT_MODE;
323 return stl->q_buf[0];
326 // Exit the mass mode and enter the swd debug mode.
328 void _stlink_sg_enter_swd_mode(stlink_t *sl) {
329 struct stlink_libsg *sg = sl->backend_data;
331 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
332 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_SWD;
333 sl->q_len = 0; // >0 -> aboard
337 // Exit the mass mode and enter the jtag debug mode.
338 // (jtag is disabled in the discovery's stlink firmware)
340 void _stlink_sg_enter_jtag_mode(stlink_t *sl) {
341 struct stlink_libsg *sg = sl->backend_data;
342 D(sl, "\n*** stlink_enter_jtag_mode ***\n");
344 sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
345 sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_JTAG;
350 // XXX kernel driver performs reset, the device temporally disappears
352 void _stlink_sg_exit_dfu_mode(stlink_t *sl) {
353 struct stlink_libsg *sg = sl->backend_data;
354 D(sl, "\n*** stlink_exit_dfu_mode ***\n");
356 sg->cdb_cmd_blk[0] = STLINK_DFU_COMMAND;
357 sg->cdb_cmd_blk[1] = STLINK_DFU_EXIT;
361 [135121.844564] sd 19:0:0:0: [sdb] Unhandled error code
362 [135121.844569] sd 19:0:0:0: [sdb] Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
363 [135121.844574] sd 19:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 10 00 00 00 08 00
364 [135121.844584] end_request: I/O error, dev sdb, sector 4096
365 [135121.844590] Buffer I/O error on device sdb, logical block 512
366 [135130.122567] usb 6-1: reset full speed USB device using uhci_hcd and address 7
367 [135130.274551] usb 6-1: device firmware changed
368 [135130.274618] usb 6-1: USB disconnect, address 7
369 [135130.275186] VFS: busy inodes on changed media or resized disk sdb
370 [135130.275424] VFS: busy inodes on changed media or resized disk sdb
371 [135130.286758] VFS: busy inodes on changed media or resized disk sdb
372 [135130.292796] VFS: busy inodes on changed media or resized disk sdb
373 [135130.301481] VFS: busy inodes on changed media or resized disk sdb
374 [135130.304316] VFS: busy inodes on changed media or resized disk sdb
375 [135130.431113] usb 6-1: new full speed USB device using uhci_hcd and address 8
376 [135130.629444] usb-storage 6-1:1.0: Quirks match for vid 0483 pid 3744: 102a1
377 [135130.629492] scsi20 : usb-storage 6-1:1.0
378 [135131.625600] scsi 20:0:0:0: Direct-Access STM32 PQ: 0 ANSI: 0
379 [135131.627010] sd 20:0:0:0: Attached scsi generic sg2 type 0
380 [135131.633603] sd 20:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
381 [135131.633613] sd 20:0:0:0: [sdb] Assuming Write Enabled
382 [135131.633620] sd 20:0:0:0: [sdb] Assuming drive cache: write through
383 [135131.640584] sd 20:0:0:0: [sdb] Assuming Write Enabled
384 [135131.640592] sd 20:0:0:0: [sdb] Assuming drive cache: write through
386 [135131.652634] sd 20:0:0:0: [sdb] Assuming Write Enabled
387 [135131.652639] sd 20:0:0:0: [sdb] Assuming drive cache: write through
388 [135131.652645] sd 20:0:0:0: [sdb] Attached SCSI removable disk
389 [135131.671536] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
390 [135131.671548] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
391 [135131.671553] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
392 [135131.671560] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
393 [135131.671570] end_request: I/O error, dev sdb, sector 63872
394 [135131.671575] Buffer I/O error on device sdb, logical block 7984
395 [135131.678527] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
396 [135131.678532] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
397 [135131.678537] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
398 [135131.678542] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
399 [135131.678551] end_request: I/O error, dev sdb, sector 63872
401 [135131.853565] end_request: I/O error, dev sdb, sector 4096
405 void _stlink_sg_core_id(stlink_t *sl) {
406 struct stlink_libsg *sg = sl->backend_data;
408 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READCOREID;
412 sl->core_id = read_uint32(sl->q_buf, 0);
415 // Arm-core reset -> halted state.
417 void _stlink_sg_reset(stlink_t *sl) {
418 struct stlink_libsg *sg = sl->backend_data;
420 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RESETSYS;
424 stlink_stat(sl, "core reset");
427 // Arm-core status: halted or running.
429 void _stlink_sg_status(stlink_t *sl) {
430 struct stlink_libsg *sg = sl->backend_data;
431 D(sl, "\n*** stlink_status ***\n");
433 sg->cdb_cmd_blk[1] = STLINK_DEBUG_GETSTATUS;
439 // Force the core into the debug mode -> halted state.
441 void _stlink_sg_force_debug(stlink_t *sl) {
442 struct stlink_libsg *sg = sl->backend_data;
443 D(sl, "\n*** stlink_force_debug ***\n");
445 sg->cdb_cmd_blk[1] = STLINK_DEBUG_FORCEDEBUG;
449 stlink_stat(sl, "force debug");
452 // Read all arm-core registers.
454 void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) {
455 struct stlink_libsg *sg = sl->backend_data;
461 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS;
465 stlink_print_data(sl);
467 // TODO - most of this should be re-extracted up....
469 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
470 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
471 for (int i = 0; i < 16; i++) {
472 sg->reg.r[i] = read_uint32(sl->q_buf, 4 * i);
474 DD(sl, "r%2d = 0x%08x\n", i, sg->reg.r[i]);
476 sg->reg.xpsr = read_uint32(sl->q_buf, 64);
477 sg->reg.main_sp = read_uint32(sl->q_buf, 68);
478 sg->reg.process_sp = read_uint32(sl->q_buf, 72);
479 sg->reg.rw = read_uint32(sl->q_buf, 76);
480 sg->reg.rw2 = read_uint32(sl->q_buf, 80);
484 DD(sl, "xpsr = 0x%08x\n", sg->reg.xpsr);
485 DD(sl, "main_sp = 0x%08x\n", sg->reg.main_sp);
486 DD(sl, "process_sp = 0x%08x\n", sg->reg.process_sp);
487 DD(sl, "rw = 0x%08x\n", sg->reg.rw);
488 DD(sl, "rw2 = 0x%08x\n", sg->reg.rw2);
491 // Read an arm-core register, the index must be in the range 0..20.
492 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
493 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
495 void _stlink_sg_read_reg(stlink_t *sl, int r_idx, reg *regp) {
496 struct stlink_libsg *sg = sl->backend_data;
498 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READREG;
499 sg->cdb_cmd_blk[2] = r_idx;
503 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
504 // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71 | 72-75 | 76-79 | 80-83
505 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
506 stlink_print_data(sl);
508 uint32_t r = read_uint32(sl->q_buf, 0);
509 DD(sl, "r_idx (%2d) = 0x%08x\n", r_idx, r);
519 regp->process_sp = r;
522 regp->rw = r; //XXX ?(primask, basemask etc.)
525 regp->rw2 = r; //XXX ?(primask, basemask etc.)
532 // Write an arm-core register. Index:
533 // 0 | 1 | ... | 15 | 16 | 17 | 18 | 19 | 20
534 // r0 | r1 | ... | r15 | xpsr | main_sp | process_sp | rw | rw2
536 void _stlink_sg_write_reg(stlink_t *sl, uint32_t reg, int idx) {
537 struct stlink_libsg *sg = sl->backend_data;
539 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEREG;
542 sg->cdb_cmd_blk[2] = idx;
543 write_uint32(sg->cdb_cmd_blk + 3, reg);
547 stlink_stat(sl, "write reg");
550 // Write a register of the debug module of the core.
551 // XXX ?(atomic writes)
554 void stlink_write_dreg(stlink_t *sl, uint32_t reg, uint32_t addr) {
555 struct stlink_libsg *sg = sl->backend_data;
556 D(sl, "\n*** stlink_write_dreg ***\n");
558 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEDEBUGREG;
559 // 2-5: address of reg of the debug module
561 write_uint32(sg->cdb_cmd_blk + 2, addr);
562 write_uint32(sg->cdb_cmd_blk + 6, reg);
566 stlink_stat(sl, "write debug reg");
569 // Force the core exit the debug mode.
571 void _stlink_sg_run(stlink_t *sl) {
572 struct stlink_libsg *sg = sl->backend_data;
573 D(sl, "\n*** stlink_run ***\n");
575 sg->cdb_cmd_blk[1] = STLINK_DEBUG_RUNCORE;
579 stlink_stat(sl, "run core");
582 // Step the arm-core.
584 void _stlink_sg_step(stlink_t *sl) {
585 struct stlink_libsg *sg = sl->backend_data;
587 sg->cdb_cmd_blk[1] = STLINK_DEBUG_STEPCORE;
591 stlink_stat(sl, "step core");
595 // see Cortex-M3 Technical Reference Manual
596 // TODO make delegate!
597 void stlink_set_hw_bp(stlink_t *sl, int fp_nr, uint32_t addr, int fp) {
598 D(sl, "\n*** stlink_set_hw_bp ***\n");
599 struct stlink_libsg *sg = sl->backend_data;
601 sg->cdb_cmd_blk[1] = STLINK_DEBUG_SETFP;
602 // 2:The number of the flash patch used to set the breakpoint
603 // 3-6: Address of the breakpoint (LSB)
604 // 7: FP_ALL (0x02) / FP_UPPER (0x01) / FP_LOWER (0x00)
605 sl->q_buf[2] = fp_nr;
606 write_uint32(sl->q_buf, addr);
611 stlink_stat(sl, "set flash breakpoint");
616 // TODO make delegate!
617 void stlink_clr_hw_bp(stlink_t *sl, int fp_nr) {
618 struct stlink_libsg *sg = sl->backend_data;
619 D(sl, "\n*** stlink_clr_hw_bp ***\n");
621 sg->cdb_cmd_blk[1] = STLINK_DEBUG_CLEARFP;
622 sg->cdb_cmd_blk[2] = fp_nr;
626 stlink_stat(sl, "clear flash breakpoint");
629 // Read a "len" bytes to the sl->q_buf from the memory, max 6kB (6144 bytes)
631 void _stlink_sg_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
632 struct stlink_libsg *sg = sl->backend_data;
634 sg->cdb_cmd_blk[1] = STLINK_DEBUG_READMEM_32BIT;
637 write_uint32(sg->cdb_cmd_blk + 2, addr);
638 write_uint16(sg->cdb_cmd_blk + 6, len);
640 // data_in 0-0x40-len
641 // !!! len _and_ q_len must be max 6k,
642 // i.e. >1024 * 6 = 6144 -> aboard)
643 // !!! if len < q_len: 64*k, 1024*n, n=1..5 -> aboard
644 // (broken residue issue)
648 stlink_print_data(sl);
651 // Write a "len" bytes from the sl->q_buf to the memory, max 64 Bytes.
653 void _stlink_sg_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
654 struct stlink_libsg *sg = sl->backend_data;
656 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_8BIT;
658 // 6-7: len (>0x40 (64) -> aboard)
659 write_uint32(sg->cdb_cmd_blk + 2, addr);
660 write_uint16(sg->cdb_cmd_blk + 6, len);
665 sg->q_data_dir = Q_DATA_OUT;
667 stlink_print_data(sl);
670 // Write a "len" bytes from the sl->q_buf to the memory, max Q_BUF_LEN bytes.
672 void _stlink_sg_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
673 struct stlink_libsg *sg = sl->backend_data;
675 sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_32BIT;
677 // 6-7: len "unlimited"
678 write_uint32(sg->cdb_cmd_blk + 2, addr);
679 write_uint16(sg->cdb_cmd_blk + 6, len);
681 // data_out 0-0x40-...-len
684 sg->q_data_dir = Q_DATA_OUT;
686 stlink_print_data(sl);
689 #if 0 /* not working */
691 static int write_flash_mem16
692 (struct stlink* sl, uint32_t addr, uint16_t val) {
693 /* half word writes */
694 if (addr % 2) return -1;
696 /* unlock if locked */
699 /* set flash programming chosen bit */
702 write_uint16(sl->q_buf, val);
703 stlink_write_mem16(sl, addr, 2);
705 /* wait for non business */
710 /* check the programmed value back */
711 stlink_read_mem16(sl, addr, 2);
712 if (*(const uint16_t*) sl->q_buf != val) {
713 /* values differ at i * sizeof(uint16_t) */
720 #endif /* not working */
722 // Exit the jtag or swd mode and enter the mass mode.
724 void _stlink_sg_exit_debug_mode(stlink_t *stl) {
727 struct stlink_libsg* sl = stl->backend_data;
729 sl->cdb_cmd_blk[1] = STLINK_DEBUG_EXIT;
730 stl->q_len = 0; // >0 -> aboard
736 // 1) open a sg device, switch the stlink from dfu to mass mode
737 // 2) wait 5s until the kernel driver stops reseting the broken device
738 // 3) reopen the device
739 // 4) the device driver is now ready for a switch to jtag/swd mode
740 // TODO thinking, better error handling, wait until the kernel driver stops reseting the plugged-in device
742 stlink_backend_t _stlink_sg_backend = {
744 _stlink_sg_exit_debug_mode,
745 _stlink_sg_enter_swd_mode,
746 _stlink_sg_enter_jtag_mode,
747 _stlink_sg_exit_dfu_mode,
753 _stlink_sg_read_mem32,
754 _stlink_sg_write_mem32,
755 _stlink_sg_write_mem8,
756 _stlink_sg_read_all_regs,
758 _stlink_sg_write_reg,
760 _stlink_sg_current_mode,
761 _stlink_sg_force_debug
764 stlink_t* stlink_open(const char *dev_name, const int verbose) {
765 fprintf(stderr, "\n*** stlink_open [%s] ***\n", dev_name);
766 int sg_fd = scsi_pt_open_device(dev_name, RDWR, verbose);
768 fprintf(stderr, "error opening device: %s: %s\n", dev_name,
769 safe_strerror(-sg_fd));
773 stlink_t *sl = malloc(sizeof (stlink_t));
774 struct stlink_libsg *slsg = malloc(sizeof (struct stlink_libsg));
775 if (sl == NULL || slsg == NULL) {
776 fprintf(stderr, "Couldn't malloc stlink and stlink_sg structures out of memory!\n");
779 sl->verbose = verbose;
780 sl->backend_data = slsg;
781 sl->backend = &_stlink_sg_backend;
784 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
789 /* flash memory settings */
790 sl->flash_base = STM32_FLASH_BASE;
791 sl->flash_size = STM32_FLASH_SIZE;
792 sl->flash_pgsz = STM32_FLASH_PGSZ;
795 sl->sys_base = STM32_SYSTEM_BASE;
796 sl->sys_size = STM32_SYSTEM_SIZE;
798 /* sram memory settings */
799 sl->sram_base = STM32_SRAM_BASE;
800 sl->sram_size = STM32_SRAM_SIZE;
807 stlink_t* stlink_v1_open(const char *dev_name, const int verbose) {
809 stlink_t *sl = stlink_open(dev_name, verbose);
811 fputs("Error: could not open stlink device\n", stderr);
816 struct stlink_libsg *sg = sl->backend_data;
818 if ((sg->st_vid != USB_ST_VID) || (sg->stlink_pid != USB_STLINK_PID)) {
819 fprintf(stderr, "Error: the device %s is not a stlink\n",
821 fprintf(stderr, " VID: got %04x expect %04x \n",
822 sg->st_vid, USB_ST_VID);
823 fprintf(stderr, " PID: got %04x expect %04x \n",
824 sg->stlink_pid, USB_STLINK_PID);
828 D(sl, "\n*** stlink_force_open ***\n");
829 switch (stlink_current_mode(sl)) {
830 case STLINK_DEV_MASS_MODE:
832 case STLINK_DEV_DEBUG_MODE:
836 DD(sl, "\n*** switch the stlink to mass mode ***\n");
837 _stlink_sg_exit_dfu_mode(sl);
838 // exit the dfu mode -> the device is gone
839 DD(sl, "\n*** reopen the stlink device ***\n");
844 sl = stlink_open(dev_name, verbose);
846 fputs("Error: could not open stlink device\n", stderr);
849 // re-query device info
854 static void __attribute__((unused)) mark_buf(stlink_t *sl) {
861 sl->q_buf[15] = 0x42;
862 sl->q_buf[16] = 0x43;
863 sl->q_buf[63] = 0x42;
864 sl->q_buf[64] = 0x43;
865 sl->q_buf[1024 * 6 - 1] = 0x42; //6kB
866 sl->q_buf[1024 * 8 - 1] = 0x42; //8kB