1e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz#ifndef __HID_ROCCAT_ARVO_H
2e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz#define __HID_ROCCAT_ARVO_H
3e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
4e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz/*
5e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz * Copyright (c) 2011 Stefan Achatz <erazor_de@users.sourceforge.net>
6e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz */
7e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
8e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz/*
9e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz * This program is free software; you can redistribute it and/or modify it
10e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz * under the terms of the GNU General Public License as published by the Free
11e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz * Software Foundation; either version 2 of the License, or (at your option)
12e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz * any later version.
13e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz */
14e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
15e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz#include <linux/types.h>
16e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
17e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_mode_key { /* 2 bytes */
18e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t command; /* ARVO_COMMAND_MODE_KEY */
19e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t state;
20e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
21e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
22e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_button {
23e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t unknown[24];
24e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
25e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
26e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_info {
27e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t unknown[8];
28e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
29e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
30e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_key_mask { /* 2 bytes */
31e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t command; /* ARVO_COMMAND_KEY_MASK */
32e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t key_mask;
33e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
34e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
35e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz/* selected profile is persistent */
36e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_actual_profile { /* 2 bytes */
37e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t command; /* ARVO_COMMAND_ACTUAL_PROFILE */
38e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t actual_profile;
39e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
40e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
41e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzenum arvo_commands {
42e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_COMMAND_MODE_KEY = 0x3,
43e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_COMMAND_BUTTON = 0x4,
44e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_COMMAND_INFO = 0x5,
45e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_COMMAND_KEY_MASK = 0x6,
46e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_COMMAND_ACTUAL_PROFILE = 0x7,
47e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz};
48e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
49e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_special_report {
50e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t unknown1; /* always 0x01 */
51e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t event;
52e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t unknown2; /* always 0x70 */
53e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
54e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
55e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzenum arvo_special_report_events {
56e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_SPECIAL_REPORT_EVENT_ACTION_PRESS = 0x10,
57e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_SPECIAL_REPORT_EVENT_ACTION_RELEASE = 0x0,
58e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz};
59e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
60e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzenum arvo_special_report_event_masks {
61e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_SPECIAL_REPORT_EVENT_MASK_ACTION = 0xf0,
62e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_SPECIAL_REPORT_EVENT_MASK_BUTTON = 0x0f,
63e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz};
64e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
65e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_roccat_report {
66e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t profile;
67e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t button;
68e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	uint8_t action;
69e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz} __packed;
70e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
71e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzenum arvo_roccat_report_action {
72e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_ROCCAT_REPORT_ACTION_RELEASE = 0,
73e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	ARVO_ROCCAT_REPORT_ACTION_PRESS = 1,
74e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz};
75e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
76e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatzstruct arvo_device {
77e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	int roccat_claimed;
78e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	int chrdev_minor;
79e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
80e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	struct mutex arvo_lock;
81e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
82e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz	int actual_profile;
83e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz};
84e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz
85e68cc603b063416c85f3e408184219fb71d4a9ffStefan Achatz#endif
86