xref: /OK3568_Linux_fs/kernel/drivers/hid/hid-roccat-pyra.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun #ifndef __HID_ROCCAT_PYRA_H
3*4882a593Smuzhiyun #define __HID_ROCCAT_PYRA_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * Copyright (c) 2010 Stefan Achatz <erazor_de@users.sourceforge.net>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun enum {
15*4882a593Smuzhiyun 	PYRA_SIZE_CONTROL = 0x03,
16*4882a593Smuzhiyun 	PYRA_SIZE_INFO = 0x06,
17*4882a593Smuzhiyun 	PYRA_SIZE_PROFILE_SETTINGS = 0x0d,
18*4882a593Smuzhiyun 	PYRA_SIZE_PROFILE_BUTTONS = 0x13,
19*4882a593Smuzhiyun 	PYRA_SIZE_SETTINGS = 0x03,
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun enum pyra_control_requests {
23*4882a593Smuzhiyun 	PYRA_CONTROL_REQUEST_PROFILE_SETTINGS = 0x10,
24*4882a593Smuzhiyun 	PYRA_CONTROL_REQUEST_PROFILE_BUTTONS = 0x20
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct pyra_settings {
28*4882a593Smuzhiyun 	uint8_t command; /* PYRA_COMMAND_SETTINGS */
29*4882a593Smuzhiyun 	uint8_t size; /* always 3 */
30*4882a593Smuzhiyun 	uint8_t startup_profile; /* Range 0-4! */
31*4882a593Smuzhiyun } __attribute__ ((__packed__));
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun struct pyra_profile_settings {
34*4882a593Smuzhiyun 	uint8_t command; /* PYRA_COMMAND_PROFILE_SETTINGS */
35*4882a593Smuzhiyun 	uint8_t size; /* always 0xd */
36*4882a593Smuzhiyun 	uint8_t number; /* Range 0-4 */
37*4882a593Smuzhiyun 	uint8_t xysync;
38*4882a593Smuzhiyun 	uint8_t x_sensitivity; /* 0x1-0xa */
39*4882a593Smuzhiyun 	uint8_t y_sensitivity;
40*4882a593Smuzhiyun 	uint8_t x_cpi; /* unused */
41*4882a593Smuzhiyun 	uint8_t y_cpi; /* this value is for x and y */
42*4882a593Smuzhiyun 	uint8_t lightswitch; /* 0 = off, 1 = on */
43*4882a593Smuzhiyun 	uint8_t light_effect;
44*4882a593Smuzhiyun 	uint8_t handedness;
45*4882a593Smuzhiyun 	uint16_t checksum; /* byte sum */
46*4882a593Smuzhiyun } __attribute__ ((__packed__));
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun struct pyra_info {
49*4882a593Smuzhiyun 	uint8_t command; /* PYRA_COMMAND_INFO */
50*4882a593Smuzhiyun 	uint8_t size; /* always 6 */
51*4882a593Smuzhiyun 	uint8_t firmware_version;
52*4882a593Smuzhiyun 	uint8_t unknown1; /* always 0 */
53*4882a593Smuzhiyun 	uint8_t unknown2; /* always 1 */
54*4882a593Smuzhiyun 	uint8_t unknown3; /* always 0 */
55*4882a593Smuzhiyun } __attribute__ ((__packed__));
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun enum pyra_commands {
58*4882a593Smuzhiyun 	PYRA_COMMAND_CONTROL = 0x4,
59*4882a593Smuzhiyun 	PYRA_COMMAND_SETTINGS = 0x5,
60*4882a593Smuzhiyun 	PYRA_COMMAND_PROFILE_SETTINGS = 0x6,
61*4882a593Smuzhiyun 	PYRA_COMMAND_PROFILE_BUTTONS = 0x7,
62*4882a593Smuzhiyun 	PYRA_COMMAND_INFO = 0x9,
63*4882a593Smuzhiyun 	PYRA_COMMAND_B = 0xb
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun enum pyra_mouse_report_numbers {
67*4882a593Smuzhiyun 	PYRA_MOUSE_REPORT_NUMBER_HID = 1,
68*4882a593Smuzhiyun 	PYRA_MOUSE_REPORT_NUMBER_AUDIO = 2,
69*4882a593Smuzhiyun 	PYRA_MOUSE_REPORT_NUMBER_BUTTON = 3,
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun struct pyra_mouse_event_button {
73*4882a593Smuzhiyun 	uint8_t report_number; /* always 3 */
74*4882a593Smuzhiyun 	uint8_t unknown; /* always 0 */
75*4882a593Smuzhiyun 	uint8_t type;
76*4882a593Smuzhiyun 	uint8_t data1;
77*4882a593Smuzhiyun 	uint8_t data2;
78*4882a593Smuzhiyun } __attribute__ ((__packed__));
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun struct pyra_mouse_event_audio {
81*4882a593Smuzhiyun 	uint8_t report_number; /* always 2 */
82*4882a593Smuzhiyun 	uint8_t type;
83*4882a593Smuzhiyun 	uint8_t unused; /* always 0 */
84*4882a593Smuzhiyun } __attribute__ ((__packed__));
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* hid audio controls */
87*4882a593Smuzhiyun enum pyra_mouse_event_audio_types {
88*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_AUDIO_TYPE_MUTE = 0xe2,
89*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_AUDIO_TYPE_VOLUME_UP = 0xe9,
90*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_AUDIO_TYPE_VOLUME_DOWN = 0xea,
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun enum pyra_mouse_event_button_types {
94*4882a593Smuzhiyun 	/*
95*4882a593Smuzhiyun 	 * Mouse sends tilt events on report_number 1 and 3
96*4882a593Smuzhiyun 	 * Tilt events are sent repeatedly with 0.94s between first and second
97*4882a593Smuzhiyun 	 * event and 0.22s on subsequent
98*4882a593Smuzhiyun 	 */
99*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_TILT = 0x10,
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	/*
102*4882a593Smuzhiyun 	 * These are sent sequentially
103*4882a593Smuzhiyun 	 * data1 contains new profile number in range 1-5
104*4882a593Smuzhiyun 	 */
105*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_PROFILE_1 = 0x20,
106*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_PROFILE_2 = 0x30,
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	/*
109*4882a593Smuzhiyun 	 * data1 = button_number (rmp index)
110*4882a593Smuzhiyun 	 * data2 = pressed/released
111*4882a593Smuzhiyun 	 */
112*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_MACRO = 0x40,
113*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_SHORTCUT = 0x50,
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	/*
116*4882a593Smuzhiyun 	 * data1 = button_number (rmp index)
117*4882a593Smuzhiyun 	 */
118*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_QUICKLAUNCH = 0x60,
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	/* data1 = new cpi */
121*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_CPI = 0xb0,
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	/* data1 and data2 = new sensitivity */
124*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_SENSITIVITY = 0xc0,
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_TYPE_MULTIMEDIA = 0xf0,
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun enum {
130*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_PRESS = 0,
131*4882a593Smuzhiyun 	PYRA_MOUSE_EVENT_BUTTON_RELEASE = 1,
132*4882a593Smuzhiyun };
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun struct pyra_roccat_report {
135*4882a593Smuzhiyun 	uint8_t type;
136*4882a593Smuzhiyun 	uint8_t value;
137*4882a593Smuzhiyun 	uint8_t key;
138*4882a593Smuzhiyun } __attribute__ ((__packed__));
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun struct pyra_device {
141*4882a593Smuzhiyun 	int actual_profile;
142*4882a593Smuzhiyun 	int actual_cpi;
143*4882a593Smuzhiyun 	int roccat_claimed;
144*4882a593Smuzhiyun 	int chrdev_minor;
145*4882a593Smuzhiyun 	struct mutex pyra_lock;
146*4882a593Smuzhiyun 	struct pyra_profile_settings profile_settings[5];
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun #endif
150