From 60ff5826dd474498769fbb3b6a303a62b45030c0 Mon Sep 17 00:00:00 2001 From: Nirenjan Krishnan Date: Fri, 5 Oct 2012 10:38:34 -0700 Subject: [PATCH] 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. --- driver/x52joy.c | 130 ++++++++++++++++++++++++++++++++++++++- driver/x52joy_commands.h | 22 +++++++ 2 files changed, 151 insertions(+), 1 deletion(-) diff --git a/driver/x52joy.c b/driver/x52joy.c index 8756b66..4a5a6b1 100644 --- a/driver/x52joy.c +++ b/driver/x52joy.c @@ -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; diff --git a/driver/x52joy_commands.h b/driver/x52joy_commands.h index bb8a6c8..75d920c 100644 --- a/driver/x52joy_commands.h +++ b/driver/x52joy_commands.h @@ -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 */