usb gadget驅動框架分析
阿新 • • 發佈:2019-01-08
以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而已