-// 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);