I managed to send an HID report/command with a kernel module.
要做到这一点,就必须建立一个模块(如果你不熟悉,就可读到六氯环己烷舱结构),并使用<条码> 射线背后_driver结构。 这里必须登记一些职能,一旦我们的司机被确认为特定装置的适当职务:
static struct hid_driver my_hid_driver = {
.name = "my-hid-receiver",
.id_table = my_id_table,
.probe = my_probe_function,
.remove = my_remove_function,
.raw_event = my_raw_event
};
在连接HID装置时,为了给我们的司机打电话,我们使用id_table
。 类似:
static const struct hid_device_id my_id_table[] = {
{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, <ID OF THE VENDOR>, <ID OF THE PRODUCT>) },
{}
};
可在和>上替换供应商和产品的超值。 可在用户空间使用<代码>lsusb
或usb-devices
后人工阅读。 其他驾驶员选择特定装置或使用单一模块瞄准不同类型装置的文件,可在气温来源<代码>/drivers/hid/上查阅。
之后,<代码> 问题代码>功能将成为良好的起点,因为当司机首先被分配到一个装置时,就要求这样做。 我们拿到<代码>hid_device<>/code>,作为在装置连接和功能被称作时的论据。 既然我们称之为一些必要的职能,例如:hid_parse
、hid_hw_start/code>和hid_hw_ open
,那么我们准备提交报告。
为此,我们可以使用<代码>hid_hw_request,这一功能来自hid-分
。
如果我们想寄出以下数据<代码>[0x01,0xff,0x01,0x33,0x0f],我们就可以这样做:
struct hid_report *report;
struct hid_report_enum *output_report_enum;
output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT]; // Getting the report from the hid_device hdev
report = output_report_enum->report_id_hash[<ID>]; // hid_device hdev is passed to probe as argument
report->field[0]->value[0] = 0x01; // Actual data to be sent to the device
report->field[0]->value[1] = 0xFF;
report->field[0]->value[2] = 0x01;
report->field[0]->value[3] = 0x33;
report->field[0]->value[4] = 0x0F;
hid_hw_request(hdev, report, HID_REQ_SET_REPORT); // request to set the data
Keep in mind that ID and field are specific to how your HID device works, I just used the simplest configuration here.
如果我们想要阅读的话,我们可以使用<代码>。 HID_INPUT_REPORT for the enum and HID_REQ_GET_REPORT
for the debate hid_hw_request
。
我们可以在气温来源内查阅<代码>/include/linux/hid.h、hid-core和/drivers/hid/
的文件,以便找到实用的实例,以及利用电离层扰动的不同功能。
http://www.kernel.org/doc/html/latest/hid/hid-transport.html https://www.kernel.org/doc/html/latest/hid/hid-transport.html。 如果开展更多的低水平业务,则可能有用。