1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright 2024 Intel Corporation */
#ifndef _HID_OVER_SPI_H_
#define _HID_OVER_SPI_H_
#include <linux/bits.h>
#include <linux/types.h>
/* Input report type definition in HIDSPI protocol */
enum input_report_type {
INVALID_INPUT_REPORT_TYPE_0 = 0,
DATA = 1,
INVALID_TYPE_2 = 2,
RESET_RESPONSE = 3,
COMMAND_RESPONSE = 4,
GET_FEATURE_RESPONSE = 5,
INVALID_TYPE_6 = 6,
DEVICE_DESCRIPTOR_RESPONSE = 7,
REPORT_DESCRIPTOR_RESPONSE = 8,
SET_FEATURE_RESPONSE = 9,
OUTPUT_REPORT_RESPONSE = 10,
GET_INPUT_REPORT_RESPONSE = 11,
INVALID_INPUT_REPORT_TYPE = 0xF,
};
/* Output report type definition in HIDSPI protocol */
enum output_report_type {
INVALID_OUTPUT_REPORT_TYPE_0 = 0,
DEVICE_DESCRIPTOR = 1,
REPORT_DESCRIPTOR = 2,
SET_FEATURE = 3,
GET_FEATURE = 4,
OUTPUT_REPORT = 5,
GET_INPUT_REPORT = 6,
COMMAND_CONTENT = 7,
};
/* Set power command ID for output report */
#define HIDSPI_SET_POWER_CMD_ID 1
/* Power state definition in HIDSPI protocol */
enum hidspi_power_state {
HIDSPI_ON = 1,
HIDSPI_SLEEP = 2,
HIDSPI_OFF = 3,
};
/**
* Input report header definition in HIDSPI protocol
* Report header size is 32bits, it includes:
* protocol_ver: [0:3] Current supported HIDSPI protocol version, must be 0x3
* reserved0: [4:7] Reserved bits
* input_report_len: [8:21] Input report length in number bytes divided by 4
* last_frag_flag: [22]Indicate if this packet is last fragment.
* 1 - indicates last fragment
* 0 - indicates additional fragments
* reserved1: [23] Reserved bits
* @sync_const: [24:31] Used to validate input report header, must be 0x5A
*/
#define HIDSPI_INPUT_HEADER_SIZE sizeof(u32)
#define HIDSPI_INPUT_HEADER_VER GENMASK(3, 0)
#define HIDSPI_INPUT_HEADER_REPORT_LEN GENMASK(21, 8)
#define HIDSPI_INPUT_HEADER_LAST_FLAG BIT(22)
#define HIDSPI_INPUT_HEADER_SYNC GENMASK(31, 24)
/**
* struct input_report_body_header - Input report body header definition in HIDSPI protocol
* @input_report_type: indicate input report type, reference to enum input_report_type
* @content_len: this input report body packet length
* @content_id: indicate this input report's report id
*/
struct input_report_body_header {
u8 input_report_type;
__le16 content_len;
u8 content_id;
} __packed;
#define HIDSPI_INPUT_BODY_HEADER_SIZE sizeof(struct input_report_body_header)
/**
* struct input_report_body - Input report body definition in HIDSPI protocol
* @body_hdr: input report body header
* @content: input report body content
*/
struct input_report_body {
struct input_report_body_header body_hdr;
u8 content[];
} __packed;
#define HIDSPI_INPUT_BODY_SIZE(content_len) ((content_len) + HIDSPI_INPUT_BODY_HEADER_SIZE)
/**
* struct output_report_header - Output report header definition in HIDSPI protocol
* @report_type: output report type, reference to enum output_report_type
* @content_len: length of content
* @content_id: 0x00 - descriptors
* report id - Set/Feature feature or Input/Output Reports
* command opcode - for commands
*/
struct output_report_header {
u8 report_type;
__le16 content_len;
u8 content_id;
} __packed;
#define HIDSPI_OUTPUT_REPORT_HEADER_SIZE sizeof(struct output_report_header)
/**
* struct output_report - Output report definition in HIDSPI protocol
* @output_hdr: output report header
* @content: output report content
*/
struct output_report {
struct output_report_header output_hdr;
u8 content[];
} __packed;
#define HIDSPI_OUTPUT_REPORT_SIZE(content_len) ((content_len) + HIDSPI_OUTPUT_REPORT_HEADER_SIZE)
/**
* struct hidspi_dev_descriptor - HIDSPI device descriptor definition
* @dev_desc_len: The length of the complete device descriptor, fixed to 0x18 (24).
* @bcd_ver: The version number of the HIDSPI protocol supported.
* In binary coded decimal (BCD) format. Must be fixed to 0x0300.
* @rep_desc_len: The length of the report descriptor
* @max_input_len: The length of the largest possible HID input (or feature) report
* @max_output_len: The length of the largest output (or feature) report
* @max_frag_len: The length of the largest fragment, where a fragment represents
* the body of an input report.
* @vendor_id: Device manufacturers vendor ID
* @product_id: Device unique model/product ID
* @version_id: Device’s unique version
* @flags: Specify flags for the device’s operation
* @reserved: Reserved and should be 0
*/
struct hidspi_dev_descriptor {
__le16 dev_desc_len;
__le16 bcd_ver;
__le16 rep_desc_len;
__le16 max_input_len;
__le16 max_output_len;
__le16 max_frag_len;
__le16 vendor_id;
__le16 product_id;
__le16 version_id;
__le16 flags;
__le32 reserved;
};
#define HIDSPI_DEVICE_DESCRIPTOR_SIZE sizeof(struct hidspi_dev_descriptor)
#define HIDSPI_INPUT_DEVICE_DESCRIPTOR_SIZE \
(HIDSPI_INPUT_BODY_HEADER_SIZE + HIDSPI_DEVICE_DESCRIPTOR_SIZE)
#endif /* _HID_OVER_SPI_H_ */
|