usb gadget驱动框架分析
Posted hellokitty2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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而已
以上是关于usb gadget驱动框架分析的主要内容,如果未能解决你的问题,请参考以下文章