欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > usb协作驱动

usb协作驱动

2024/10/25 0:28:25 来源:https://blog.csdn.net/wangyongh/article/details/139659725  浏览:    关键词:usb协作驱动

1、drd driver

1)首先根据"snps,dwc3"进行dts和driver的匹配,执行dwc3_probe()

  1. 在dwc3中先调用 dwc3_get_dr_mode()取得usb mode(dr_mode),这可以是otg、host或者device

3)然后调用 dwc3_core_init()初始化usb PHY interface和usb PHY,

4)最后调用 dwc3_core_init_mode()初始化usb mode:

如果dr_mode为device,则初始化gadget。

如果dr_mode为host,需要初始化xHCI驱动。在dwc3_host_init函数的最后调用platform_device_add(xhci)添加platform device(xhci-hcd),用于匹配xHCI driver(xHCI driver为platform driver),

如果dr_mode为otg,需要根据extcon来选定一个角色(host或者device)进行初始化,所以还需要extcon驱动的支持,

2. extcon driver

extcon驱动在drivers/extcon中,利用gpio或其他信号脚提供一种通知机制,控制usb DRD 模式的切换(作为host或者device)

1)首先根据"linux,extcon-usb-gpio"进行dts和driver的匹配,执行usb_extcon_probe()

2)在 usb_extcon_probe()中,先调用devm_extcon_dev_register()注册设备

3)然后为gpio注册一个中断处理程序,在该中断处理中处理gpio中断,并将信息通过通知链机制发送给DRD driver

4)DRD driver收到消息后,切换usb的角色,重新初始化usb驱动,作为device或者host

3. xHCI driver

xHCI驱动在usb/host中,主要初始化xHCI。xHCI作为usb host部分的驱动

1)在xhci_plat_init中调用platform_driver_register(&usb_xhci_driver)注册platform driver(“xhci-hcd”)

2)首先根据name="xhci-hcd"匹配到platform device后,执行xhci_plat_probe

3)在xhci_plat_probe中,进行xHCI的初始化,最后添加到usb core中

4. usb PHY driver

dwc3的PHY初始化主要在 dwc3_core_init中完成,如果确实需要初始化PHY,还需要相关PHY驱动的配合(提供具体的操作函数)。

1)synopsys新思科技采用femtoPHY,femtoPHY通常情况下无需初始化(设置)其寄存器,只有调试或使用特殊功能时才需要访问。也就是说,对于femtoPHY,我们可以不写驱动来进行初始化。

2)虽然不需要初始化PHY,但我们依然需要配置usb controller的PHY interface(PIPE、ULPI、UTMI),这在 dwc3_phy_setup中实现。

3)对于某些类型的PHY,必须要进行初始化,这就需要配置dts设置usb-phy或者phy-names。PHY初始化主要由 dwc3_core_get_phy和 dwc3_core_soft_reset等函数调用。里面用到的函数指针需要在相关PHY驱动中进行实现并注册

usb otg笔记:

usb otg学习

hub_irqkick_khubdhub_threadhub_eventshub_port_connect_changeusb_alloc_dev(hdev, hdev->bus, port1);dev->dev.type = &usb_device_type;choose_address(udev);  //给新设备分配编号(地址)hub_port_init      //usb 1-1: new full speed USB device using s3c2410-ohci and address 3hub_set_address  //把编号(地址)告诉USB设备usb_get_device_descriptor(udev, 8);//获取设备描述符usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);usb_new_device(udev);usb_get_configuration(udev);//把所有的描述符都读出来并解析usb_parse_configurationdevice_add//把device放入usb_bus_type的dev链表,//从usb_bus_type的driver链表中取出usb_driver//把usb_interface和usb_driver的id_table比较//如果能匹配,调用usb_driver的probe函数

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com