diff options
Diffstat (limited to 'utils/hwstub/lib/hwstub_usb.cpp')
-rw-r--r-- | utils/hwstub/lib/hwstub_usb.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/utils/hwstub/lib/hwstub_usb.cpp b/utils/hwstub/lib/hwstub_usb.cpp index 6bb1cfa049..37249f5812 100644 --- a/utils/hwstub/lib/hwstub_usb.cpp +++ b/utils/hwstub/lib/hwstub_usb.cpp | |||
@@ -399,6 +399,46 @@ error rb_handle::write_dev(uint32_t addr, const void *buf, size_t& sz, bool atom | |||
399 | return ret; | 399 | return ret; |
400 | } | 400 | } |
401 | 401 | ||
402 | error rb_handle::cop_dev(uint8_t op, uint8_t args[HWSTUB_COP_ARGS], | ||
403 | const void *out_data, size_t out_size, void *in_data, size_t *in_size) | ||
404 | { | ||
405 | (void) op; | ||
406 | (void) args; | ||
407 | (void) out_data; | ||
408 | (void) out_size; | ||
409 | (void) in_data; | ||
410 | (void) in_size; | ||
411 | std::shared_ptr<hwstub::context> hctx = get_device()->get_context(); | ||
412 | if(!hctx) | ||
413 | return error::NO_CONTEXT; | ||
414 | |||
415 | /* construct out request: header followed by (optional) data */ | ||
416 | size_t hdr_sz = sizeof(struct hwstub_cop_req_t); | ||
417 | uint8_t *tmp_buf = new uint8_t[out_size + hdr_sz]; | ||
418 | struct hwstub_cop_req_t *req = reinterpret_cast<struct hwstub_cop_req_t *>(tmp_buf); | ||
419 | req->bOp = op; | ||
420 | for(int i = 0; i < HWSTUB_COP_ARGS; i++) | ||
421 | req->bArgs[i] = args[i]; | ||
422 | if(out_size > 0) | ||
423 | memcpy(tmp_buf + hdr_sz, out_data, out_size); | ||
424 | error ret = interpret_libusb_error(libusb_control_transfer(m_handle, | ||
425 | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, | ||
426 | HWSTUB_COPROCESSOR_OP, m_transac_id++, m_intf, | ||
427 | (unsigned char *)req, out_size + hdr_sz, m_timeout), out_size + hdr_sz); | ||
428 | delete[] tmp_buf; | ||
429 | /* return errors if any */ | ||
430 | if(ret != error::SUCCESS) | ||
431 | return ret; | ||
432 | /* return now if there is no read stage */ | ||
433 | if(in_data == nullptr) | ||
434 | return error::SUCCESS; | ||
435 | /* perform read stage (use the same transaction ID) */ | ||
436 | return interpret_libusb_size(libusb_control_transfer(m_handle, | ||
437 | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_IN, | ||
438 | HWSTUB_READ2, m_transac_id - 1, m_intf, | ||
439 | (unsigned char *)in_data, *in_size, m_timeout), *in_size); | ||
440 | } | ||
441 | |||
402 | bool rb_handle::find_intf(struct libusb_device_descriptor *dev, | 442 | bool rb_handle::find_intf(struct libusb_device_descriptor *dev, |
403 | struct libusb_config_descriptor *config, int& intf_idx) | 443 | struct libusb_config_descriptor *config, int& intf_idx) |
404 | { | 444 | { |
@@ -674,6 +714,18 @@ error jz_handle::write_dev(uint32_t addr, const void *buf, size_t& sz, bool atom | |||
674 | return ret; | 714 | return ret; |
675 | } | 715 | } |
676 | 716 | ||
717 | error jz_handle::cop_dev(uint8_t op, uint8_t args[HWSTUB_COP_ARGS], | ||
718 | const void *out_data, size_t out_size, void *in_data, size_t *in_size) | ||
719 | { | ||
720 | (void) op; | ||
721 | (void) args; | ||
722 | (void) out_data; | ||
723 | (void) out_size; | ||
724 | (void) in_data; | ||
725 | (void) in_size; | ||
726 | return error::UNSUPPORTED; | ||
727 | } | ||
728 | |||
677 | bool jz_handle::is_boot_dev(struct libusb_device_descriptor *dev, | 729 | bool jz_handle::is_boot_dev(struct libusb_device_descriptor *dev, |
678 | struct libusb_config_descriptor *config) | 730 | struct libusb_config_descriptor *config) |
679 | { | 731 | { |