Index: tools/usb_gadget/hid_echo_gadget.py |
diff --git a/tools/usb_gadget/hid_echo_gadget.py b/tools/usb_gadget/hid_echo_gadget.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ac677bb91081b33c9786456f844c4a6177d20235 |
--- /dev/null |
+++ b/tools/usb_gadget/hid_echo_gadget.py |
@@ -0,0 +1,105 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""A HID-class echo device. |
+ |
+This module provides a HID feature and HID device that can be used as an |
+echo test for HID drivers. The device exposes vendor-specific input, output |
+and feature usages that transmit 8 bytes of data. Data written sent as an |
+output report is echoed as an input report. The value of the feature report |
+can be written and read with control transfers. |
+""" |
+ |
+import struct |
+ |
+import hid_constants |
+import hid_descriptors |
+import hid_gadget |
+import usb_constants |
+ |
+ |
+class EchoFeature(hid_gadget.HidFeature): |
+ |
+ REPORT_DESC = hid_descriptors.ReportDescriptor( |
+ hid_descriptors.UsagePage(0xFF00), # Vendor Defined |
+ hid_descriptors.Usage(0), |
+ hid_descriptors.Collection( |
+ hid_constants.CollectionType.APPLICATION, |
+ hid_descriptors.LogicalMinimum(0, force_length=1), |
+ hid_descriptors.LogicalMaximum(255, force_length=2), |
+ hid_descriptors.ReportSize(8), |
+ hid_descriptors.ReportCount(8), |
+ hid_descriptors.Usage(0), |
+ hid_descriptors.Input(hid_descriptors.Data, |
+ hid_descriptors.Variable, |
+ hid_descriptors.Absolute), |
+ hid_descriptors.Usage(0), |
+ hid_descriptors.Output(hid_descriptors.Data, |
+ hid_descriptors.Variable, |
+ hid_descriptors.Absolute), |
+ hid_descriptors.Usage(0), |
+ hid_descriptors.Feature(hid_descriptors.Data, |
+ hid_descriptors.Variable, |
+ hid_descriptors.Absolute) |
+ ) |
+ ) |
+ |
+ def __init__(self): |
+ super(EchoFeature, self).__init__() |
+ self._input_output_report = 0 |
+ self._feature_report = 0 |
+ |
+ def SetInputReport(self, data): |
+ self._input_output_report, = struct.unpack('<Q', data) |
+ self.SendReport(struct.pack('<Q', self._input_output_report)) |
+ return True |
+ |
+ def SetOutputReport(self, data): |
+ self._input_output_report, = struct.unpack('<Q', data) |
+ self.SendReport(struct.pack('<Q', self._input_output_report)) |
+ return True |
+ |
+ def SetFeatureReport(self, data): |
+ self._feature_report, = struct.unpack('<Q', data) |
+ return True |
+ |
+ def GetInputReport(self): |
+ return struct.pack('<Q', self._input_output_report) |
+ |
+ def GetOutputReport(self): |
+ return struct.pack('<Q', self._input_output_report) |
+ |
+ def GetFeatureReport(self): |
+ return struct.pack('<Q', self._feature_report) |
+ |
+ |
+class EchoGadget(hid_gadget.HidGadget): |
+ |
+ def __init__(self): |
+ self._feature = EchoFeature() |
+ super(EchoGadget, self).__init__( |
+ report_desc=EchoFeature.REPORT_DESC, |
+ features={0: self._feature}, |
+ packet_size=8, |
+ interval_ms=1, |
+ out_endpoint=True, |
+ vendor_id=usb_constants.VendorID.GOOGLE, |
+ product_id=usb_constants.ProductID.GOOGLE_HID_ECHO_GADGET, |
+ device_version=0x0100) |
+ self.AddStringDescriptor(1, 'Google Inc.') |
+ self.AddStringDescriptor(2, 'HID Echo Gadget') |
+ |
+ |
+def RegisterHandlers(): |
+ from tornado import web |
+ |
+ class WebConfigureHandler(web.RequestHandler): |
+ |
+ def post(self): |
+ server.SwitchGadget(EchoGadget()) |
+ |
+ import server |
+ server.app.add_handlers('.*$', [ |
+ (r'/hid_echo/configure', WebConfigureHandler), |
+ ]) |