usb gadget驱动框架分析

以renesas BSP为例:

1.composite_driver层注册流程

usb_composite_probe
    usb_gadget_probe_driver   /*driver->udc_name没有指定为e659000.usb那么就默认是使用第一个UDC,找里面的第一个还没有被driver匹配的udc*/
        udc_bind_to_driver
            usb_gadget_udc_set_speed /*##调用usbhsg_gadget_ops中的udc_set_speed()设置为USB_SPEED_HIGH,可行并没有提供udc_set_speed()*/
            driver->bind(udc->gadget, driver) //调用模板副本composite_driver_template的bind(),也即是composite_bind
            composite_bind(struct usb_gadget *gadget, struct usb_gadget_driver *gdriver) //arg1为usbhs_mod_gadget_probe中的gadget,arg2为丰满后的composite_driver_template的副本
                composite_dev_prepare
                    usb_ep_alloc_request //##对gadget->ep0调用usbhsg_ep_ops中的alloc_request()
                    usb_gadget_set_selfpowered //##调用usbhsg_gadget_ops中的set_selfpowered(),也就是usbhsg_set_selfpowered
                composite->bind //## 调用全局carlplay_driver.bind,也就是carplay_bind,里面usb_get_function_instance,usb_add_config
                update_unchanged_dev_desc(&cdev->desc, composite->dev); //## 将carlplay_driver.dev的设备描述符拷贝到cdev->desc中
            usb_gadget_udc_start //## 调用usbhsg_gadget_ops的udc_start(),也即是usbhsg_gadget_start()
            usb_udc_connect_control //## 根据udc->vbus值,调用usbhsg_gadget_ops.pullup来进行上拉/取消Dp上的上拉电阻,也即是usbhsg_pullup
            kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); //向用户空间发送 UDEV e659000.usb CHANGE*/
            //到此usb_composite_probe执行流程结束

2.UDC驱动注册流程

usbhs_probe
    usbhs_mod_probe
        usbhs_mod_gadget_probe
            usb_add_gadget_udc
                list_add_tail(&udc->list, &udc_list); //这里面将这个UDC驱动放到全局链表udc_list中

3.gadget function注册流程

usb_function_register
    list_add_tail(&newf->list, &func_list); //仅仅是只添加到全局链表func_list而已

猜你喜欢

转载自www.cnblogs.com/hellokitty2/p/10238295.html
今日推荐