| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library fuchsia.hardware.hidbus; |
| |
| using zx; |
| |
| const HID_MAX_DESC_LEN uint16 = 8192; |
| |
| type HidDescriptionType = strict enum : uint8 { |
| REPORT = 0x22; |
| }; |
| |
| type HidReportType = strict enum : uint8 { |
| INPUT = 1; |
| OUTPUT = 2; |
| FEATURE = 3; |
| }; |
| |
| type HidProtocol = strict enum : uint8 { |
| BOOT = 0; |
| REPORT = 1; |
| }; |
| |
| type HidDeviceClass = strict enum : uint8 { |
| OTHER = 0; |
| KBD = 1; |
| POINTER = 2; |
| KBD_POINTER = 3; |
| }; |
| |
| const HID_DEVICE_CLASS_FIRST uint8 = 0; |
| const HID_DEVICE_CLASS_LAS uint8 = 3; |
| |
| type HidInfo = struct { |
| dev_num uint8; |
| device_class HidDeviceClass; |
| boot_device bool; |
| |
| vendor_id uint32; |
| product_id uint32; |
| version uint32; |
| }; |
| |
| @transport("Banjo") |
| @banjo_layout("ddk-interface") |
| protocol HidbusIfc { |
| /// Queues a report received by the hidbus device. |
| /// Timestamp should be whenever the report was created. Ideally it should |
| /// come from the driver's IRQ callback. If the driver doesn't have |
| /// something like that it should fill this with `zx_clock_get_monotonic()` |
| IoQueue(struct { |
| @buffer |
| buf vector<uint8>:MAX; |
| timestamp zx.time; |
| }) -> (); |
| }; |
| |
| @transport("Banjo") |
| @banjo_layout("ddk-protocol") |
| protocol Hidbus { |
| /// Obtain information about the hidbus device and supported features. |
| /// Safe to call at any time. |
| Query(struct { |
| options uint32; |
| }) -> (struct { |
| s zx.status; |
| info HidInfo; |
| }); |
| /// Start the hidbus device. The device may begin queueing hid reports via |
| /// ifc->io_queue before this function returns. It is an error to start an |
| /// already-started hidbus device. |
| Start(resource struct { |
| ifc client_end:HidbusIfc; |
| }) -> (struct { |
| s zx.status; |
| }); |
| /// Stop the hidbus device. Safe to call if the hidbus is already stopped. |
| Stop() -> (); |
| GetDescriptor(struct { |
| desc_type HidDescriptionType; |
| }) -> (struct { |
| s zx.status; |
| @buffer |
| data vector<uint8>:MAX; |
| }); |
| GetReport(struct { |
| rpt_type HidReportType; |
| rpt_id uint8; |
| }) -> (struct { |
| s zx.status; |
| @buffer |
| data vector<uint8>:MAX; |
| }); |
| SetReport(struct { |
| rpt_type HidReportType; |
| rpt_id uint8; |
| @buffer |
| data vector<uint8>:MAX; |
| }) -> (struct { |
| s zx.status; |
| }); |
| GetIdle(struct { |
| rpt_id uint8; |
| }) -> (struct { |
| s zx.status; |
| duration uint8; |
| }); |
| SetIdle(struct { |
| rpt_id uint8; |
| duration uint8; |
| }) -> (struct { |
| s zx.status; |
| }); |
| GetProtocol() -> (struct { |
| s zx.status; |
| protocol HidProtocol; |
| }); |
| SetProtocol(struct { |
| protocol HidProtocol; |
| }) -> (struct { |
| s zx.status; |
| }); |
| }; |