Android-cuttlefish cvd tool
usb_libusb_device.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2025 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "sysdeps.h"
20#include "transport.h"
21#include "types.h"
22
23#include <stdint.h>
24#include <optional>
25#include <string>
26
27#include "libusb/libusb.h"
28
29// A session is started when a device is connected to a workstation. It ends upon its
30// disconnection. For in-house hotplug, we generate a unique identifier based on the device
31// invariants vendor, product (adb vs mtp...), the USB port, and the address (the location
32// in the USB chain). On Windows, the address is always incremented, even if the same device
33// is unplugged and plugged immediately.
35 uint64_t id;
36 struct {
37 uint8_t address;
38 uint8_t port;
39 uint16_t product;
40 uint16_t vendor;
42};
43
44// Abstraction layer simplifying libusb_device management
46 public:
47 explicit LibUsbDevice(libusb_device* device);
49
50 // Device must have been Opened prior to calling this method.
51 // This method blocks until a packet is available on the USB.
52 // Calling Close will make it return even if not packet was
53 // read.
54 bool Read(apacket* packet);
55
56 // Device must have been Opened prior to calling this method.
57 // This method blocks until the packet has been submitted to
58 // the USB.
59 bool Write(apacket* packet);
60
61 // Reset the device. This will cause the OS to issue a disconnect
62 // and the device will re-connect.
63 void Reset();
64
65 uint64_t NegotiatedSpeedMbps();
66 uint64_t MaxSpeedMbps();
67
68 // Return the Android serial
69 std::string GetSerial();
70
71 // Acquire all resources necessary for USB transfer.
72 bool Open();
73
74 // Release all resources necessary for USB transfer.
75 bool Close();
76
77 // Get the OS address (e.g.: usb:4.0.1)
78 std::string GetAddress() const;
79
80 // Call immediately after creating this object to check that the device can be interacted
81 // with (this also makes sure this is an Android device).
82 bool IsInitialized() const;
83
85
86 static USBSessionID GenerateSessionId(libusb_device* device);
87
88 // Clears halt condition for endpoints
89 void ClearEndpoints();
90
91 private:
92 // Make sure device is and Android device, retrieve OS address, retrieve Android serial.
93 void Init();
94
95 std::optional<libusb_device_descriptor> GetDeviceDescriptor();
96
97 bool ClaimInterface();
98 void ReleaseInterface();
99
100 bool OpenDeviceHandle();
101 void CloseDeviceHandle();
102
103 void CloseDevice();
104 std::string GetDeviceAddress();
105 bool RetrieveSerial();
106 void RetrieveSpeeds();
107
108 bool FindAdbInterface();
109
110 libusb_device* device_ = nullptr;
111 libusb_device_handle* device_handle_ = nullptr;
112 std::string device_address_{};
113 std::string serial_{};
114
115 // The mask used to determine if we should send a Zero Length Packet
118
120 unsigned char write_endpoint_{};
121 unsigned char read_endpoint_{};
122 std::atomic<bool> interface_claimed_ = false;
123
125 uint64_t max_speed_{};
126
127 bool initialized_ = false;
128
130};
Definition: usb_libusb_device.h:45
std::string GetSerial()
Definition: usb_libusb_device.cpp:196
uint64_t max_speed_
Definition: usb_libusb_device.h:125
void CloseDeviceHandle()
Definition: usb_libusb_device.cpp:84
bool OpenDeviceHandle()
Definition: usb_libusb_device.cpp:448
std::optional< libusb_device_descriptor > GetDeviceDescriptor()
Definition: usb_libusb_device.cpp:186
uint64_t MaxSpeedMbps()
Definition: usb_libusb_device.cpp:518
bool initialized_
Definition: usb_libusb_device.h:127
~LibUsbDevice()
Definition: usb_libusb_device.cpp:62
void ReleaseInterface()
Definition: usb_libusb_device.cpp:77
std::string GetAddress() const
Definition: usb_libusb_device.cpp:310
USBSessionID session_
Definition: usb_libusb_device.h:129
LibUsbDevice(libusb_device *device)
Definition: usb_libusb_device.cpp:56
unsigned char write_endpoint_
Definition: usb_libusb_device.h:120
uint64_t NegotiatedSpeedMbps()
Definition: usb_libusb_device.cpp:522
bool IsInitialized() const
Definition: usb_libusb_device.cpp:68
void RetrieveSpeeds()
Definition: usb_libusb_device.cpp:413
static USBSessionID GenerateSessionId(libusb_device *device)
Definition: usb_libusb_device.cpp:526
USBSessionID GetSessionId() const
Definition: usb_libusb_device.cpp:542
std::atomic< bool > interface_claimed_
Definition: usb_libusb_device.h:122
unsigned char read_endpoint_
Definition: usb_libusb_device.h:121
void CloseDevice()
Definition: usb_libusb_device.cpp:91
bool ClaimInterface()
Definition: usb_libusb_device.cpp:472
void Init()
Definition: usb_libusb_device.cpp:72
std::string serial_
Definition: usb_libusb_device.h:113
void Reset()
Definition: usb_libusb_device.cpp:162
std::string GetDeviceAddress()
Definition: usb_libusb_device.cpp:172
int zlp_mask_
Definition: usb_libusb_device.h:116
bool Write(apacket *packet)
Definition: usb_libusb_device.cpp:98
bool FindAdbInterface()
Definition: usb_libusb_device.cpp:200
void ClearEndpoints()
Definition: usb_libusb_device.cpp:334
bool Read(apacket *packet)
Definition: usb_libusb_device.cpp:132
bool Open()
Definition: usb_libusb_device.cpp:497
libusb_device_handle * device_handle_
Definition: usb_libusb_device.h:111
bool Close()
Definition: usb_libusb_device.cpp:512
int out_endpoint_size_
Definition: usb_libusb_device.h:117
uint64_t negotiated_speed_
Definition: usb_libusb_device.h:124
bool RetrieveSerial()
Definition: usb_libusb_device.cpp:314
int interface_num_
Definition: usb_libusb_device.h:119
libusb_device * device_
Definition: usb_libusb_device.h:110
std::string device_address_
Definition: usb_libusb_device.h:112
Definition: types.h:157
Definition: usb_libusb_device.h:34
struct USBSessionID::@4 fields
uint16_t product
Definition: usb_libusb_device.h:39
uint8_t address
Definition: usb_libusb_device.h:37
uint16_t vendor
Definition: usb_libusb_device.h:40
uint64_t id
Definition: usb_libusb_device.h:35
uint8_t port
Definition: usb_libusb_device.h:38