blob: d29b4cf92b5f920ded3d84ad90bf97126d5833c2 [file] [log] [blame]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef TYPECD_USB_DEVICE_H_
#define TYPECD_USB_DEVICE_H_
#include <string>
#include "typecd/metrics.h"
namespace typecd {
// Speed exposed in USB device sysfs that can be mapped to USB standard.
enum class UsbSpeed {
kOther = 0,
k1_5, // 1.5 Mbps (USB 1.1)
k12, // 12 Mbps (USB 1,1)
k480, // 480 Mbps (USB 2.0)
k5000, // 5000 Mbps (USB 3.2 Gen 1)
k10000, // 10000 Mbps (USB 3.2 Gen 2)
k20000, // 20000 Mbps (USB 3.2 Gen 2x2)
};
// Device class exposed in USB device sysfs.
enum class UsbDeviceClass {
kOther = 0,
kNone, // class code 0x00 (Refer to interface class)
kHub, // class code 0x09
};
// Version exposed in USB device sysfs, derived from bcdUSB.
enum class UsbVersion {
kOther = 0,
k1_0, // 1.00
k1_1, // 1.10
k2_0, // 2.00
k2_1, // 2.10
k3_0, // 3.00
k3_1, // 3.10
k3_2, // 3.20
};
// This class is used to represent a USB device. It maintains Type C port that
// the USB device is connected to.
class UsbDevice {
public:
UsbDevice(int busnum,
int devnum,
std::string hub,
UsbSpeed speed = UsbSpeed::kOther,
UsbVersion version = UsbVersion::kOther);
void SetTypecPortNum(int typec_port_num) { typec_port_num_ = typec_port_num; }
void SetSpeed(UsbSpeed speed) { speed_ = speed; }
void SetDeviceClass(UsbDeviceClass device_class) {
device_class_ = device_class;
}
void SetVersion(UsbVersion version) { version_ = version; }
int GetBusnum() { return busnum_; }
int GetDevnum() { return devnum_; }
int GetTypecPortNum() { return typec_port_num_; }
UsbSpeed GetSpeed() { return speed_; }
UsbDeviceClass GetDeviceClass() { return device_class_; }
UsbVersion GetVersion() { return version_; }
// Report metrics using UMA reporting. If the |metrics| pointer is nullptr,
// or if metrics have already been reported i.e |metrics_reported_| is true,
// we return immediately.
void ReportMetrics(Metrics* metrics);
private:
friend class MetricsTest;
FRIEND_TEST(MetricsTest, CheckUsbDeviceSpeed480Version20);
FRIEND_TEST(MetricsTest, CheckUsbDeviceSpeed480Version21);
FRIEND_TEST(MetricsTest, CheckUsbDeviceSpeed5000);
FRIEND_TEST(MetricsTest, CheckUsbDeviceSpeed20000InvalidVersion);
FRIEND_TEST(MetricsTest, CheckUsbDeviceSpeed480InvalidVersion);
int busnum_;
int devnum_;
int typec_port_num_;
// Root hub number and hub port number in accordance with the USB device sysfs
// directory name. (e.g. 2-1 if sysfs path is /sys/bus/usb/devices/2-1)
std::string hub_;
UsbSpeed speed_;
// Identifies type of device.
// https://www.usb.org/defined-class-codes
UsbDeviceClass device_class_;
UsbVersion version_;
// Field which tracks whether metrics have been reported for the USB device.
// This prevents duplicate reporting.
bool metrics_reported_;
// Convenience function used by ReportMetrics to get the right enum for
// UsbDeviceSpeedMetric.
UsbDeviceSpeedMetric GetUsbDeviceSpeedMetric();
};
} // namespace typecd
#endif // TYPECD_USB_DEVICE_H_