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