4 #ifndef OPENTITAN_SW_HOST_TESTS_USBDEV_USBDEV_STREAM_USB_DEVICE_H_
5 #define OPENTITAN_SW_HOST_TESTS_USBDEV_USBDEV_STREAM_USB_DEVICE_H_
12 #include <libusb-1.0/libusb.h>
18 USBDevice(
bool verbose =
false,
bool manual =
false)
21 state_(StateStreaming),
25 USBDevice(
bool verbose =
false,
bool manual =
false)
28 state_(StateStreaming),
59 kSuspendPhaseSleepReset,
85 typedef enum usb_testutils_test_number {
86 kUsbTestNumberSmoke = 0,
87 kUsbTestNumberStreams,
90 kUsbTestNumberSuspend,
92 } usb_testutils_test_number_t;
125 static constexpr uint8_t kVendorGetData = 0x7du;
126 static constexpr uint8_t kVendorPutData = 0x7fu;
130 static constexpr
unsigned kDevDataMaxPacketSize = 0x40U;
134 static constexpr
unsigned kDevIsoMaxPacketSize = 0x40U;
145 bool Init(uint16_t productID, uint16_t vendorID, uint8_t devAddress = 0u,
146 uint8_t busNumber = 0u);
174 #if STREAMTEST_LIBUSB
181 int ClaimInterface(
unsigned interface)
const {
182 return libusb_claim_interface(devh_, (
int)interface);
190 int ReleaseInterface(
unsigned interface)
const {
191 return libusb_release_interface(devh_, (
int)interface);
199 inline bool ErrorUSB(
const char *prefix,
int rc) {
200 std::cerr << prefix <<
" (" << rc <<
", " << libusb_error_name(rc) <<
")"
209 libusb_device_handle *DeviceHandle()
const {
return devh_; }
213 void FillControlTransfer(
struct libusb_transfer *xfr, uint8_t ep,
214 uint8_t *buffer, libusb_transfer_cb_fn callback,
215 void *user_data,
unsigned timeout_ms) {
216 libusb_fill_control_transfer(xfr, devh_, buffer, callback, user_data,
225 void FillBulkTransfer(
struct libusb_transfer *xfr, uint8_t ep,
226 uint8_t *buffer,
size_t len,
227 libusb_transfer_cb_fn callback,
void *user_data,
228 unsigned timeout_ms)
const {
229 libusb_fill_bulk_transfer(xfr, devh_, ep, buffer, len, callback, user_data,
235 void FillIntTransfer(
struct libusb_transfer *xfr, uint8_t ep, uint8_t *buffer,
236 size_t len, libusb_transfer_cb_fn callback,
237 void *user_data,
unsigned timeout_ms)
const {
238 libusb_fill_interrupt_transfer(xfr, devh_, ep, buffer, len, callback,
239 user_data, timeout_ms);
244 void FillIsoTransfer(
struct libusb_transfer *xfr, uint8_t ep, uint8_t *buffer,
245 size_t len,
unsigned num_iso_packets,
246 libusb_transfer_cb_fn callback,
void *user_data,
247 unsigned timeout_ms)
const {
248 libusb_fill_iso_transfer(xfr, devh_, ep, buffer, len, num_iso_packets,
249 callback, user_data, timeout_ms);
258 void SetIsoPacketLengths(
struct libusb_transfer *xfr,
unsigned len)
const {
259 libusb_set_iso_packet_lengths(xfr, len);
266 struct libusb_transfer *AllocTransfer(
unsigned iso_packets)
const {
267 return libusb_alloc_transfer((
int)iso_packets);
274 void FreeTransfer(
struct libusb_transfer *xfr)
const {
275 return libusb_free_transfer(xfr);
282 int SubmitTransfer(
struct libusb_transfer *xfr)
const {
283 return libusb_submit_transfer(xfr);
290 int CancelTransfer(
struct libusb_transfer *xfr)
const {
291 return libusb_cancel_transfer(xfr);
305 static inline uint32_t
TimeFrames(
unsigned frames) {
return frames * 1000u; }
320 bool Delay(uint32_t time_us,
bool with_traffic =
true);
341 return (arg < 4U) ? testArg_[arg] : 0U;
377 static const char *
PhaseName(usbdev_suspend_phase_t phase);
389 void SetState(USBDevState state) { state_ = state; }
416 #if STREAMTEST_LIBUSB
418 libusb_context *ctx_;
421 libusb_device_handle *devh_;
424 libusb_device_handle *parenth_;
428 libusb_device_descriptor devDesc_;
435 std::string devPath_;
438 usbdev_suspend_phase_t testPhase_;
440 usb_testutils_test_number_t testNumber_;
445 static const unsigned kControlTransferTimeout = 0u;
448 static const uint8_t kVendorTestConfig = 0x7cu;
449 static const uint8_t kVendorTestStatus = 0x7eu;