Edit online

Function 注册

31 Jan 2024
Read time: 2 minute(s)

drivers/usb/gadget/function/ 路径下有一批 Gadget Function 的定义:

$ ls drivers/usb/gadget/function/f*
f_acm.c  f_ecm.c  f_eem.c  f_fs.c  f_hid.c  f_loopback.c  f_mass_storage.c  f_mass_storage.h
f_midi.c  f_ncm.c  f_obex.c  f_phonet.c  f_printer.c  f_rndis.c  f_serial.c  f_sourcesink.c
f_subset.c  f_tcm.c  f_uac1.c  f_uac1_legacy.c  f_uac2.c  f_uvc.c  f_uvc.h
大家使用 DECLARE_USB_FUNCTION_INIT() 宏定义来调用 usb_function_register() 函数,把 usb_function_driver 注册到全局链表 func_list 中。等待 composite device 来进行实例化。
DECLARE_USB_FUNCTION_INIT(acm, acm_alloc_instance, acm_alloc_func);

#define DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc)               \
    static struct usb_function_driver _name ## usb_func = {         \
        .name = __stringify(_name),                         \
        .mod  = THIS_MODULE,                                        \
        .alloc_inst = _inst_alloc,                          \
        .alloc_func = _func_alloc,                          \
    };                                                              \
    MODULE_ALIAS("usbfunc:"__stringify(_name));

#define DECLARE_USB_FUNCTION_INIT(_name, _inst_alloc, _func_alloc)  \
    DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc)           \
    static int __init _name ## mod_init(void)                       \
    {                                                               \
        return usb_function_register(&_name ## usb_func);   \
    }                                                               \
    static void __exit _name ## mod_exit(void)                      \
    {                                                               \
        usb_function_unregister(&_name ## usb_func);                \
    }                                                               \
    module_init(_name ## mod_init);                                 \
    module_exit(_name ## mod_exit)