blob: 5eee205c1c43516727b57613ba02c1364d3ba9dd [file] [log] [blame]
// 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.
#include "hid-parser.h"
#include <hid-parser/item.h>
#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <stdlib.h>
#include <string.h>
zx_status_t hid_lib_parse_reports(const uint8_t* buf, const size_t buf_len,
hid_reports_t* reports) {
hid::DeviceDescriptor* desc = nullptr;
auto res = hid::ParseReportDescriptor(buf, buf_len, &desc);
if (res != hid::ParseResult::kParseOk) {
return -1;
}
for (size_t item = 0; item < desc->rep_count; item++) {
hid::ReportDescriptor* desc_rep = &desc->report[item];
hid_report_size_t* hiddev_rep = &reports->sizes[item];
hiddev_rep->id = desc_rep->report_id;
if (hiddev_rep->id != 0) {
reports->has_rpt_id = true;
}
reports->num_reports++;
hiddev_rep->in_size = static_cast<input_report_size_t>(desc_rep->input_byte_sz * 8);
hiddev_rep->out_size = static_cast<input_report_size_t>(desc_rep->output_byte_sz * 8);
hiddev_rep->feat_size = static_cast<input_report_size_t>(desc_rep->feature_byte_sz * 8);
}
FreeDeviceDescriptor(desc);
return ZX_OK;
}