linux hid驱动

linux hid驱动

以usbhid为例,drivers/hid/usbhid/hid-core.c 。

新设备添加后,usbhid_probe函数执行。

usbhid_probe
    |-hid_allocate_device
    |-hid_add_device
        |-device_add

device_add之后,hid_bus_type的probe函数hid_device_probe执行。(经过match后,usbhid的driver是hid_generic,因为hid_generic没有probe,所有执行bus的hid_device_probe)

hid_device_probe
    |-hid_open_report
    |-hid_hw_start

hid_open_report函数解析设备的report描述符。解析之后形成一套数据,由hid_device的report_enum索引。

hid_hw_start
    |-usbhid_start
    |-hid_connect
        |-hidinput_connect
        |-hiddev_connect
        |-hidraw_connect

不是所有设备都会执行这三个connect函数。一般设备只执行其中的一两个。hid_conect函数结合设备的quirk生成connect_mask决定执行哪些connect函数。

这三个connect函数实际作用是对接到hid驱动的三个出口。

hidinput_connect对接到input驱动,用户从/dev/input/xxx获取设备的数据。hiddev_connect对接到usbdev。hidraw_connect对接到hidraw,用户从/dev/hidrawx获取数据。

hidinput用于HID驱动与input驱动的对接。其代码为hidinput.c

hid_connect
    |-hidinput_allocate
    |   |-input_allocate_device
    |-input_register_device

input_allocate_device和input_registervdevice是input驱动提供的接口。其源码为drivers/input/input.c

hidinput_allocate函数通过input驱动的接口分配一个input_dev,并且设置其中的回调函数指针。

接下来,调用input_register_device注册input_dev。

你可能感兴趣的:(个人原创)