blob: 442f3179a9fdbfd639862fb99899b9e7961ea7d2 [file] [log] [blame]
/*
* Copyright (c) 2015 Tim Theede <pez2001@voyagerproject.de>
* 2015 Terry Cain <terry@terrys-home.co.uk>
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*/
#ifndef DRIVER_RAZERCOMMON_H_
#define DRIVER_RAZERCOMMON_H_
#include <linux/usb/input.h>
#define DRIVER_VERSION "2.7.0"
#define DRIVER_LICENSE "GPL v2"
#define DRIVER_AUTHOR "Terry Cain <terry@terrys-home.co.uk>"
// Macro to create device files
#define CREATE_DEVICE_FILE(dev, type) \
do { \
if(device_create_file(dev, type)) { \
goto exit_free; \
} \
} while (0)
#define USB_VENDOR_ID_RAZER 0x1532
/* Each USB report has 90 bytes*/
#define RAZER_USB_REPORT_LEN 0x5A
// LED STATE
#define OFF 0x00
#define ON 0x01
// LED STORAGE Options
#define NOSTORE 0x00
#define VARSTORE 0x01
// LED definitions
#define ZERO_LED 0x00
#define SCROLL_WHEEL_LED 0x01
#define BATTERY_LED 0x03
#define LOGO_LED 0x04
#define BACKLIGHT_LED 0x05
#define MACRO_LED 0x07
#define GAME_LED 0x08
#define RED_PROFILE_LED 0x0C
#define GREEN_PROFILE_LED 0x0D
#define BLUE_PROFILE_LED 0x0E
#define RIGHT_SIDE_LED 0x10
#define LEFT_SIDE_LED 0x11
// LED Effect definitions
#define LED_STATIC 0x00
#define LED_BLINKING 0x01
#define LED_PULSATING 0x02
#define LED_SPECTRUM_CYCLING 0x04
// Report Responses
#define RAZER_CMD_BUSY 0x01
#define RAZER_CMD_SUCCESSFUL 0x02
#define RAZER_CMD_FAILURE 0x03
#define RAZER_CMD_TIMEOUT 0x04
#define RAZER_CMD_NOT_SUPPORTED 0x05
struct razer_report;
struct razer_rgb {
unsigned char r,g,b;
};
union transaction_id_union {
unsigned char id;
struct transaction_parts {
unsigned char device : 3;
unsigned char id : 5;
} parts;
};
union command_id_union {
unsigned char id;
struct command_id_parts {
unsigned char direction : 1;
unsigned char id : 7;
} parts;
};
/* Status:
* 0x00 New Command
* 0x01 Command Busy
* 0x02 Command Successful
* 0x03 Command Failure
* 0x04 Command No Response / Command Timeout
* 0x05 Command Not Support
*
* Transaction ID used to group request-response, device useful when multiple devices are on one usb
* Remaining Packets is the number of remaining packets in the sequence
* Protocol Type is always 0x00
* Data Size is the size of payload, cannot be greater than 80. 90 = header (8B) + data + CRC (1B) + Reserved (1B)
* Command Class is the type of command being issued
* Command ID is the type of command being send. Direction 0 is Host->Device, Direction 1 is Device->Host. AKA Get LED 0x80, Set LED 0x00
*
* */
struct razer_report {
unsigned char status;
union transaction_id_union transaction_id; /* */
unsigned short remaining_packets; /* Big Endian */
unsigned char protocol_type; /*0x0*/
unsigned char data_size;
unsigned char command_class;
union command_id_union command_id;
unsigned char arguments[80];
unsigned char crc;/*xor'ed bytes of report*/
unsigned char reserved; /*0x0*/
};
struct razer_key_translation {
u16 from;
u16 to;
u8 flags;
};
int razer_send_control_msg(struct usb_device *usb_dev,void const *data, unsigned int report_index, unsigned long wait_min, unsigned long wait_max);
int razer_send_control_msg_old_device(struct usb_device *usb_dev,void const *data, uint report_value, uint report_index, uint report_size, ulong wait_min, ulong wait_max);
int razer_get_usb_response(struct usb_device *usb_dev, unsigned int report_index, struct razer_report* request_report, unsigned int response_index, struct razer_report* response_report, unsigned long wait_min, unsigned long wait_max);
unsigned char razer_calculate_crc(struct razer_report *report);
struct razer_report get_razer_report(unsigned char command_class, unsigned char command_id, unsigned char data_size);
struct razer_report get_empty_razer_report(void);
void print_erroneous_report(struct razer_report* report, char* driver_name, char* message);
// Convenience functions
unsigned char clamp_u8(unsigned char value, unsigned char min, unsigned char max);
unsigned short clamp_u16(unsigned short value, unsigned short min, unsigned short max);
#endif /* DRIVER_RAZERCOMMON_H_ */