+// stlink_q(stl);
+ // HACK use my own private version right now...
+
+ int try = 0;
+ int ret = 0;
+ int real_transferred;
+
+/*
+ uint32_t dCBWSignature;
+ uint32_t dCBWTag;
+ uint32_t dCBWDataTransferLength;
+ uint8_t bmCBWFlags;
+ uint8_t bCBWLUN;
+ uint8_t bCBWCBLength;
+ uint8_t CBWCB[16];
+ */
+
+#if using_old_code_examples
+ /*
+ * and from old code?
+ cmd[i++] = 'U';
+ cmd[i++] = 'S';
+ cmd[i++] = 'B';
+ cmd[i++] = 'C';
+ write_uint32(&cmd[i], sg->sg_transfer_idx);
+ write_uint32(&cmd[i + 4], len);
+ i += 8;
+ cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
+ cmd[i++] = 0; /* Logical unit */
+ cmd[i++] = 0xa; /* Command length */
+ */
+#endif
+
+ int i = 0;
+ stl->c_buf[i++] = 'U';
+ stl->c_buf[i++] = 'S';
+ stl->c_buf[i++] = 'B';
+ stl->c_buf[i++] = 'C';
+ // tag is allegedly ignored... TODO - verify
+ write_uint32(&stl->c_buf[i], 1);
+ // TODO - Does this even matter? verify with more commands....
+ uint32_t command_length = STLINK_CMD_SIZE;
+ write_uint32(&stl->c_buf[i+4], command_length);
+ i+= 8;
+ stl->c_buf[i++] = LIBUSB_ENDPOINT_IN;
+ // assumption: lun is always 0;
+ stl->c_buf[i++] = 0;
+
+ stl->c_buf[i++] = sizeof(sl->cdb_cmd_blk);
+
+ // duh, now the actual data...
+ memcpy(&(stl->c_buf[i]), sl->cdb_cmd_blk, sizeof(sl->cdb_cmd_blk));
+
+ int sending_length = STLINK_SG_SIZE;
+ DLOG("sending length set to: %d\n", sending_length);
+
+ // send....
+ do {
+ DLOG("attempting tx...\n");
+ ret = libusb_bulk_transfer(sl->usb_handle, sl->ep_req, stl->c_buf, sending_length,
+ &real_transferred, 3 * 1000);
+ if (ret == LIBUSB_ERROR_PIPE) {
+ libusb_clear_halt(sl->usb_handle, sl->ep_req);
+ }
+ try++;
+ } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
+ if (ret != LIBUSB_SUCCESS) {
+ WLOG("sending failed: %d\n", ret);
+ return;
+ }
+ DLOG("Actually sent: %d\n", real_transferred);
+
+ // now wait for our response...
+ // length copied from stlink-usb...
+ int rx_length = 6;
+ try = 0;
+ do {
+ DLOG("attempting rx\n");
+ ret = libusb_bulk_transfer(sl->usb_handle, sl->ep_rep, stl->q_buf, rx_length,
+ &real_transferred, 3 * 1000);
+ if (ret == LIBUSB_ERROR_PIPE) {
+ libusb_clear_halt(sl->usb_handle, sl->ep_req);
+ }
+ try++;
+ } while ((ret == LIBUSB_ERROR_PIPE) && (try < 3));
+
+ if (ret != LIBUSB_SUCCESS) {
+ WLOG("Receiving failed: %d\n", ret);
+ return;
+ }
+
+ if (real_transferred != rx_length) {
+ WLOG("received unexpected amount: %d != %d\n", real_transferred, rx_length);
+ }
+
+ DLOG("Actually received: %d\n", real_transferred);