mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 08:49:45 +00:00
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
1 changed files with 51 additions and 0 deletions
|
@ -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,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -848,6 +897,8 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|||
if (report)
|
||||
usbhid_submit_report(hdev, report, USB_DIR_OUT);
|
||||
|
||||
ntrig_report_version(hdev);
|
||||
|
||||
ret = sysfs_create_group(&hdev->dev.kobj,
|
||||
&ntrig_attribute_group);
|
||||
|
||||
|
|
Loading…
Reference in a new issue