mirror of https://github.com/nirenjan/libx52.git
Add sysfs files to control LED and MFD brightness
This also fixes the issue with the text display on the MFD.pull/3/head
parent
02a7c326c7
commit
5add6a544d
117
driver/x52joy.c
117
driver/x52joy.c
|
@ -67,6 +67,8 @@ struct x52_joy {
|
||||||
u8 date_year;
|
u8 date_year;
|
||||||
u8 date_month;
|
u8 date_month;
|
||||||
u8 date_day;
|
u8 date_day;
|
||||||
|
u8 bri_mfd;
|
||||||
|
u8 bri_led;
|
||||||
|
|
||||||
u8 mode_h24:1;
|
u8 mode_h24:1;
|
||||||
u8 feat_mfd:1;
|
u8 feat_mfd:1;
|
||||||
|
@ -114,7 +116,7 @@ static void set_text(struct x52_joy *joy, u8 line_no)
|
||||||
for (i = 0; i < X52_MFD_LINE_SIZE; i+= 2) {
|
for (i = 0; i < X52_MFD_LINE_SIZE; i+= 2) {
|
||||||
text_ptr = &joy->line[line_no].text[pos];
|
text_ptr = &joy->line[line_no].text[pos];
|
||||||
if (length - pos > 1) {
|
if (length - pos > 1) {
|
||||||
ch = (u16 *)text_ptr;
|
ch = *(u16 *)text_ptr;
|
||||||
} else {
|
} else {
|
||||||
ch = (*text_ptr) + (0x20 << 8);
|
ch = (*text_ptr) + (0x20 << 8);
|
||||||
}
|
}
|
||||||
|
@ -201,6 +203,116 @@ show_set_text(1);
|
||||||
show_set_text(2);
|
show_set_text(2);
|
||||||
show_set_text(3);
|
show_set_text(3);
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Brightness manipulation functions
|
||||||
|
*********************************************************************/
|
||||||
|
#define mfd 0
|
||||||
|
#define led 1
|
||||||
|
|
||||||
|
static int to_hex(const char c)
|
||||||
|
{
|
||||||
|
/* Converts a single character to hex */
|
||||||
|
if (c >= '0' && c <= '9') {
|
||||||
|
return (c - '0');
|
||||||
|
} else if (c >= 'A' && c <= 'F') {
|
||||||
|
return (c - 'A' + 10);
|
||||||
|
} else if (c >= 'a' && c <= 'f') {
|
||||||
|
return (c - 'a' + 10);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
static ssize_t set_brightness(struct device *dev, const char *buf,
|
||||||
|
size_t count, u8 target)
|
||||||
|
{
|
||||||
|
u16 bri;
|
||||||
|
u16 ch;
|
||||||
|
int retval;
|
||||||
|
struct usb_interface *intf = to_usb_interface(dev);
|
||||||
|
struct x52_joy *joy = usb_get_intfdata(intf);
|
||||||
|
|
||||||
|
if (target >= 2 || count != 4 || buf[0] != '0' ||
|
||||||
|
((buf[1] | 0x20) != 'x')) {
|
||||||
|
/* Just some sanity checking */
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
bri = 0;
|
||||||
|
ch = to_hex(buf[2]);
|
||||||
|
if (ch >= 0) {
|
||||||
|
bri |= ch;
|
||||||
|
bri <<= 4;
|
||||||
|
} else {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
ch = to_hex(buf[3]);
|
||||||
|
if (ch >= 0) {
|
||||||
|
bri |= ch;
|
||||||
|
} else {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bri > 0x80) {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target == mfd) {
|
||||||
|
ch = X52_MFD_BRIGHTNESS;
|
||||||
|
joy->bri_mfd = bri;
|
||||||
|
} else {
|
||||||
|
ch = X52_LED_BRIGHTNESS;
|
||||||
|
joy->bri_led = bri;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = usb_control_msg(joy->udev,
|
||||||
|
usb_sndctrlpipe(joy->udev, 0),
|
||||||
|
X52_VENDOR_REQUEST,
|
||||||
|
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
||||||
|
bri, ch,
|
||||||
|
NULL, 0, 1000);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_brightness(struct device *dev, char *buf, u8 target)
|
||||||
|
{
|
||||||
|
struct usb_interface *intf = to_usb_interface(dev);
|
||||||
|
struct x52_joy *joy = usb_get_intfdata(intf);
|
||||||
|
|
||||||
|
if (target == mfd) {
|
||||||
|
if (joy->feat_mfd) {
|
||||||
|
return sprintf(buf, "0x%02x\n", joy->bri_mfd);
|
||||||
|
}
|
||||||
|
} else if (target == led) {
|
||||||
|
if (joy->feat_led) {
|
||||||
|
return sprintf(buf, "0x%02x\n", joy->bri_led);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buf, "\n");
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_bri_mfd (struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return show_brightness(dev, buf, mfd);
|
||||||
|
}
|
||||||
|
static ssize_t set_bri_mfd (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
return set_brightness(dev, buf, count, mfd);
|
||||||
|
}
|
||||||
|
static ssize_t show_bri_led (struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return show_brightness(dev, buf, led);
|
||||||
|
}
|
||||||
|
static ssize_t set_bri_led (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
return set_brightness(dev, buf, count, led);
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(bri_mfd, S_IWUGO | S_IRUGO, show_bri_mfd, set_bri_mfd);
|
||||||
|
static DEVICE_ATTR(bri_led, S_IWUGO | S_IRUGO, show_bri_led, set_bri_led);
|
||||||
|
|
||||||
|
#undef mfd
|
||||||
|
#undef led
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* X52 driver functions
|
* X52 driver functions
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
@ -230,6 +342,9 @@ static int x52_probe(struct usb_interface *intf,
|
||||||
device_create_file(&intf->dev, &dev_attr_line2);
|
device_create_file(&intf->dev, &dev_attr_line2);
|
||||||
device_create_file(&intf->dev, &dev_attr_line3);
|
device_create_file(&intf->dev, &dev_attr_line3);
|
||||||
|
|
||||||
|
device_create_file(&intf->dev, &dev_attr_bri_mfd);
|
||||||
|
device_create_file(&intf->dev, &dev_attr_bri_led);
|
||||||
|
|
||||||
dev_info(&intf->dev, "X52 device now attached\n");
|
dev_info(&intf->dev, "X52 device now attached\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue