English 中文(简体)
如何发送HID指挥部,并读到HID数据,来自Lino Kernel模块?
原标题:How to send HID commands and read HID data from Linux Kernel Module?

I m 建造一个需要阅读HID装置的六氯环己烷舱,向使用RPC通信的超声望器发送数据。 这些假设是必要的,因为Im在嵌入的含水层和SoC I m正在开发过程中,需要一个掩体模块,以发送这种数据并通过登记的反馈发送数据。

我知道有图书馆,例如<代码>libusb/hidapi,这些图书馆可以简单地从用户空间发送一个电离层信号信号信号指令并读到ID数据,例如:

hidapitester --vidpid 2752:0012 -l 8 --open --send-output 0x03,0x53,0x02,0x58  --read-input

如果识别器指该装置,我们可以按照制造商的光谱发送和阅读。 我们还可以利用其图书馆职能编写这一方案,最终以HIDRAW为基础。

问题是,这些图书馆在用户空间工作,但不可能汇编一个有用户空间功能的凯里略模块,因此这些图书馆赢得了笔工作。 HIDRAW多半依靠IOCTL,使用ioctl()电话,但都没有成功。

如何书写并读到我知道的从含水层舱里识别的HID装置?

I ve Trial using hidapi and hidraw function or only the direct ioctl( calls from the kernel model but I have:

error: implicit declaration of function  ioctl 

或者与图书馆职能等同,在我进行一些研究后,这些是用户空间功能。

问题回答

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>) },
    {}
};

可在>上替换供应商和产品的超值。 可在用户空间使用<代码>lsusbusb-devices后人工阅读。 其他驾驶员选择特定装置或使用单一模块瞄准不同类型装置的文件,可在气温来源<代码>/drivers/hid/上查阅。

之后,<代码> 问题功能将成为良好的起点,因为当司机首先被分配到一个装置时,就要求这样做。 我们拿到<代码>hid_device<>/code>,作为在装置连接和功能被称作时的论据。 既然我们称之为一些必要的职能,例如:hid_parsehid_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。 如果开展更多的低水平业务,则可能有用。





相关问题
Question about Process communication over USB cable

I have some questions regarding communication over USB cable in Linux, in a Host-Target Device environment.(USB2.0) Please help as we are stuck for the below imiplementation. We have a host PC ...

Turn on PC with USB-device

I want to be able to turn my PC on and off using an IR-remote sensor that is connected via USB to the PC. The sensor is a custom PCB implemented with an AVR microprocessor and V-USB software USB-...

Is there software or code to alter USB power output

I had a look at this and this but no one sounded particularly sure of their ideas and I m kind of after a different thing anyway. I want to hook my usb power cables (red and black) up to my phone so I ...

Monitor USB traffic

I want to view all traffic going out the USB, with the potential to block data transactions to/from the USB based on content policy. How would this be done? Any way to achieve this in C#, or is it ...