1. 程式人生 > >usb gadget驅動框架分析

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而已