今天我们将以usb gadget驱动之hid为例,分析linux 最新内核的usb gadget驱动框架。
/kernel/drivers/usb/gadget/function/f_hid.c
DECLARE_USB_FUNCTION_INIT(hid, hidg_alloc_inst, hidg_alloc);
对这个宏进行展开
这里我直接将展开后的结果展示出来
static struct usb_function_driver hidusb_func = {
.name = "hid"
.mod = THIS_MODULE,
.alloc_inst = hidg_alloc_inst,
.alloc_func =hidg_alloc,
};
MODULE_ALIAS("usbfunc:"__stringify(_name));
static int __inithidmod_init(void)
{
return usb_function_register(&hidusb_func);
}
static void __exithidmod_exit(void)
{
usb_function_unregister(hidusb_func);
}
module_init(hidmod_init);
module_exit(hidmod_exit)
展开后即看到我们所熟悉的驱动模型
usb_function_register(&hidusb_func);
这个注册函数,只是把usb_function_driver加入func_list链表
我们接着看下,在哪会去遍历这个链表
try_get_usb_function_instance
这个函数会遍历这个链表,既然有遍历,就会比较,它把传进来的name与usb_function_driver的name进行比较
然后匹配成功后,调用usb_function_driver下的hidg_alloc来获取一个struct usb_function_instance,我们暂且不往上追,先来分析这个usb_function_instance是什么,怎么分配?
回到/kernel/drivers/usb/gadget/function/f_hid.c
找到hidg_alloc_inst函数
config_group_init_type_name(&opts->func_inst.group, "", &hid_func_type);
唯一我们真正关心的函数
关于configfs,这里不做介绍,大家可以网上查阅资料
要分析这个函数,接下来我们就要分析/kernel/drivers/usb/gadget/configfs.c