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