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。