#ifndef __HID_REPORT_DESCRIPTOR_HELPERS_H
#define __HID_REPORT_DESCRIPTOR_HELPERS_H
#include "vmlinux.h"
#ifndef __packed
#define __packed __attribute__((packed))
#endif
#ifndef __maybe_unused
#define __maybe_unused __attribute__((__unused__))
#endif
#define HID_MAX_COLLECTIONS 32
#define HID_MAX_FIELDS 64
#define HID_MAX_REPORTS 16
enum hid_rdesc_field_type {
HID_FIELD_VARIABLE = 0,
HID_FIELD_ARRAY = 1,
HID_FIELD_CONSTANT = 2,
};
struct hid_rdesc_collection {
__u16 usage_page;
__u16 usage_id;
__u8 collection_type;
} __packed;
struct hid_rdesc_field {
__u8 field_type;
__u8 num_collections;
__u16 bits_start;
__u16 bits_end;
__u16 usage_page;
union {
__u16 usage_id;
struct __packed {
__u16 usage_minimum;
__u16 usage_maximum;
};
};
__s32 logical_minimum;
__s32 logical_maximum;
struct {
__u8 is_relative:1;
__u8 wraps:1;
__u8 is_nonlinear:1;
__u8 has_no_preferred_state:1;
__u8 has_null_state:1;
__u8 is_volatile:1;
__u8 is_buffered_bytes:1;
__u8 reserved:1;
} flags;
struct hid_rdesc_collection collections[HID_MAX_COLLECTIONS];
} __packed;
struct hid_rdesc_report {
__u8 report_id;
__u16 size_in_bits;
__u8 num_fields;
struct hid_rdesc_field fields[HID_MAX_FIELDS];
} __packed;
struct hid_rdesc_descriptor {
__u8 num_input_reports;
__u8 num_output_reports;
__u8 num_feature_reports;
struct hid_rdesc_report input_reports[HID_MAX_REPORTS];
struct hid_rdesc_report output_reports[HID_MAX_REPORTS];
struct hid_rdesc_report feature_reports[HID_MAX_REPORTS];
} __packed;
#endif