mirror of https://github.com/nirenjan/libx52.git
Update x52 driver with write to MFD code.
This still has a bug in that the text is not written correctly. It shows up as garbage. For now, I'm committing it so that I can work on it later after the brightness configuration is set up. Also add the commands header file.pull/3/head
parent
42642d5905
commit
02a7c326c7
|
@ -20,6 +20,8 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
|
||||||
|
#include "x52joy_commands.h"
|
||||||
|
|
||||||
#define DRIVER_AUTHOR "Nirenjan Krishnan, nirenjan@gmail.com"
|
#define DRIVER_AUTHOR "Nirenjan Krishnan, nirenjan@gmail.com"
|
||||||
#define DRIVER_DESC "Saitek X52Pro HOTAS Driver"
|
#define DRIVER_DESC "Saitek X52Pro HOTAS Driver"
|
||||||
|
|
||||||
|
@ -45,7 +47,8 @@ MODULE_DEVICE_TABLE (usb, id_table);
|
||||||
* - Date with YYMMDD (IIRC)
|
* - Date with YYMMDD (IIRC)
|
||||||
*/
|
*/
|
||||||
#define DRIVER_LINE_SIZE 256 /* Support upto 256 bytes in the driver */
|
#define DRIVER_LINE_SIZE 256 /* Support upto 256 bytes in the driver */
|
||||||
#define X52_MFD_LINE_SIZE 17 /* Add one for null byte */
|
#define X52_MFD_LINE_SIZE 16
|
||||||
|
#define X52_MFD_LINES 3
|
||||||
|
|
||||||
struct x52_mfd_line {
|
struct x52_mfd_line {
|
||||||
u8 text[DRIVER_LINE_SIZE];
|
u8 text[DRIVER_LINE_SIZE];
|
||||||
|
@ -56,7 +59,7 @@ struct x52_mfd_line {
|
||||||
struct x52_joy {
|
struct x52_joy {
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
u32 led_status;
|
u32 led_status;
|
||||||
struct x52_mfd_line line[3];
|
struct x52_mfd_line line[X52_MFD_LINES];
|
||||||
u8 time_hour;
|
u8 time_hour;
|
||||||
u8 time_min;
|
u8 time_min;
|
||||||
u16 time_offs2;
|
u16 time_offs2;
|
||||||
|
@ -74,9 +77,65 @@ struct x52_joy {
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* MFD Line manipulation functions
|
* MFD Line manipulation functions
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
static void set_text(u8 line_no)
|
static const u8 line_cmd[X52_MFD_LINES] = {
|
||||||
|
X52_MFD_LINE1,
|
||||||
|
X52_MFD_LINE2,
|
||||||
|
X52_MFD_LINE3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void set_text(struct x52_joy *joy, u8 line_no)
|
||||||
{
|
{
|
||||||
/* TODO */
|
u16 i;
|
||||||
|
u16 pos;
|
||||||
|
u16 ch;
|
||||||
|
u16 length;
|
||||||
|
char *text_ptr;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
if (!joy || line_no >= X52_MFD_LINES) {
|
||||||
|
/* Just some sanity checking */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the line first */
|
||||||
|
retval = usb_control_msg(joy->udev,
|
||||||
|
usb_sndctrlpipe(joy->udev, 0),
|
||||||
|
X52_VENDOR_REQUEST,
|
||||||
|
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
||||||
|
0x00,
|
||||||
|
line_cmd[line_no] | X52_MFD_CLEAR_LINE,
|
||||||
|
NULL, 0, 1000);
|
||||||
|
if (retval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pos = joy->line[line_no].current_pos;
|
||||||
|
length = joy->line[line_no].length;
|
||||||
|
|
||||||
|
for (i = 0; i < X52_MFD_LINE_SIZE; i+= 2) {
|
||||||
|
text_ptr = &joy->line[line_no].text[pos];
|
||||||
|
if (length - pos > 1) {
|
||||||
|
ch = (u16 *)text_ptr;
|
||||||
|
} else {
|
||||||
|
ch = (*text_ptr) + (0x20 << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = usb_control_msg(joy->udev,
|
||||||
|
usb_sndctrlpipe(joy->udev, 0),
|
||||||
|
X52_VENDOR_REQUEST,
|
||||||
|
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
||||||
|
ch,
|
||||||
|
line_cmd[line_no] | X52_MFD_WRITE_LINE,
|
||||||
|
NULL, 0, 1000);
|
||||||
|
|
||||||
|
pos += 2;
|
||||||
|
|
||||||
|
if (pos >= length) {
|
||||||
|
pos = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
joy->line[line_no].current_pos = pos;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +144,8 @@ static ssize_t show_text_line(struct device *dev, char *buf, u8 line)
|
||||||
struct usb_interface *intf = to_usb_interface(dev);
|
struct usb_interface *intf = to_usb_interface(dev);
|
||||||
struct x52_joy *joy = usb_get_intfdata(intf);
|
struct x52_joy *joy = usb_get_intfdata(intf);
|
||||||
|
|
||||||
|
line--; /* Convert to 0-based line number */
|
||||||
|
|
||||||
if (joy->feat_mfd) {
|
if (joy->feat_mfd) {
|
||||||
return sprintf(buf, "%s\n", joy->line[line].text);
|
return sprintf(buf, "%s\n", joy->line[line].text);
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,6 +166,8 @@ static ssize_t set_text_line(struct device *dev, const char *buf,\
|
||||||
if (!joy->feat_mfd) {
|
if (!joy->feat_mfd) {
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
line--; /* Convert to 0-based line number */
|
||||||
|
|
||||||
/* Copy the string from src to dst, upto 16 characters max */
|
/* Copy the string from src to dst, upto 16 characters max */
|
||||||
for (i = 0, length = 0; i < DRIVER_LINE_SIZE - 1 && i < count; i++, length++) {
|
for (i = 0, length = 0; i < DRIVER_LINE_SIZE - 1 && i < count; i++, length++) {
|
||||||
|
@ -118,7 +181,7 @@ static ssize_t set_text_line(struct device *dev, const char *buf,\
|
||||||
/* The X52 pro MFD uses space characters as empty characters */
|
/* The X52 pro MFD uses space characters as empty characters */
|
||||||
joy->line[line].text[i] = 32;
|
joy->line[line].text[i] = 32;
|
||||||
}
|
}
|
||||||
set_text(line);
|
set_text(joy, line);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Saitek X52 Pro HOTAS driver
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Nirenjan Krishnan (nirenjan@nirenjan.org)
|
||||||
|
*
|
||||||
|
* 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, version 2.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef X52JOY_COMMANDS_H
|
||||||
|
#define X52JOY_COMMANDS_H
|
||||||
|
|
||||||
|
/* X52 vendor API commands */
|
||||||
|
/* Vendor request - all commands must have this request ID */
|
||||||
|
#define X52_VENDOR_REQUEST 0x91
|
||||||
|
|
||||||
|
/* MFD Text commands */
|
||||||
|
#define X52_MFD_CLEAR_LINE 0x08
|
||||||
|
#define X52_MFD_WRITE_LINE 0x00
|
||||||
|
|
||||||
|
#define X52_MFD_LINE1 0xd1
|
||||||
|
#define X52_MFD_LINE2 0xd2
|
||||||
|
#define X52_MFD_LINE3 0xd4
|
||||||
|
|
||||||
|
/* Brightness commands */
|
||||||
|
#define X52_MFD_BRIGHTNESS 0xb1
|
||||||
|
#define X52_LED_BRIGHTNESS 0xb2
|
||||||
|
|
||||||
|
/* LED set commands */
|
||||||
|
#define X52_LED 0xb8
|
||||||
|
|
||||||
|
/* Time commands */
|
||||||
|
#define X52_TIME_CLOCK1 0xc0
|
||||||
|
#define X52_OFFS_CLOCK2 0xc1
|
||||||
|
#define X52_OFFS_CLOCK3 0xc2
|
||||||
|
|
||||||
|
/* Date commands */
|
||||||
|
#define X52_DATE_DDMM 0xc4
|
||||||
|
#define X52_DATE_YEAR 0xc8
|
||||||
|
|
||||||
|
/* Shift indicator on MFD */
|
||||||
|
#define X52_SHIFT_INDICATOR 0xfd
|
||||||
|
#define X52_SHIFT_ON 0x51
|
||||||
|
#define X52_SHIFT_OFF 0x50
|
||||||
|
|
||||||
|
/* Blink throttle & POV LED */
|
||||||
|
#define X52_BLINK_INDICATOR 0xb4
|
||||||
|
#define X52_BLINK_ON 0x51
|
||||||
|
#define X52_BLINK_OFF 0x50
|
||||||
|
|
||||||
|
#endif /* !defined X52JOY_COMMANDS_H */
|
Loading…
Reference in New Issue