1、drd driver
1)首先根据"snps,dwc3"进行dts和driver的匹配,执行dwc3_probe()
- 在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函数