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_irq
    kick_khubd
        hub_thread
            hub_events
                hub_port_connect_change
                    usb_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 3
                        hub_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_configuration
                            
                        device_add//把device放入usb_bus_type的dev链表,
                             //从usb_bus_type的driver链表中取出usb_driver
                             //把usb_interface和usb_driver的id_table比较
                             //如果能匹配,调用usb_driver的probe函数
  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值