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