// Copyright 2025 Google Inc. // Use of this source code is governed by an Apache License that can be found // in the LICENSE file. #ifndef COMMON_USB_HID_DEVICE_H_ #define COMMON_USB_HID_DEVICE_H_ #include "usb_device.h" #include #include #include class UsbHidDevice : public UsbDevice { public: struct HidDescriptor { uint8_t bLength; uint8_t bDescriptorType; uint16_t bcdHID; uint8_t bCountryCode; uint8_t bNumDescriptors; uint8_t bReportDescriptorType; uint16_t wDescriptorLength; } __attribute__((packed)); static constexpr uint8_t kHidRequestSetReport = 0x09u; static constexpr uint8_t kHidRequestSetIdle = 0x0au; static constexpr uint8_t kHidRequestSetProtocol = 0x0bu; static constexpr uint8_t kDescriptorTypeHid = 0x21u; static constexpr uint8_t kDescriptorTypeReport = 0x22u; UsbHidDevice(const DeviceDescriptor& device_descriptor, const ConfigurationDescriptor& configuration_descriptor, const std::vector& interface_descriptors, const std::vector& endpoint_descriptors, const HidDescriptor& hid_descriptor, const std::vector& report_descriptor, const std::vector& strings); UsbHidDevice(const UsbHidDevice&) = delete; UsbHidDevice& operator=(const UsbHidDevice&) = delete; ~UsbHidDevice() override = default; void Report(uint8_t endpoint, std::span report); private: // Implement UsbDevice. void FillConfigurations(std::vector& buffer) override; void GetDescriptor(volatile SetupPacket* setup_packet) override; void HandleSetupRequest(volatile SetupPacket* setup_packet) override; const ConfigurationDescriptor& configuration_descriptor_; const std::vector& interface_descriptors_; const std::vector& endpoint_descriptors_; const HidDescriptor& hid_descriptor_; const std::vector& report_descriptor_; std::vector receive_buffer_; }; #endif // COMMON_USB_HID_DEVICE_H_