bfe41574cf9c31426cc0061cf97b854c4411d4c8
[fw/stlink] / src / stlink-sg.c
1 /*
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.
5  *
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.
10  *
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.
14  *
15  * Tested compatibility: linux, gcc >= 4.3.3
16  *
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
21  *
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.
25  *
26  * SB Device Class Definition for Mass Storage Devices:
27  * www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf
28  *
29  * dt           - Data Transfer (IN/OUT)
30  * CBW          - Command Block Wrapper
31  * CSW          - Command Status Wrapper
32  * RFU          - Reserved for Future Use
33  *
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.
38  *
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.
43  *
44  * usb-storage.quirks
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:
49  *
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).
61  *
62  * Example: quirks=0419:aaf5:rl,0421:0433:rc
63  * http://permalink.gmane.org/gmane.linux.usb.general/35053
64  *
65  * For the stlinkv1, you just want the following
66  *
67  * modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i
68  *
69  * Equivalently, you can add a line saying
70  *
71  * options usb-storage quirks=483:3744:i
72  *
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).
75  */
76
77
78 #define __USE_GNU
79 #include <assert.h>
80 #include <stdio.h>
81 #include <string.h>
82 #include <stdarg.h>
83 #include <stdlib.h>
84 #include <unistd.h>
85 #include <fcntl.h>
86 #include <sys/types.h>
87 #include <sys/stat.h>
88 #include "mmap.h"
89
90 #include "stlink-common.h"
91 #include "stlink-sg.h"
92 #include "uglylogging.h"
93
94 static void clear_cdb(struct stlink_libsg *sl) {
95     for (size_t i = 0; i < sizeof (sl->cdb_cmd_blk); i++)
96         sl->cdb_cmd_blk[i] = 0;
97     // set default
98     sl->cdb_cmd_blk[0] = STLINK_DEBUG_COMMAND;
99     sl->q_data_dir = Q_DATA_IN;
100 }
101
102 /**
103  * Close and free any _backend_ related information...
104  * @param sl
105  */
106 void _stlink_sg_close(stlink_t *sl) {
107     if (sl) {
108         struct stlink_libsg *slsg = sl->backend_data;
109         libusb_close(slsg->usb_handle);
110         libusb_exit(slsg->libusb_ctx);
111         free(slsg);
112     }
113 }
114
115 static int get_usb_mass_storage_status(libusb_device_handle *handle, uint8_t endpoint, uint32_t *tag)
116 {
117     unsigned char csw[13];
118     memset(csw, 0, sizeof(csw));
119     int transferred;
120     int ret;
121     int try = 0;
122     do {
123         ret = libusb_bulk_transfer(handle, endpoint, (unsigned char *)&csw, sizeof(csw),
124                 &transferred, SG_TIMEOUT_MSEC);
125         if (ret == LIBUSB_ERROR_PIPE) {
126             libusb_clear_halt(handle, endpoint);
127         }
128         try++;
129     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
130     if (ret != LIBUSB_SUCCESS) {
131         WLOG("%s: receiving failed: %d\n", __func__, ret);
132         return -1;
133     }
134     if (transferred != sizeof(csw)) {
135         WLOG("%s: received unexpected amount: %d\n", __func__, transferred);
136         return -1;
137     }
138
139     uint32_t rsig = read_uint32(csw, 0);
140     uint32_t rtag = read_uint32(csw, 4);
141     /* uint32_t residue = read_uint32(csw, 8); */
142 #define USB_CSW_SIGNATURE 0x53425355  // 'U' 'S' 'B' 'S' (reversed)
143     if (rsig != USB_CSW_SIGNATURE) {
144         WLOG("status signature was invalid: %#x\n", rsig);
145         return -1;
146     }
147     *tag = rtag;
148     uint8_t rstatus = csw[12];
149     return rstatus;
150 }
151
152 static int dump_CDB_command(uint8_t *cdb, uint8_t cdb_len) {
153     char dbugblah[100];
154     char *dbugp = dbugblah;
155     dbugp += sprintf(dbugp, "Sending CDB [");
156     for (uint8_t i = 0; i < cdb_len; i++) {
157         dbugp += sprintf(dbugp, " %#02x", (unsigned int) cdb[i]);
158     }
159     sprintf(dbugp, "]\n");
160     DLOG(dbugblah);
161     return 0;
162 }
163
164 /**
165  * Wraps a CDB mass storage command in the appropriate gunk to get it down
166  * @param handle
167  * @param endpoint
168  * @param cdb
169  * @param cdb_length
170  * @param lun
171  * @param flags
172  * @param expected_rx_size
173  * @return
174  */
175 int send_usb_mass_storage_command(libusb_device_handle *handle, uint8_t endpoint_out,
176         uint8_t *cdb, uint8_t cdb_length,
177         uint8_t lun, uint8_t flags, uint32_t expected_rx_size) {
178     DLOG("Sending usb m-s cmd: cdblen:%d, rxsize=%d\n", cdb_length, expected_rx_size);
179     dump_CDB_command(cdb, cdb_length);
180
181     static uint32_t tag;
182     if (tag == 0) {
183         tag = 1;
184     }
185
186     int try = 0;
187     int ret = 0;
188     int real_transferred;
189     int i = 0;
190
191     uint8_t c_buf[STLINK_SG_SIZE];
192     // tag is allegedly ignored... TODO - verify
193     c_buf[i++] = 'U';
194     c_buf[i++] = 'S';
195     c_buf[i++] = 'B';
196     c_buf[i++] = 'C';
197     write_uint32(&c_buf[i], tag);
198     uint32_t this_tag = tag++;
199     write_uint32(&c_buf[i+4], expected_rx_size);
200     i+= 8;
201     c_buf[i++] = flags;
202     c_buf[i++] = lun;
203
204     c_buf[i++] = cdb_length;
205
206     // Now the actual CDB request
207     assert(cdb_length <= CDB_SL);
208     memcpy(&(c_buf[i]), cdb, cdb_length);
209
210     int sending_length = STLINK_SG_SIZE;
211
212     // send....
213     do {
214         ret = libusb_bulk_transfer(handle, endpoint_out, c_buf, sending_length,
215                 &real_transferred, SG_TIMEOUT_MSEC);
216         if (ret == LIBUSB_ERROR_PIPE) {
217             libusb_clear_halt(handle, endpoint_out);
218         }
219         try++;
220     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
221     if (ret != LIBUSB_SUCCESS) {
222         WLOG("sending failed: %d\n", ret);
223         return -1;
224     }
225     return this_tag;
226 }
227
228
229 /**
230  * Straight from stm8 stlink code...
231  * @param handle
232  * @param endpoint_in
233  * @param endpoint_out
234  */
235     static void
236 get_sense(libusb_device_handle *handle, uint8_t endpoint_in, uint8_t endpoint_out)
237 {
238     DLOG("Fetching sense...\n");
239     uint8_t cdb[16];
240     memset(cdb, 0, sizeof(cdb));
241 #define REQUEST_SENSE 0x03
242 #define REQUEST_SENSE_LENGTH 18
243     cdb[0] = REQUEST_SENSE;
244     cdb[4] = REQUEST_SENSE_LENGTH;
245     uint32_t tag = send_usb_mass_storage_command(handle, endpoint_out, cdb, sizeof(cdb), 0,
246             LIBUSB_ENDPOINT_IN, REQUEST_SENSE_LENGTH);
247     if (tag == 0) {
248         WLOG("refusing to send request sense with tag 0\n");
249         return;
250     }
251     unsigned char sense[REQUEST_SENSE_LENGTH];
252     int transferred;
253     int ret;
254     int try = 0;
255     do {
256         ret = libusb_bulk_transfer(handle, endpoint_in, sense, sizeof(sense),
257                 &transferred, SG_TIMEOUT_MSEC);
258         if (ret == LIBUSB_ERROR_PIPE) {
259             libusb_clear_halt(handle, endpoint_in);
260         }
261         try++;
262     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
263     if (ret != LIBUSB_SUCCESS) {
264         WLOG("receiving sense failed: %d\n", ret);
265         return;
266     }
267     if (transferred != sizeof(sense)) {
268         WLOG("received unexpected amount of sense: %d != %d\n", transferred, sizeof(sense));
269     }
270     uint32_t received_tag;
271     int status = get_usb_mass_storage_status(handle, endpoint_in, &received_tag);
272     if (status != 0) {
273         WLOG("receiving sense failed with status: %02x\n", status);
274         return;
275     }
276     if (sense[0] != 0x70 && sense[0] != 0x71) {
277         WLOG("No sense data\n");
278     } else {
279         WLOG("Sense KCQ: %02X %02X %02X\n", sense[2] & 0x0f, sense[12], sense[13]);
280     }
281 }
282
283 /**
284  * Just send a buffer on an endpoint, no questions asked.
285  * Handles repeats, and time outs.  Also handles reading status reports and sense
286  * @param handle libusb device *
287  * @param endpoint_out sends
288  * @param endpoint_in used to read status reports back in
289  * @param cbuf  what to send
290  * @param length how much to send
291  * @return number of bytes actually sent, or -1 for failures.
292  */
293 int send_usb_data_only(libusb_device_handle *handle, unsigned char endpoint_out,
294         unsigned char endpoint_in, unsigned char *cbuf, unsigned int length) {
295     int ret;
296     int real_transferred;
297     int try = 0;
298     do {
299         ret = libusb_bulk_transfer(handle, endpoint_out, cbuf, length,
300                 &real_transferred, SG_TIMEOUT_MSEC);
301         if (ret == LIBUSB_ERROR_PIPE) {
302             libusb_clear_halt(handle, endpoint_out);
303         }
304         try++;
305     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
306     if (ret != LIBUSB_SUCCESS) {
307         WLOG("sending failed: %d\n", ret);
308         return -1;
309     }
310
311     // now, swallow up the status, so that things behave nicely...
312     uint32_t received_tag;
313     // -ve is for my errors, 0 is good, +ve is libusb sense status bytes
314     int status = get_usb_mass_storage_status(handle, endpoint_in, &received_tag);
315     if (status < 0) {
316         WLOG("receiving status failed: %d\n", status);
317         return -1;
318     }
319     if (status != 0) {
320         WLOG("receiving status not passed :(: %02x\n", status);
321     }
322     if (status == 1) {
323         get_sense(handle, endpoint_in, endpoint_out);
324         return -1;
325     }
326
327     return real_transferred;
328 }
329
330
331 int stlink_q(stlink_t *sl) {
332     struct stlink_libsg* sg = sl->backend_data;
333     //uint8_t cdb_len = 6;  // FIXME varies!!!
334     uint8_t cdb_len = 10;  // FIXME varies!!!
335     uint8_t lun = 0;  // always zero...
336     uint32_t tag = send_usb_mass_storage_command(sg->usb_handle, sg->ep_req,
337             sg->cdb_cmd_blk, cdb_len, lun, LIBUSB_ENDPOINT_IN, sl->q_len);
338
339
340     // now wait for our response...
341     // length copied from stlink-usb...
342     int rx_length = sl->q_len;
343     int try = 0;
344     int real_transferred;
345     int ret;
346     if (rx_length > 0) {
347         do {
348             ret = libusb_bulk_transfer(sg->usb_handle, sg->ep_rep, sl->q_buf, rx_length,
349                     &real_transferred, SG_TIMEOUT_MSEC);
350             if (ret == LIBUSB_ERROR_PIPE) {
351                 libusb_clear_halt(sg->usb_handle, sg->ep_req);
352             }
353             try++;
354         } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
355
356         if (ret != LIBUSB_SUCCESS) {
357             WLOG("Receiving failed: %d\n", ret);
358             return -1;
359         }
360
361         if (real_transferred != rx_length) {
362             WLOG("received unexpected amount: %d != %d\n", real_transferred, rx_length);
363         }
364     }
365
366     uint32_t received_tag;
367     // -ve is for my errors, 0 is good, +ve is libusb sense status bytes
368     int status = get_usb_mass_storage_status(sg->usb_handle, sg->ep_rep, &received_tag);
369     if (status < 0) {
370         WLOG("receiving status failed: %d\n", status);
371         return -1;
372     }
373     if (status != 0) {
374         WLOG("receiving status not passed :(: %02x\n", status);
375     }
376     if (status == 1) {
377         get_sense(sg->usb_handle, sg->ep_rep, sg->ep_req);
378         return -1;
379     }
380     if (received_tag != tag) {
381         WLOG("received tag %d but expected %d\n", received_tag, tag);
382         //return -1;
383     }
384     if (rx_length > 0 && real_transferred != rx_length) {
385         return -1;
386     }
387     return 0;
388 }
389
390 // TODO thinking, cleanup
391
392 void stlink_stat(stlink_t *stl, char *txt) {
393     if (stl->q_len <= 0)
394         return;
395
396     stlink_print_data(stl);
397
398     switch (stl->q_buf[0]) {
399     case STLINK_OK:
400         DLOG("  %s: ok\n", txt);
401         return;
402     case STLINK_FALSE:
403         DLOG("  %s: false\n", txt);
404         return;
405     default:
406         DLOG("  %s: unknown\n", txt);
407     }
408 }
409
410
411 void _stlink_sg_version(stlink_t *stl) {
412     struct stlink_libsg *sl = stl->backend_data;
413     clear_cdb(sl);
414     sl->cdb_cmd_blk[0] = STLINK_GET_VERSION;
415     stl->q_len = 6;
416     sl->q_addr = 0;
417     stlink_q(stl);
418 }
419
420 // Get stlink mode:
421 // STLINK_DEV_DFU_MODE || STLINK_DEV_MASS_MODE || STLINK_DEV_DEBUG_MODE
422 // usb dfu             || usb mass             || jtag or swd
423
424 int _stlink_sg_current_mode(stlink_t *stl) {
425     struct stlink_libsg *sl = stl->backend_data;
426     clear_cdb(sl);
427     sl->cdb_cmd_blk[0] = STLINK_GET_CURRENT_MODE;
428     stl->q_len = 2;
429     sl->q_addr = 0;
430     stlink_q(stl);
431     return stl->q_buf[0];
432 }
433
434 // Exit the mass mode and enter the swd debug mode.
435
436 void _stlink_sg_enter_swd_mode(stlink_t *sl) {
437     struct stlink_libsg *sg = sl->backend_data;
438     clear_cdb(sg);
439     sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
440     sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_SWD;
441     sl->q_len = 0; // >0 -> aboard
442     stlink_q(sl);
443 }
444
445 // Exit the mass mode and enter the jtag debug mode.
446 // (jtag is disabled in the discovery's stlink firmware)
447
448 void _stlink_sg_enter_jtag_mode(stlink_t *sl) {
449     struct stlink_libsg *sg = sl->backend_data;
450     DLOG("\n*** stlink_enter_jtag_mode ***\n");
451     clear_cdb(sg);
452     sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
453     sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_JTAG;
454     sl->q_len = 0;
455     stlink_q(sl);
456 }
457
458 // XXX kernel driver performs reset, the device temporally disappears
459 // Suspect this is no longer the case when we have ignore on? RECHECK
460 void _stlink_sg_exit_dfu_mode(stlink_t *sl) {
461     struct stlink_libsg *sg = sl->backend_data;
462     DLOG("\n*** stlink_exit_dfu_mode ***\n");
463     clear_cdb(sg);
464     sg->cdb_cmd_blk[0] = STLINK_DFU_COMMAND;
465     sg->cdb_cmd_blk[1] = STLINK_DFU_EXIT;
466     sl->q_len = 0; // ??
467     stlink_q(sl);
468     /*
469        [135121.844564] sd 19:0:0:0: [sdb] Unhandled error code
470        [135121.844569] sd 19:0:0:0: [sdb] Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
471        [135121.844574] sd 19:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 10 00 00 00 08 00
472        [135121.844584] end_request: I/O error, dev sdb, sector 4096
473        [135121.844590] Buffer I/O error on device sdb, logical block 512
474        [135130.122567] usb 6-1: reset full speed USB device using uhci_hcd and address 7
475        [135130.274551] usb 6-1: device firmware changed
476        [135130.274618] usb 6-1: USB disconnect, address 7
477        [135130.275186] VFS: busy inodes on changed media or resized disk sdb
478        [135130.275424] VFS: busy inodes on changed media or resized disk sdb
479        [135130.286758] VFS: busy inodes on changed media or resized disk sdb
480        [135130.292796] VFS: busy inodes on changed media or resized disk sdb
481        [135130.301481] VFS: busy inodes on changed media or resized disk sdb
482        [135130.304316] VFS: busy inodes on changed media or resized disk sdb
483        [135130.431113] usb 6-1: new full speed USB device using uhci_hcd and address 8
484        [135130.629444] usb-storage 6-1:1.0: Quirks match for vid 0483 pid 3744: 102a1
485        [135130.629492] scsi20 : usb-storage 6-1:1.0
486        [135131.625600] scsi 20:0:0:0: Direct-Access     STM32                          PQ: 0 ANSI: 0
487        [135131.627010] sd 20:0:0:0: Attached scsi generic sg2 type 0
488        [135131.633603] sd 20:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
489        [135131.633613] sd 20:0:0:0: [sdb] Assuming Write Enabled
490        [135131.633620] sd 20:0:0:0: [sdb] Assuming drive cache: write through
491        [135131.640584] sd 20:0:0:0: [sdb] Assuming Write Enabled
492        [135131.640592] sd 20:0:0:0: [sdb] Assuming drive cache: write through
493        [135131.640609]  sdb:
494        [135131.652634] sd 20:0:0:0: [sdb] Assuming Write Enabled
495        [135131.652639] sd 20:0:0:0: [sdb] Assuming drive cache: write through
496        [135131.652645] sd 20:0:0:0: [sdb] Attached SCSI removable disk
497        [135131.671536] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
498        [135131.671548] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
499        [135131.671553] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
500        [135131.671560] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
501        [135131.671570] end_request: I/O error, dev sdb, sector 63872
502        [135131.671575] Buffer I/O error on device sdb, logical block 7984
503        [135131.678527] sd 20:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
504        [135131.678532] sd 20:0:0:0: [sdb] Sense Key : Illegal Request [current]
505        [135131.678537] sd 20:0:0:0: [sdb] Add. Sense: Logical block address out of range
506        [135131.678542] sd 20:0:0:0: [sdb] CDB: Read(10): 28 00 00 00 f9 80 00 00 08 00
507        [135131.678551] end_request: I/O error, dev sdb, sector 63872
508        ...
509        [135131.853565] end_request: I/O error, dev sdb, sector 4096
510        */
511 }
512
513 void _stlink_sg_core_id(stlink_t *sl) {
514     struct stlink_libsg *sg = sl->backend_data;
515     clear_cdb(sg);
516     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READCOREID;
517     sl->q_len = 4;
518     sg->q_addr = 0;
519     stlink_q(sl);
520     sl->core_id = read_uint32(sl->q_buf, 0);
521 }
522
523 // Arm-core reset -> halted state.
524
525 void _stlink_sg_reset(stlink_t *sl) {
526     struct stlink_libsg *sg = sl->backend_data;
527     clear_cdb(sg);
528     sg->cdb_cmd_blk[1] = STLINK_DEBUG_RESETSYS;
529     sl->q_len = 2;
530     sg->q_addr = 0;
531     stlink_q(sl);
532     stlink_stat(sl, "core reset");
533 }
534
535 // Arm-core reset -> halted state.
536
537 void _stlink_sg_jtag_reset(stlink_t *sl, int value) {
538     struct stlink_libsg *sg = sl->backend_data;
539     clear_cdb(sg);
540     sg->cdb_cmd_blk[1] = STLINK_JTAG_DRIVE_NRST;
541     sg->cdb_cmd_blk[2] = (value)?0:1;
542     sl->q_len = 3;
543     sg->q_addr = 2;
544     stlink_q(sl);
545     stlink_stat(sl, "core reset");
546 }
547
548 // Arm-core status: halted or running.
549
550 void _stlink_sg_status(stlink_t *sl) {
551     struct stlink_libsg *sg = sl->backend_data;
552     clear_cdb(sg);
553     sg->cdb_cmd_blk[1] = STLINK_DEBUG_GETSTATUS;
554     sl->q_len = 2;
555     sg->q_addr = 0;
556     stlink_q(sl);
557 }
558
559 // Force the core into the debug mode -> halted state.
560
561 void _stlink_sg_force_debug(stlink_t *sl) {
562     struct stlink_libsg *sg = sl->backend_data;
563     clear_cdb(sg);
564     sg->cdb_cmd_blk[1] = STLINK_DEBUG_FORCEDEBUG;
565     sl->q_len = 2;
566     sg->q_addr = 0;
567     stlink_q(sl);
568     stlink_stat(sl, "force debug");
569 }
570
571 // Read all arm-core registers.
572
573 void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) {
574     struct stlink_libsg *sg = sl->backend_data;
575
576     clear_cdb(sg);
577     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS;
578     sl->q_len = 84;
579     sg->q_addr = 0;
580     stlink_q(sl);
581     stlink_print_data(sl);
582
583     // TODO - most of this should be re-extracted up....
584
585     // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71   | 72-75      | 76-79 | 80-83
586     // r0  | r1  | ... | r15   | xpsr  | main_sp | process_sp | rw    | rw2
587     for (int i = 0; i < 16; i++) {
588         regp->r[i] = read_uint32(sl->q_buf, 4 * i);
589         if (sl->verbose > 1)
590             DLOG("r%2d = 0x%08x\n", i, regp->r[i]);
591     }
592     regp->xpsr = read_uint32(sl->q_buf, 64);
593     regp->main_sp = read_uint32(sl->q_buf, 68);
594     regp->process_sp = read_uint32(sl->q_buf, 72);
595     regp->rw = read_uint32(sl->q_buf, 76);
596     regp->rw2 = read_uint32(sl->q_buf, 80);
597     if (sl->verbose < 2)
598         return;
599
600     DLOG("xpsr       = 0x%08x\n", regp->xpsr);
601     DLOG("main_sp    = 0x%08x\n", regp->main_sp);
602     DLOG("process_sp = 0x%08x\n", regp->process_sp);
603     DLOG("rw         = 0x%08x\n", regp->rw);
604     DLOG("rw2        = 0x%08x\n", regp->rw2);
605 }
606
607 // Read an arm-core register, the index must be in the range 0..20.
608 //  0  |  1  | ... |  15   |  16   |   17    |   18       |  19   |  20
609 // r0  | r1  | ... | r15   | xpsr  | main_sp | process_sp | rw    | rw2
610
611 void _stlink_sg_read_reg(stlink_t *sl, int r_idx, reg *regp) {
612     struct stlink_libsg *sg = sl->backend_data;
613     clear_cdb(sg);
614     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READREG;
615     sg->cdb_cmd_blk[2] = r_idx;
616     sl->q_len = 4;
617     sg->q_addr = 0;
618     stlink_q(sl);
619     //  0  |  1  | ... |  15   |  16   |   17    |   18       |  19   |  20
620     // 0-3 | 4-7 | ... | 60-63 | 64-67 | 68-71   | 72-75      | 76-79 | 80-83
621     // r0  | r1  | ... | r15   | xpsr  | main_sp | process_sp | rw    | rw2
622     stlink_print_data(sl);
623
624     uint32_t r = read_uint32(sl->q_buf, 0);
625     DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
626
627     switch (r_idx) {
628     case 16:
629         regp->xpsr = r;
630         break;
631     case 17:
632         regp->main_sp = r;
633         break;
634     case 18:
635         regp->process_sp = r;
636         break;
637     case 19:
638         regp->rw = r; //XXX ?(primask, basemask etc.)
639         break;
640     case 20:
641         regp->rw2 = r; //XXX ?(primask, basemask etc.)
642         break;
643     default:
644         regp->r[r_idx] = r;
645     }
646 }
647
648 // Write an arm-core register. Index:
649 //  0  |  1  | ... |  15   |  16   |   17    |   18       |  19   |  20
650 // r0  | r1  | ... | r15   | xpsr  | main_sp | process_sp | rw    | rw2
651
652 void _stlink_sg_write_reg(stlink_t *sl, uint32_t reg, int idx) {
653     struct stlink_libsg *sg = sl->backend_data;
654     clear_cdb(sg);
655     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEREG;
656     //   2: reg index
657     // 3-6: reg content
658     sg->cdb_cmd_blk[2] = idx;
659     write_uint32(sg->cdb_cmd_blk + 3, reg);
660     sl->q_len = 2;
661     sg->q_addr = 0;
662     stlink_q(sl);
663     stlink_stat(sl, "write reg");
664 }
665
666 // Write a register of the debug module of the core.
667 // XXX ?(atomic writes)
668 // TODO test
669
670 void stlink_write_dreg(stlink_t *sl, uint32_t reg, uint32_t addr) {
671     struct stlink_libsg *sg = sl->backend_data;
672     DLOG("\n*** stlink_write_dreg ***\n");
673     clear_cdb(sg);
674     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEDEBUGREG;
675     // 2-5: address of reg of the debug module
676     // 6-9: reg content
677     write_uint32(sg->cdb_cmd_blk + 2, addr);
678     write_uint32(sg->cdb_cmd_blk + 6, reg);
679     sl->q_len = 2;
680     sg->q_addr = addr;
681     stlink_q(sl);
682     stlink_stat(sl, "write debug reg");
683 }
684
685 // Force the core exit the debug mode.
686
687 void _stlink_sg_run(stlink_t *sl) {
688     struct stlink_libsg *sg = sl->backend_data;
689     clear_cdb(sg);
690     sg->cdb_cmd_blk[1] = STLINK_DEBUG_RUNCORE;
691     sl->q_len = 2;
692     sg->q_addr = 0;
693     stlink_q(sl);
694     stlink_stat(sl, "run core");
695 }
696
697 // Step the arm-core.
698
699 void _stlink_sg_step(stlink_t *sl) {
700     struct stlink_libsg *sg = sl->backend_data;
701     clear_cdb(sg);
702     sg->cdb_cmd_blk[1] = STLINK_DEBUG_STEPCORE;
703     sl->q_len = 2;
704     sg->q_addr = 0;
705     stlink_q(sl);
706     stlink_stat(sl, "step core");
707 }
708
709 // TODO test
710 // see Cortex-M3 Technical Reference Manual
711 // TODO make delegate!
712 void stlink_set_hw_bp(stlink_t *sl, int fp_nr, uint32_t addr, int fp) {
713     DLOG("\n*** stlink_set_hw_bp ***\n");
714     struct stlink_libsg *sg = sl->backend_data;
715     clear_cdb(sg);
716     sg->cdb_cmd_blk[1] = STLINK_DEBUG_SETFP;
717     // 2:The number of the flash patch used to set the breakpoint
718     // 3-6: Address of the breakpoint (LSB)
719     // 7: FP_ALL (0x02) / FP_UPPER (0x01) / FP_LOWER (0x00)
720     sl->q_buf[2] = fp_nr;
721     write_uint32(sl->q_buf, addr);
722     sl->q_buf[7] = fp;
723
724     sl->q_len = 2;
725     stlink_q(sl);
726     stlink_stat(sl, "set flash breakpoint");
727 }
728
729 // TODO test
730
731 // TODO make delegate!
732 void stlink_clr_hw_bp(stlink_t *sl, int fp_nr) {
733     struct stlink_libsg *sg = sl->backend_data;
734     DLOG("\n*** stlink_clr_hw_bp ***\n");
735     clear_cdb(sg);
736     sg->cdb_cmd_blk[1] = STLINK_DEBUG_CLEARFP;
737     sg->cdb_cmd_blk[2] = fp_nr;
738
739     sl->q_len = 2;
740     stlink_q(sl);
741     stlink_stat(sl, "clear flash breakpoint");
742 }
743
744 // Read a "len" bytes to the sl->q_buf from the memory, max 6kB (6144 bytes)
745
746 void _stlink_sg_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
747     struct stlink_libsg *sg = sl->backend_data;
748     clear_cdb(sg);
749     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READMEM_32BIT;
750     // 2-5: addr
751     // 6-7: len
752     write_uint32(sg->cdb_cmd_blk + 2, addr);
753     write_uint16(sg->cdb_cmd_blk + 6, len);
754
755     // data_in 0-0x40-len
756     // !!! len _and_ q_len must be max 6k,
757     //     i.e. >1024 * 6 = 6144 -> aboard)
758     // !!! if len < q_len: 64*k, 1024*n, n=1..5  -> aboard
759     //     (broken residue issue)
760     sl->q_len = len;
761     sg->q_addr = addr;
762     stlink_q(sl);
763     stlink_print_data(sl);
764 }
765
766 // Write a "len" bytes from the sl->q_buf to the memory, max 64 Bytes.
767
768 void _stlink_sg_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
769     struct stlink_libsg *sg = sl->backend_data;
770     clear_cdb(sg);
771     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_8BIT;
772     // 2-5: addr
773     // 6-7: len (>0x40 (64) -> aboard)
774     write_uint32(sg->cdb_cmd_blk + 2, addr);
775     write_uint16(sg->cdb_cmd_blk + 6, len);
776
777     // this sends the command...
778     send_usb_mass_storage_command(sg->usb_handle, sg->ep_req, sg->cdb_cmd_blk, CDB_SL, 0, 0, 0);
779     // This sends the data...
780     send_usb_data_only(sg->usb_handle, sg->ep_req, sg->ep_rep, sl->q_buf, len);
781     stlink_print_data(sl);
782 }
783
784 // Write a "len" bytes from the sl->q_buf to the memory, max Q_BUF_LEN bytes.
785
786 void _stlink_sg_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
787     struct stlink_libsg *sg = sl->backend_data;
788     clear_cdb(sg);
789     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_32BIT;
790     // 2-5: addr
791     // 6-7: len "unlimited"
792     write_uint32(sg->cdb_cmd_blk + 2, addr);
793     write_uint16(sg->cdb_cmd_blk + 6, len);
794
795     // this sends the command...
796     send_usb_mass_storage_command(sg->usb_handle, sg->ep_req, sg->cdb_cmd_blk, CDB_SL, 0, 0, 0);
797     // This sends the data...
798     send_usb_data_only(sg->usb_handle, sg->ep_req, sg->ep_rep, sl->q_buf, len);
799
800     stlink_print_data(sl);
801 }
802
803 // Write one DWORD data to memory
804
805 void _stlink_sg_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
806     struct stlink_libsg *sg = sl->backend_data;
807     clear_cdb(sg);
808     sg->cdb_cmd_blk[1] = STLINK_JTAG_WRITEDEBUG_32BIT;
809     // 2-5: addr
810     write_uint32(sg->cdb_cmd_blk + 2, addr);
811     write_uint32(sg->cdb_cmd_blk + 6, data);
812     sl->q_len = 2;
813     stlink_q(sl);
814
815 }
816
817 // Read one DWORD data from memory
818
819 uint32_t _stlink_sg_read_debug32(stlink_t *sl, uint32_t addr) {
820     struct stlink_libsg *sg = sl->backend_data;
821     clear_cdb(sg);
822     sg->cdb_cmd_blk[1] = STLINK_JTAG_READDEBUG_32BIT;
823     // 2-5: addr
824     write_uint32(sg->cdb_cmd_blk + 2, addr);
825     sl->q_len = 8;
826     stlink_q(sl);
827
828     return read_uint32(sl->q_buf, 4);
829 }
830
831 // Exit the jtag or swd mode and enter the mass mode.
832
833 void _stlink_sg_exit_debug_mode(stlink_t *stl) {
834
835     if (stl) {
836         struct stlink_libsg* sl = stl->backend_data;
837         clear_cdb(sl);
838         sl->cdb_cmd_blk[1] = STLINK_DEBUG_EXIT;
839         stl->q_len = 0; // >0 -> aboard
840         stlink_q(stl);
841     }
842 }
843
844
845 // 1) open a sg device, switch the stlink from dfu to mass mode
846 // 2) wait 5s until the kernel driver stops reseting the broken device
847 // 3) reopen the device
848 // 4) the device driver is now ready for a switch to jtag/swd mode
849 // TODO thinking, better error handling, wait until the kernel driver stops reseting the plugged-in device
850
851 stlink_backend_t _stlink_sg_backend = {
852     _stlink_sg_close,
853     _stlink_sg_exit_debug_mode,
854     _stlink_sg_enter_swd_mode,
855     _stlink_sg_enter_jtag_mode,
856     _stlink_sg_exit_dfu_mode,
857     _stlink_sg_core_id,
858     _stlink_sg_reset,
859     _stlink_sg_jtag_reset,
860     _stlink_sg_run,
861     _stlink_sg_status,
862     _stlink_sg_version,
863     _stlink_sg_read_debug32,
864     _stlink_sg_read_mem32,
865     _stlink_sg_write_debug32,
866     _stlink_sg_write_mem32,
867     _stlink_sg_write_mem8,
868     _stlink_sg_read_all_regs,
869     _stlink_sg_read_reg,
870     NULL,                   /* read_all_unsupported_regs */
871     NULL,                   /* read_unsupported_regs */
872     NULL,                   /* write_unsupported_regs */
873     _stlink_sg_write_reg,
874     _stlink_sg_step,
875     _stlink_sg_current_mode,
876     _stlink_sg_force_debug,
877     NULL
878 };
879
880 static stlink_t* stlink_open(const int verbose) {
881
882     stlink_t *sl = malloc(sizeof (stlink_t));
883     memset(sl, 0, sizeof(stlink_t));
884     struct stlink_libsg *slsg = malloc(sizeof (struct stlink_libsg));
885     if (sl == NULL || slsg == NULL) {
886         WLOG("Couldn't malloc stlink and stlink_sg structures out of memory!\n");
887         return NULL;
888     }
889
890     if (libusb_init(&(slsg->libusb_ctx))) {
891         WLOG("failed to init libusb context, wrong version of libraries?\n");
892         free(sl);
893         free(slsg);
894         return NULL;
895     }
896
897     libusb_set_debug(slsg->libusb_ctx, 3);
898
899     slsg->usb_handle = libusb_open_device_with_vid_pid(slsg->libusb_ctx, USB_ST_VID, USB_STLINK_PID);
900     if (slsg->usb_handle == NULL) {
901         WLOG("Failed to find an stlink v1 by VID:PID\n");
902         libusb_close(slsg->usb_handle);
903         libusb_exit(slsg->libusb_ctx);
904         free(sl);
905         free(slsg);
906         return NULL;
907     }
908
909     // TODO
910     // Could read the interface config descriptor, and assert lots of the assumptions
911
912     // assumption: numInterfaces is always 1...
913     if (libusb_kernel_driver_active(slsg->usb_handle, 0) == 1) {
914         int r = libusb_detach_kernel_driver(slsg->usb_handle, 0);
915         if (r < 0) {
916             WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
917             libusb_close(slsg->usb_handle);
918             libusb_exit(slsg->libusb_ctx);
919             free(sl);
920             free(slsg);
921             return NULL;
922         }
923         DLOG("Kernel driver was successfully detached\n");
924     }
925
926     int config;
927     if (libusb_get_configuration(slsg->usb_handle, &config)) {
928         /* this may fail for a previous configured device */
929         WLOG("libusb_get_configuration()\n");
930         libusb_close(slsg->usb_handle);
931         libusb_exit(slsg->libusb_ctx);
932         free(sl);
933         free(slsg);
934         return NULL;
935
936     }
937
938     // assumption: bConfigurationValue is always 1
939     if (config != 1) {
940         WLOG("Your stlink got into a real weird configuration, trying to fix it!\n");
941         DLOG("setting new configuration (%d -> 1)\n", config);
942         if (libusb_set_configuration(slsg->usb_handle, 1)) {
943             /* this may fail for a previous configured device */
944             WLOG("libusb_set_configuration() failed\n");
945             libusb_close(slsg->usb_handle);
946             libusb_exit(slsg->libusb_ctx);
947             free(sl);
948             free(slsg);
949             return NULL;
950         }
951     }
952
953     if (libusb_claim_interface(slsg->usb_handle, 0)) {
954         WLOG("libusb_claim_interface() failed\n");
955         libusb_close(slsg->usb_handle);
956         libusb_exit(slsg->libusb_ctx);
957         free(sl);
958         free(slsg);
959         return NULL;
960     }
961
962     // assumption: endpoint config is fixed mang. really.
963     slsg->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
964     slsg->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
965
966     DLOG("Successfully opened stlinkv1 by libusb :)\n");
967
968     sl->verbose = verbose;
969     sl->backend_data = slsg;
970     sl->backend = &_stlink_sg_backend;
971
972     sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
973     slsg->q_addr = 0;
974
975     return sl;
976 }
977
978
979 stlink_t* stlink_v1_open_inner(const int verbose) {
980     ugly_init(verbose);
981     stlink_t *sl = stlink_open(verbose);
982     if (sl == NULL) {
983         fputs("Error: could not open stlink device\n", stderr);
984         return NULL;
985     }
986
987     stlink_version(sl);
988     if ((sl->version.st_vid != USB_ST_VID) || (sl->version.stlink_pid != USB_STLINK_PID)) {
989         ELOG("WTF? successfully opened, but unable to read version details. BROKEN!\n");
990         return NULL;
991     }
992
993     DLOG("Reading current mode...\n");
994     switch (stlink_current_mode(sl)) {
995     case STLINK_DEV_MASS_MODE:
996         return sl;
997     case STLINK_DEV_DEBUG_MODE:
998         // TODO go to mass?
999         return sl;
1000     default:
1001         ILOG("Current mode unusable, trying to get back to a useful state...\n");
1002         break;
1003     }
1004
1005     DLOG("Attempting to exit DFU mode\n");
1006     _stlink_sg_exit_dfu_mode(sl);
1007
1008     // re-query device info (and retest)
1009     stlink_version(sl);
1010     if ((sl->version.st_vid != USB_ST_VID) || (sl->version.stlink_pid != USB_STLINK_PID)) {
1011         ELOG("WTF? successfully opened, but unable to read version details. BROKEN!\n");
1012         return NULL;
1013     }
1014
1015     return sl;
1016 }
1017
1018 stlink_t* stlink_v1_open(const int verbose, int reset) {
1019     stlink_t *sl = stlink_v1_open_inner(verbose);
1020     if (sl == NULL) {
1021         fputs("Error: could not open stlink device\n", stderr);
1022         return NULL;
1023     }
1024     // by now, it _must_ be fully open and in a useful mode....
1025     stlink_enter_swd_mode(sl);
1026     /* Now we are ready to read the parameters  */
1027     if (reset) {
1028         stlink_reset(sl);
1029     }
1030     stlink_load_device_params(sl);
1031     ILOG("Successfully opened a stlink v1 debugger\n");
1032     return sl;
1033 }