1aefe61351eff02929bc9817796ff3f1168ee7b4
[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 #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)
99
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;
103     // set default
104     sl->cdb_cmd_blk[0] = STLINK_DEBUG_COMMAND;
105     sl->q_data_dir = Q_DATA_IN;
106 }
107
108 /**
109  * Close and free any _backend_ related information...
110  * @param sl
111  */
112 void _stlink_sg_close(stlink_t *sl) {
113     if (sl) {
114         struct stlink_libsg *slsg = sl->backend_data;
115         libusb_close(slsg->usb_handle);
116         libusb_exit(slsg->libusb_ctx);
117         free(slsg);
118     }
119 }
120
121 static int get_usb_mass_storage_status(libusb_device_handle *handle, uint8_t endpoint, uint32_t *tag)
122 {
123     unsigned char csw[13];
124     memset(csw, 0, sizeof(csw));
125     int transferred;
126     int ret;
127     int try = 0;
128     do {
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);
133         }
134         try++;
135     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
136     if (ret != LIBUSB_SUCCESS) {
137         WLOG("%s: receiving failed: %d\n", __func__, ret);
138         return -1;
139     }
140     if (transferred != sizeof(csw)) {
141         WLOG("%s: received unexpected amount: %d\n", __func__, transferred);
142         return -1;
143     }
144
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);
151         return -1;
152     }
153     *tag = rtag;
154     uint8_t rstatus = csw[12];
155     return rstatus;
156 }
157
158 static int dump_CDB_command(uint8_t *cdb, uint8_t cdb_len) {
159     char dbugblah[100];
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]);
164     }
165     sprintf(dbugp, "]\n");
166     DLOG(dbugblah);
167     return 0;
168 }
169
170 /**
171  * Wraps a CDB mass storage command in the appropriate gunk to get it down
172  * @param handle
173  * @param endpoint
174  * @param cdb
175  * @param cdb_length
176  * @param lun
177  * @param flags
178  * @param expected_rx_size
179  * @return
180  */
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);
186
187     static uint32_t tag;
188     if (tag == 0) {
189         tag = 1;
190     }
191
192     int try = 0;
193     int ret = 0;
194     int real_transferred;
195     int i = 0;
196
197     uint8_t c_buf[STLINK_SG_SIZE];
198     // tag is allegedly ignored... TODO - verify
199     c_buf[i++] = 'U';
200     c_buf[i++] = 'S';
201     c_buf[i++] = 'B';
202     c_buf[i++] = 'C';
203     write_uint32(&c_buf[i], tag);
204     uint32_t this_tag = tag++;
205     write_uint32(&c_buf[i+4], expected_rx_size);
206     i+= 8;
207     c_buf[i++] = flags;
208     c_buf[i++] = lun;
209
210     c_buf[i++] = cdb_length;
211
212     // Now the actual CDB request
213     assert(cdb_length <= CDB_SL);
214     memcpy(&(c_buf[i]), cdb, cdb_length);
215
216     int sending_length = STLINK_SG_SIZE;
217
218     // send....
219     do {
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);
224         }
225         try++;
226     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
227     if (ret != LIBUSB_SUCCESS) {
228         WLOG("sending failed: %d\n", ret);
229         return -1;
230     }
231     return this_tag;
232 }
233
234
235 /**
236  * Straight from stm8 stlink code...
237  * @param handle
238  * @param endpoint_in
239  * @param endpoint_out
240  */
241     static void
242 get_sense(libusb_device_handle *handle, uint8_t endpoint_in, uint8_t endpoint_out)
243 {
244     DLOG("Fetching sense...\n");
245     uint8_t cdb[16];
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);
253     if (tag == 0) {
254         WLOG("refusing to send request sense with tag 0\n");
255         return;
256     }
257     unsigned char sense[REQUEST_SENSE_LENGTH];
258     int transferred;
259     int ret;
260     int try = 0;
261     do {
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);
266         }
267         try++;
268     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
269     if (ret != LIBUSB_SUCCESS) {
270         WLOG("receiving sense failed: %d\n", ret);
271         return;
272     }
273     if (transferred != sizeof(sense)) {
274         WLOG("received unexpected amount of sense: %d != %d\n", transferred, sizeof(sense));
275     }
276     uint32_t received_tag;
277     int status = get_usb_mass_storage_status(handle, endpoint_in, &received_tag);
278     if (status != 0) {
279         WLOG("receiving sense failed with status: %02x\n", status);
280         return;
281     }
282     if (sense[0] != 0x70 && sense[0] != 0x71) {
283         WLOG("No sense data\n");
284     } else {
285         WLOG("Sense KCQ: %02X %02X %02X\n", sense[2] & 0x0f, sense[12], sense[13]);
286     }
287 }
288
289 /**
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.
298  */
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) {
301     int ret;
302     int real_transferred;
303     int try = 0;
304     do {
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);
309         }
310         try++;
311     } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
312     if (ret != LIBUSB_SUCCESS) {
313         WLOG("sending failed: %d\n", ret);
314         return -1;
315     }
316
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);
321     if (status < 0) {
322         WLOG("receiving status failed: %d\n", status);
323         return -1;
324     }
325     if (status != 0) {
326         WLOG("receiving status not passed :(: %02x\n", status);
327     }
328     if (status == 1) {
329         get_sense(handle, endpoint_in, endpoint_out);
330         return -1;
331     }
332
333     return real_transferred;
334 }
335
336
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);
344
345
346     // now wait for our response...
347     // length copied from stlink-usb...
348     int rx_length = sl->q_len;
349     int try = 0;
350     int real_transferred;
351     int ret;
352     if (rx_length > 0) {
353         do {
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);
358             }
359             try++;
360         } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
361
362         if (ret != LIBUSB_SUCCESS) {
363             WLOG("Receiving failed: %d\n", ret);
364             return -1;
365         }
366
367         if (real_transferred != rx_length) {
368             WLOG("received unexpected amount: %d != %d\n", real_transferred, rx_length);
369         }
370     }
371
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);
375     if (status < 0) {
376         WLOG("receiving status failed: %d\n", status);
377         return -1;
378     }
379     if (status != 0) {
380         WLOG("receiving status not passed :(: %02x\n", status);
381     }
382     if (status == 1) {
383         get_sense(sg->usb_handle, sg->ep_rep, sg->ep_req);
384         return -1;
385     }
386     if (received_tag != tag) {
387         WLOG("received tag %d but expected %d\n", received_tag, tag);
388         //return -1;
389     }
390     if (rx_length > 0 && real_transferred != rx_length) {
391         return -1;
392     }
393     return 0;
394 }
395
396 // TODO thinking, cleanup
397
398 void stlink_stat(stlink_t *stl, char *txt) {
399     if (stl->q_len <= 0)
400         return;
401
402     stlink_print_data(stl);
403
404     switch (stl->q_buf[0]) {
405     case STLINK_OK:
406         DLOG("  %s: ok\n", txt);
407         return;
408     case STLINK_FALSE:
409         DLOG("  %s: false\n", txt);
410         return;
411     default:
412         DLOG("  %s: unknown\n", txt);
413     }
414 }
415
416
417 void _stlink_sg_version(stlink_t *stl) {
418     struct stlink_libsg *sl = stl->backend_data;
419     clear_cdb(sl);
420     sl->cdb_cmd_blk[0] = STLINK_GET_VERSION;
421     stl->q_len = 6;
422     sl->q_addr = 0;
423     stlink_q(stl);
424 }
425
426 // Get stlink mode:
427 // STLINK_DEV_DFU_MODE || STLINK_DEV_MASS_MODE || STLINK_DEV_DEBUG_MODE
428 // usb dfu             || usb mass             || jtag or swd
429
430 int _stlink_sg_current_mode(stlink_t *stl) {
431     struct stlink_libsg *sl = stl->backend_data;
432     clear_cdb(sl);
433     sl->cdb_cmd_blk[0] = STLINK_GET_CURRENT_MODE;
434     stl->q_len = 2;
435     sl->q_addr = 0;
436     stlink_q(stl);
437     return stl->q_buf[0];
438 }
439
440 // Exit the mass mode and enter the swd debug mode.
441
442 void _stlink_sg_enter_swd_mode(stlink_t *sl) {
443     struct stlink_libsg *sg = sl->backend_data;
444     clear_cdb(sg);
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
448     stlink_q(sl);
449 }
450
451 // Exit the mass mode and enter the jtag debug mode.
452 // (jtag is disabled in the discovery's stlink firmware)
453
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");
457     clear_cdb(sg);
458     sg->cdb_cmd_blk[1] = STLINK_DEBUG_ENTER;
459     sg->cdb_cmd_blk[2] = STLINK_DEBUG_ENTER_JTAG;
460     sl->q_len = 0;
461     stlink_q(sl);
462 }
463
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");
469     clear_cdb(sg);
470     sg->cdb_cmd_blk[0] = STLINK_DFU_COMMAND;
471     sg->cdb_cmd_blk[1] = STLINK_DFU_EXIT;
472     sl->q_len = 0; // ??
473     stlink_q(sl);
474     /*
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
499        [135131.640609]  sdb:
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
514        ...
515        [135131.853565] end_request: I/O error, dev sdb, sector 4096
516        */
517 }
518
519 void _stlink_sg_core_id(stlink_t *sl) {
520     struct stlink_libsg *sg = sl->backend_data;
521     clear_cdb(sg);
522     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READCOREID;
523     sl->q_len = 4;
524     sg->q_addr = 0;
525     stlink_q(sl);
526     sl->core_id = read_uint32(sl->q_buf, 0);
527 }
528
529 // Arm-core reset -> halted state.
530
531 void _stlink_sg_reset(stlink_t *sl) {
532     struct stlink_libsg *sg = sl->backend_data;
533     clear_cdb(sg);
534     sg->cdb_cmd_blk[1] = STLINK_DEBUG_RESETSYS;
535     sl->q_len = 2;
536     sg->q_addr = 0;
537     stlink_q(sl);
538     stlink_stat(sl, "core reset");
539 }
540
541 // Arm-core reset -> halted state.
542
543 void _stlink_sg_jtag_reset(stlink_t *sl, int value) {
544     struct stlink_libsg *sg = sl->backend_data;
545     clear_cdb(sg);
546     sg->cdb_cmd_blk[1] = STLINK_JTAG_DRIVE_NRST;
547     sg->cdb_cmd_blk[2] = (value)?0:1;
548     sl->q_len = 3;
549     sg->q_addr = 2;
550     stlink_q(sl);
551     stlink_stat(sl, "core reset");
552 }
553
554 // Arm-core status: halted or running.
555
556 void _stlink_sg_status(stlink_t *sl) {
557     struct stlink_libsg *sg = sl->backend_data;
558     clear_cdb(sg);
559     sg->cdb_cmd_blk[1] = STLINK_DEBUG_GETSTATUS;
560     sl->q_len = 2;
561     sg->q_addr = 0;
562     stlink_q(sl);
563 }
564
565 // Force the core into the debug mode -> halted state.
566
567 void _stlink_sg_force_debug(stlink_t *sl) {
568     struct stlink_libsg *sg = sl->backend_data;
569     clear_cdb(sg);
570     sg->cdb_cmd_blk[1] = STLINK_DEBUG_FORCEDEBUG;
571     sl->q_len = 2;
572     sg->q_addr = 0;
573     stlink_q(sl);
574     stlink_stat(sl, "force debug");
575 }
576
577 // Read all arm-core registers.
578
579 void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) {
580     struct stlink_libsg *sg = sl->backend_data;
581
582     clear_cdb(sg);
583     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS;
584     sl->q_len = 84;
585     sg->q_addr = 0;
586     stlink_q(sl);
587     stlink_print_data(sl);
588
589     // TODO - most of this should be re-extracted up....
590
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);
595         if (sl->verbose > 1)
596             DLOG("r%2d = 0x%08x\n", i, regp->r[i]);
597     }
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);
603     if (sl->verbose < 2)
604         return;
605
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);
611 }
612
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
616
617 void _stlink_sg_read_reg(stlink_t *sl, int r_idx, reg *regp) {
618     struct stlink_libsg *sg = sl->backend_data;
619     clear_cdb(sg);
620     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READREG;
621     sg->cdb_cmd_blk[2] = r_idx;
622     sl->q_len = 4;
623     sg->q_addr = 0;
624     stlink_q(sl);
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);
629
630     uint32_t r = read_uint32(sl->q_buf, 0);
631     DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
632
633     switch (r_idx) {
634     case 16:
635         regp->xpsr = r;
636         break;
637     case 17:
638         regp->main_sp = r;
639         break;
640     case 18:
641         regp->process_sp = r;
642         break;
643     case 19:
644         regp->rw = r; //XXX ?(primask, basemask etc.)
645         break;
646     case 20:
647         regp->rw2 = r; //XXX ?(primask, basemask etc.)
648         break;
649     default:
650         regp->r[r_idx] = r;
651     }
652 }
653
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
657
658 void _stlink_sg_write_reg(stlink_t *sl, uint32_t reg, int idx) {
659     struct stlink_libsg *sg = sl->backend_data;
660     clear_cdb(sg);
661     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEREG;
662     //   2: reg index
663     // 3-6: reg content
664     sg->cdb_cmd_blk[2] = idx;
665     write_uint32(sg->cdb_cmd_blk + 3, reg);
666     sl->q_len = 2;
667     sg->q_addr = 0;
668     stlink_q(sl);
669     stlink_stat(sl, "write reg");
670 }
671
672 // Write a register of the debug module of the core.
673 // XXX ?(atomic writes)
674 // TODO test
675
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");
679     clear_cdb(sg);
680     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEDEBUGREG;
681     // 2-5: address of reg of the debug module
682     // 6-9: reg content
683     write_uint32(sg->cdb_cmd_blk + 2, addr);
684     write_uint32(sg->cdb_cmd_blk + 6, reg);
685     sl->q_len = 2;
686     sg->q_addr = addr;
687     stlink_q(sl);
688     stlink_stat(sl, "write debug reg");
689 }
690
691 // Force the core exit the debug mode.
692
693 void _stlink_sg_run(stlink_t *sl) {
694     struct stlink_libsg *sg = sl->backend_data;
695     clear_cdb(sg);
696     sg->cdb_cmd_blk[1] = STLINK_DEBUG_RUNCORE;
697     sl->q_len = 2;
698     sg->q_addr = 0;
699     stlink_q(sl);
700     stlink_stat(sl, "run core");
701 }
702
703 // Step the arm-core.
704
705 void _stlink_sg_step(stlink_t *sl) {
706     struct stlink_libsg *sg = sl->backend_data;
707     clear_cdb(sg);
708     sg->cdb_cmd_blk[1] = STLINK_DEBUG_STEPCORE;
709     sl->q_len = 2;
710     sg->q_addr = 0;
711     stlink_q(sl);
712     stlink_stat(sl, "step core");
713 }
714
715 // TODO test
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;
721     clear_cdb(sg);
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);
728     sl->q_buf[7] = fp;
729
730     sl->q_len = 2;
731     stlink_q(sl);
732     stlink_stat(sl, "set flash breakpoint");
733 }
734
735 // TODO test
736
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");
741     clear_cdb(sg);
742     sg->cdb_cmd_blk[1] = STLINK_DEBUG_CLEARFP;
743     sg->cdb_cmd_blk[2] = fp_nr;
744
745     sl->q_len = 2;
746     stlink_q(sl);
747     stlink_stat(sl, "clear flash breakpoint");
748 }
749
750 // Read a "len" bytes to the sl->q_buf from the memory, max 6kB (6144 bytes)
751
752 void _stlink_sg_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
753     struct stlink_libsg *sg = sl->backend_data;
754     clear_cdb(sg);
755     sg->cdb_cmd_blk[1] = STLINK_DEBUG_READMEM_32BIT;
756     // 2-5: addr
757     // 6-7: len
758     write_uint32(sg->cdb_cmd_blk + 2, addr);
759     write_uint16(sg->cdb_cmd_blk + 6, len);
760
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)
766     sl->q_len = len;
767     sg->q_addr = addr;
768     stlink_q(sl);
769     stlink_print_data(sl);
770 }
771
772 // Write a "len" bytes from the sl->q_buf to the memory, max 64 Bytes.
773
774 void _stlink_sg_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
775     struct stlink_libsg *sg = sl->backend_data;
776     clear_cdb(sg);
777     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_8BIT;
778     // 2-5: addr
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);
782
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);
788 }
789
790 // Write a "len" bytes from the sl->q_buf to the memory, max Q_BUF_LEN bytes.
791
792 void _stlink_sg_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
793     struct stlink_libsg *sg = sl->backend_data;
794     clear_cdb(sg);
795     sg->cdb_cmd_blk[1] = STLINK_DEBUG_WRITEMEM_32BIT;
796     // 2-5: addr
797     // 6-7: len "unlimited"
798     write_uint32(sg->cdb_cmd_blk + 2, addr);
799     write_uint16(sg->cdb_cmd_blk + 6, len);
800
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);
805
806     stlink_print_data(sl);
807 }
808
809 // Write one DWORD data to memory
810
811 void _stlink_sg_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
812     struct stlink_libsg *sg = sl->backend_data;
813     clear_cdb(sg);
814     sg->cdb_cmd_blk[1] = STLINK_JTAG_WRITEDEBUG_32BIT;
815     // 2-5: addr
816     write_uint32(sg->cdb_cmd_blk + 2, addr);
817     write_uint32(sg->cdb_cmd_blk + 6, data);
818     sl->q_len = 2;
819     stlink_q(sl);
820
821 }
822
823 // Read one DWORD data from memory
824
825 uint32_t _stlink_sg_read_debug32(stlink_t *sl, uint32_t addr) {
826     struct stlink_libsg *sg = sl->backend_data;
827     clear_cdb(sg);
828     sg->cdb_cmd_blk[1] = STLINK_JTAG_READDEBUG_32BIT;
829     // 2-5: addr
830     write_uint32(sg->cdb_cmd_blk + 2, addr);
831     sl->q_len = 8;
832     stlink_q(sl);
833
834     return read_uint32(sl->q_buf, 4);
835 }
836
837 // Exit the jtag or swd mode and enter the mass mode.
838
839 void _stlink_sg_exit_debug_mode(stlink_t *stl) {
840
841     if (stl) {
842         struct stlink_libsg* sl = stl->backend_data;
843         clear_cdb(sl);
844         sl->cdb_cmd_blk[1] = STLINK_DEBUG_EXIT;
845         stl->q_len = 0; // >0 -> aboard
846         stlink_q(stl);
847     }
848 }
849
850
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
856
857 stlink_backend_t _stlink_sg_backend = {
858     _stlink_sg_close,
859     _stlink_sg_exit_debug_mode,
860     _stlink_sg_enter_swd_mode,
861     _stlink_sg_enter_jtag_mode,
862     _stlink_sg_exit_dfu_mode,
863     _stlink_sg_core_id,
864     _stlink_sg_reset,
865     _stlink_sg_jtag_reset,
866     _stlink_sg_run,
867     _stlink_sg_status,
868     _stlink_sg_version,
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,
875     _stlink_sg_read_reg,
876     NULL,                   /* read_all_unsupported_regs */
877     NULL,                   /* read_unsupported_regs */
878     NULL,                   /* write_unsupported_regs */
879     _stlink_sg_write_reg,
880     _stlink_sg_step,
881     _stlink_sg_current_mode,
882     _stlink_sg_force_debug,
883     NULL
884 };
885
886 static stlink_t* stlink_open(const int verbose) {
887
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");
893         return NULL;
894     }
895
896     if (libusb_init(&(slsg->libusb_ctx))) {
897         WLOG("failed to init libusb context, wrong version of libraries?\n");
898         free(sl);
899         free(slsg);
900         return NULL;
901     }
902
903     libusb_set_debug(slsg->libusb_ctx, 3);
904
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);
910         free(sl);
911         free(slsg);
912         return NULL;
913     }
914
915     // TODO
916     // Could read the interface config descriptor, and assert lots of the assumptions
917
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);
921         if (r < 0) {
922             WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
923             libusb_close(slsg->usb_handle);
924             libusb_exit(slsg->libusb_ctx);
925             free(sl);
926             free(slsg);
927             return NULL;
928         }
929         DLOG("Kernel driver was successfully detached\n");
930     }
931
932     int config;
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);
938         free(sl);
939         free(slsg);
940         return NULL;
941
942     }
943
944     // assumption: bConfigurationValue is always 1
945     if (config != 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);
953             free(sl);
954             free(slsg);
955             return NULL;
956         }
957     }
958
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);
963         free(sl);
964         free(slsg);
965         return NULL;
966     }
967
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;
971
972     DLOG("Successfully opened stlinkv1 by libusb :)\n");
973
974     sl->verbose = verbose;
975     sl->backend_data = slsg;
976     sl->backend = &_stlink_sg_backend;
977
978     sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
979     slsg->q_addr = 0;
980
981     return sl;
982 }
983
984
985 stlink_t* stlink_v1_open_inner(const int verbose) {
986     ugly_init(verbose);
987     stlink_t *sl = stlink_open(verbose);
988     if (sl == NULL) {
989         fputs("Error: could not open stlink device\n", stderr);
990         return NULL;
991     }
992
993     stlink_version(sl);
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");
997         return NULL;
998     }
999
1000     DLOG("Reading current mode...\n");
1001     switch (stlink_current_mode(sl)) {
1002     case STLINK_DEV_MASS_MODE:
1003         return sl;
1004     case STLINK_DEV_DEBUG_MODE:
1005         // TODO go to mass?
1006         return sl;
1007     default:
1008         ILOG("Current mode unusable, trying to get back to a useful state...\n");
1009         break;
1010     }
1011
1012     DLOG("Attempting to exit DFU mode\n");
1013     _stlink_sg_exit_dfu_mode(sl);
1014
1015     // re-query device info (and retest)
1016     stlink_version(sl);
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");
1020         return NULL;
1021     }
1022
1023     return sl;
1024 }
1025
1026 stlink_t* stlink_v1_open(const int verbose, int reset) {
1027     stlink_t *sl = stlink_v1_open_inner(verbose);
1028     if (sl == NULL) {
1029         fputs("Error: could not open stlink device\n", stderr);
1030         return NULL;
1031     }
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  */
1035     if (reset) {
1036         stlink_reset(sl);
1037     }
1038     stlink_load_device_params(sl);
1039     ILOG("Successfully opened a stlink v1 debugger\n");
1040     return sl;
1041 }