如何在 linux 中检索隐藏设备的长度?
How can I retrieve wLength of a hid device in linux?
我想检索 wLength(可以由 hid 设备指定)。明确的答案可能是向设备发送 ctrl 信号。但是我通过下面的代码试了一下:
struct usbfs_ctrltransfer ctrl = {
.bmRequestType = LIBUSB_ENDPOINT_IN,
.bRequest = LIBUSB_REQUEST_GET_CONFIGURATION,
.wValue = 0,
.wIndex = 0,
.wLength = 1,
...
}
....
r = ioctl(fd, 0, &ctrl);
....
此代码的结果只是一个错误值(我认为是 -1!)。
我在调试模式下重新加载了 hid 模块(内核模块)(modprobe hid debug=100 --> 不要为这个大的调试级别惊慌!)。在这种情况下,hid 会打印出 wLength 的真实值。
/build/buildd/linux-3.13.0/drivers/hid/usbhid/hid-core.c: submitting ctrl urb: Get_Report wValue=0x0100 wIndex=0x0001 wLength=64
我在Linux内核源代码中跟踪它,我发现这些信息打印在usb_get_intfdata中。
总之,我想知道用户空间是否有相同的功能?
这个问题的答案是使用udev。 通过读取称为 bmAttributes 的特殊属性,您可以找到 I/O 的实际长度。
使用以下代码阅读它:
....
udev_device_get_sysattr_value(dev, "bmAttributes")
....
我想检索 wLength(可以由 hid 设备指定)。明确的答案可能是向设备发送 ctrl 信号。但是我通过下面的代码试了一下:
struct usbfs_ctrltransfer ctrl = {
.bmRequestType = LIBUSB_ENDPOINT_IN,
.bRequest = LIBUSB_REQUEST_GET_CONFIGURATION,
.wValue = 0,
.wIndex = 0,
.wLength = 1,
...
}
....
r = ioctl(fd, 0, &ctrl);
....
此代码的结果只是一个错误值(我认为是 -1!)。 我在调试模式下重新加载了 hid 模块(内核模块)(modprobe hid debug=100 --> 不要为这个大的调试级别惊慌!)。在这种情况下,hid 会打印出 wLength 的真实值。
/build/buildd/linux-3.13.0/drivers/hid/usbhid/hid-core.c: submitting ctrl urb: Get_Report wValue=0x0100 wIndex=0x0001 wLength=64
我在Linux内核源代码中跟踪它,我发现这些信息打印在usb_get_intfdata中。 总之,我想知道用户空间是否有相同的功能?
这个问题的答案是使用udev。 通过读取称为 bmAttributes 的特殊属性,您可以找到 I/O 的实际长度。 使用以下代码阅读它:
....
udev_device_get_sysattr_value(dev, "bmAttributes")
....