1 #ifndef __HID_ROCCAT_PYRA_H 2 #define __HID_ROCCAT_PYRA_H 3 4 /* 5 * Copyright (c) 2010 Stefan Achatz <erazor_de@users.sourceforge.net> 6 */ 7 8 /* 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the Free 11 * Software Foundation; either version 2 of the License, or (at your option) 12 * any later version. 13 */ 14 15 #include <linux/types.h> 16 17 struct pyra_b { 18 uint8_t command; /* PYRA_COMMAND_B */ 19 uint8_t size; /* always 3 */ 20 uint8_t unknown; /* 1 */ 21 } __attribute__ ((__packed__)); 22 23 struct pyra_control { 24 uint8_t command; /* PYRA_COMMAND_CONTROL */ 25 /* 26 * value is profile number for request_settings and request_buttons 27 * 1 if status ok for request_status 28 */ 29 uint8_t value; /* Range 0-4 */ 30 uint8_t request; 31 } __attribute__ ((__packed__)); 32 33 enum pyra_control_requests { 34 PYRA_CONTROL_REQUEST_STATUS = 0x00, 35 PYRA_CONTROL_REQUEST_PROFILE_SETTINGS = 0x10, 36 PYRA_CONTROL_REQUEST_PROFILE_BUTTONS = 0x20 37 }; 38 39 struct pyra_settings { 40 uint8_t command; /* PYRA_COMMAND_SETTINGS */ 41 uint8_t size; /* always 3 */ 42 uint8_t startup_profile; /* Range 0-4! */ 43 } __attribute__ ((__packed__)); 44 45 struct pyra_profile_settings { 46 uint8_t command; /* PYRA_COMMAND_PROFILE_SETTINGS */ 47 uint8_t size; /* always 0xd */ 48 uint8_t number; /* Range 0-4 */ 49 uint8_t xysync; 50 uint8_t x_sensitivity; /* 0x1-0xa */ 51 uint8_t y_sensitivity; 52 uint8_t x_cpi; /* unused */ 53 uint8_t y_cpi; /* this value is for x and y */ 54 uint8_t lightswitch; /* 0 = off, 1 = on */ 55 uint8_t light_effect; 56 uint8_t handedness; 57 uint16_t checksum; /* byte sum */ 58 } __attribute__ ((__packed__)); 59 60 struct pyra_profile_buttons { 61 uint8_t command; /* PYRA_COMMAND_PROFILE_BUTTONS */ 62 uint8_t size; /* always 0x13 */ 63 uint8_t number; /* Range 0-4 */ 64 uint8_t buttons[14]; 65 uint16_t checksum; /* byte sum */ 66 } __attribute__ ((__packed__)); 67 68 struct pyra_info { 69 uint8_t command; /* PYRA_COMMAND_INFO */ 70 uint8_t size; /* always 6 */ 71 uint8_t firmware_version; 72 uint8_t unknown1; /* always 0 */ 73 uint8_t unknown2; /* always 1 */ 74 uint8_t unknown3; /* always 0 */ 75 } __attribute__ ((__packed__)); 76 77 enum pyra_commands { 78 PYRA_COMMAND_CONTROL = 0x4, 79 PYRA_COMMAND_SETTINGS = 0x5, 80 PYRA_COMMAND_PROFILE_SETTINGS = 0x6, 81 PYRA_COMMAND_PROFILE_BUTTONS = 0x7, 82 PYRA_COMMAND_INFO = 0x9, 83 PYRA_COMMAND_B = 0xb 84 }; 85 86 enum pyra_mouse_report_numbers { 87 PYRA_MOUSE_REPORT_NUMBER_HID = 1, 88 PYRA_MOUSE_REPORT_NUMBER_AUDIO = 2, 89 PYRA_MOUSE_REPORT_NUMBER_BUTTON = 3, 90 }; 91 92 struct pyra_mouse_event_button { 93 uint8_t report_number; /* always 3 */ 94 uint8_t unknown; /* always 0 */ 95 uint8_t type; 96 uint8_t data1; 97 uint8_t data2; 98 } __attribute__ ((__packed__)); 99 100 struct pyra_mouse_event_audio { 101 uint8_t report_number; /* always 2 */ 102 uint8_t type; 103 uint8_t unused; /* always 0 */ 104 } __attribute__ ((__packed__)); 105 106 /* hid audio controls */ 107 enum pyra_mouse_event_audio_types { 108 PYRA_MOUSE_EVENT_AUDIO_TYPE_MUTE = 0xe2, 109 PYRA_MOUSE_EVENT_AUDIO_TYPE_VOLUME_UP = 0xe9, 110 PYRA_MOUSE_EVENT_AUDIO_TYPE_VOLUME_DOWN = 0xea, 111 }; 112 113 enum pyra_mouse_event_button_types { 114 /* 115 * Mouse sends tilt events on report_number 1 and 3 116 * Tilt events are sent repeatedly with 0.94s between first and second 117 * event and 0.22s on subsequent 118 */ 119 PYRA_MOUSE_EVENT_BUTTON_TYPE_TILT = 0x10, 120 121 /* 122 * These are sent sequentially 123 * data1 contains new profile number in range 1-5 124 */ 125 PYRA_MOUSE_EVENT_BUTTON_TYPE_PROFILE_1 = 0x20, 126 PYRA_MOUSE_EVENT_BUTTON_TYPE_PROFILE_2 = 0x30, 127 128 /* 129 * data1 = button_number (rmp index) 130 * data2 = pressed/released 131 */ 132 PYRA_MOUSE_EVENT_BUTTON_TYPE_MACRO = 0x40, 133 PYRA_MOUSE_EVENT_BUTTON_TYPE_SHORTCUT = 0x50, 134 135 /* 136 * data1 = button_number (rmp index) 137 */ 138 PYRA_MOUSE_EVENT_BUTTON_TYPE_QUICKLAUNCH = 0x60, 139 140 /* data1 = new cpi */ 141 PYRA_MOUSE_EVENT_BUTTON_TYPE_CPI = 0xb0, 142 143 /* data1 and data2 = new sensitivity */ 144 PYRA_MOUSE_EVENT_BUTTON_TYPE_SENSITIVITY = 0xc0, 145 146 PYRA_MOUSE_EVENT_BUTTON_TYPE_MULTIMEDIA = 0xf0, 147 }; 148 149 enum { 150 PYRA_MOUSE_EVENT_BUTTON_PRESS = 0, 151 PYRA_MOUSE_EVENT_BUTTON_RELEASE = 1, 152 }; 153 154 struct pyra_roccat_report { 155 uint8_t type; 156 uint8_t value; 157 uint8_t key; 158 } __attribute__ ((__packed__)); 159 160 struct pyra_device { 161 int actual_profile; 162 int actual_cpi; 163 int firmware_version; 164 int roccat_claimed; 165 int chrdev_minor; 166 struct mutex pyra_lock; 167 struct pyra_settings settings; 168 struct pyra_profile_settings profile_settings[5]; 169 struct pyra_profile_buttons profile_buttons[5]; 170 }; 171 172 #endif 173