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