HID: ntrig: identify firmware version
This adds firmware version polling to the end of probe and reports the version both in the raw form and proccessed to match the formatting used by N-Trig. Signed-off-by: Rafi Rubin <rafi@seas.upenn.edu> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Acked-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
a52dc34c0e
commit
0277873c05
|
@ -90,6 +90,55 @@ struct ntrig_data {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function converts the 4 byte raw firmware code into
|
||||||
|
* a string containing 5 comma separated numbers.
|
||||||
|
*/
|
||||||
|
static int ntrig_version_string(unsigned char *raw, char *buf)
|
||||||
|
{
|
||||||
|
__u8 a = (raw[1] & 0x0e) >> 1;
|
||||||
|
__u8 b = (raw[0] & 0x3c) >> 2;
|
||||||
|
__u8 c = ((raw[0] & 0x03) << 3) | ((raw[3] & 0xe0) >> 5);
|
||||||
|
__u8 d = ((raw[3] & 0x07) << 3) | ((raw[2] & 0xe0) >> 5);
|
||||||
|
__u8 e = raw[2] & 0x07;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As yet unmapped bits:
|
||||||
|
* 0b11000000 0b11110001 0b00011000 0b00011000
|
||||||
|
*/
|
||||||
|
|
||||||
|
return sprintf(buf, "%u.%u.%u.%u.%u", a, b, c, d, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ntrig_report_version(struct hid_device *hdev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char buf[20];
|
||||||
|
struct usb_device *usb_dev = hid_to_usb_dev(hdev);
|
||||||
|
unsigned char *data = kmalloc(8, GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
goto err_free;
|
||||||
|
|
||||||
|
ret = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
|
||||||
|
USB_REQ_CLEAR_FEATURE,
|
||||||
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE |
|
||||||
|
USB_DIR_IN,
|
||||||
|
0x30c, 1, data, 8,
|
||||||
|
USB_CTRL_SET_TIMEOUT);
|
||||||
|
|
||||||
|
if (ret == 8) {
|
||||||
|
ret = ntrig_version_string(&data[2], buf);
|
||||||
|
|
||||||
|
dev_info(&hdev->dev,
|
||||||
|
"Firmware version: %s (%02x%02x %02x%02x)\n",
|
||||||
|
buf, data[2], data[3], data[4], data[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
err_free:
|
||||||
|
kfree(data);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t show_phys_width(struct device *dev,
|
static ssize_t show_phys_width(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
|
@ -848,6 +897,8 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||||
if (report)
|
if (report)
|
||||||
usbhid_submit_report(hdev, report, USB_DIR_OUT);
|
usbhid_submit_report(hdev, report, USB_DIR_OUT);
|
||||||
|
|
||||||
|
ntrig_report_version(hdev);
|
||||||
|
|
||||||
ret = sysfs_create_group(&hdev->dev.kobj,
|
ret = sysfs_create_group(&hdev->dev.kobj,
|
||||||
&ntrig_attribute_group);
|
&ntrig_attribute_group);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue