Add LED support to x52 joystick driver

This commit adds sysfs files to enable or disable the LEDs on the
X52 Pro joystick. This also fixes a minor bug with the brightness
API which was always complaining not-supported.
pull/3/head
Nirenjan Krishnan 2012-10-05 10:38:34 -07:00
parent d1dec19b95
commit 60ff5826dd
2 changed files with 151 additions and 1 deletions

View File

@ -270,7 +270,7 @@ static ssize_t set_brightness(struct device *dev, const char *buf,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
bri, ch,
NULL, 0, 1000);
return 1;
return count;
}
static ssize_t show_brightness(struct device *dev, char *buf, u8 target)
@ -314,6 +314,113 @@ static DEVICE_ATTR(bri_led, S_IWUGO | S_IRUGO, show_bri_led, set_bri_led);
#undef mfd
#undef led
/**********************************************************************
* LED manipulation functions
*********************************************************************/
#define fire X52_LED_FIRE
#define a_red X52_LED_A_RED
#define a_green X52_LED_A_GREEN
#define b_red X52_LED_B_RED
#define b_green X52_LED_B_GREEN
#define d_red X52_LED_D_RED
#define d_green X52_LED_D_GREEN
#define e_red X52_LED_E_RED
#define e_green X52_LED_E_GREEN
#define t1_red X52_LED_T1_RED
#define t1_green X52_LED_T1_GREEN
#define t2_red X52_LED_T2_RED
#define t2_green X52_LED_T2_GREEN
#define t3_red X52_LED_T3_RED
#define t3_green X52_LED_T3_GREEN
#define pov_red X52_LED_POV_RED
#define pov_green X52_LED_POV_GREEN
#define i_red X52_LED_I_RED
#define i_green X52_LED_I_GREEN
#define throttle X52_LED_THROTTLE
/*
static int set_x52_led(struct x52_joy *joy, u8 target, u8 status)
{
int retval;
retval = usb_control_msg(joy->udev,
usb_sndctrlpipe(joy->udev, 0),
X52_VENDOR_REQUEST,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
target << 8 | status, X52_LED,
NULL, 0, 1000);
return retval;
}
*/
static ssize_t set_led(struct device *dev, const char *buf,
size_t count, u8 target)
{
u8 status;
int retval;
struct usb_interface *intf = to_usb_interface(dev);
struct x52_joy *joy = usb_get_intfdata(intf);
if (target > X52_LED_THROTTLE || count < 1 || buf[0] < '0' ||
buf[0] > '1') {
/* Just some sanity checking */
return -EOPNOTSUPP;
}
status = buf[0] - '0';
retval = usb_control_msg(joy->udev,
usb_sndctrlpipe(joy->udev, 0),
X52_VENDOR_REQUEST,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
target << 8 | status, X52_LED,
NULL, 0, 1000);
return count;
}
static ssize_t show_led(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct usb_interface *intf = to_usb_interface(dev);
struct x52_joy *joy = usb_get_intfdata(intf);
if (joy->feat_led) {
return sprintf(buf, "0x%08x\n", joy->led_status);
}
sprintf(buf, "\n");
return -EOPNOTSUPP;
}
#define show_set_led(no) \
static ssize_t set_led_##no(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
{ \
return set_led(dev, buf, count, no); \
} \
static DEVICE_ATTR(led_##no, S_IWUGO | S_IRUGO, show_led, set_led_##no);
show_set_led(fire);
show_set_led(a_red);
show_set_led(a_green);
show_set_led(b_red);
show_set_led(b_green);
show_set_led(d_red);
show_set_led(d_green);
show_set_led(e_red);
show_set_led(e_green);
show_set_led(t1_red);
show_set_led(t1_green);
show_set_led(t2_red);
show_set_led(t2_green);
show_set_led(t3_red);
show_set_led(t3_green);
show_set_led(pov_red);
show_set_led(pov_green);
show_set_led(i_red);
show_set_led(i_green);
show_set_led(throttle);
/**********************************************************************
* X52 driver functions
*********************************************************************/
@ -346,6 +453,27 @@ static int x52_probe(struct usb_interface *intf,
device_create_file(&intf->dev, &dev_attr_bri_mfd);
device_create_file(&intf->dev, &dev_attr_bri_led);
device_create_file(&intf->dev, &dev_attr_led_fire);
device_create_file(&intf->dev, &dev_attr_led_a_red);
device_create_file(&intf->dev, &dev_attr_led_a_green);
device_create_file(&intf->dev, &dev_attr_led_b_red);
device_create_file(&intf->dev, &dev_attr_led_b_green);
device_create_file(&intf->dev, &dev_attr_led_d_red);
device_create_file(&intf->dev, &dev_attr_led_d_green);
device_create_file(&intf->dev, &dev_attr_led_e_red);
device_create_file(&intf->dev, &dev_attr_led_e_green);
device_create_file(&intf->dev, &dev_attr_led_t1_red);
device_create_file(&intf->dev, &dev_attr_led_t1_green);
device_create_file(&intf->dev, &dev_attr_led_t2_red);
device_create_file(&intf->dev, &dev_attr_led_t2_green);
device_create_file(&intf->dev, &dev_attr_led_t3_red);
device_create_file(&intf->dev, &dev_attr_led_t3_green);
device_create_file(&intf->dev, &dev_attr_led_pov_red);
device_create_file(&intf->dev, &dev_attr_led_pov_green);
device_create_file(&intf->dev, &dev_attr_led_i_red);
device_create_file(&intf->dev, &dev_attr_led_i_green);
device_create_file(&intf->dev, &dev_attr_led_throttle);
dev_info(&intf->dev, "X52 device now attached\n");
return 0;

View File

@ -50,4 +50,26 @@
#define X52_BLINK_ON 0x51
#define X52_BLINK_OFF 0x50
/* LED indices */
#define X52_LED_FIRE 0x01
#define X52_LED_A_RED 0x02
#define X52_LED_A_GREEN 0x03
#define X52_LED_B_RED 0x04
#define X52_LED_B_GREEN 0x05
#define X52_LED_D_RED 0x06
#define X52_LED_D_GREEN 0x07
#define X52_LED_E_RED 0x08
#define X52_LED_E_GREEN 0x09
#define X52_LED_T1_RED 0x0a
#define X52_LED_T1_GREEN 0x0b
#define X52_LED_T2_RED 0x0c
#define X52_LED_T2_GREEN 0x0d
#define X52_LED_T3_RED 0x0e
#define X52_LED_T3_GREEN 0x0f
#define X52_LED_POV_RED 0x10
#define X52_LED_POV_GREEN 0x11
#define X52_LED_I_RED 0x12
#define X52_LED_I_GREEN 0x13
#define X52_LED_THROTTLE 0x14
#endif /* !defined X52JOY_COMMANDS_H */