首页 > 其他分享 >Android Qcom USB Driver学习(十四)

Android Qcom USB Driver学习(十四)

时间:2024-08-30 09:49:53浏览次数:12  
标签:dwc3 xhci USB gadget Driver Qcom hcd usb

UDC-Gadget

UDC:(USB Device Controller)用于管理和控制USB设备与主机之间的通信。
Gadget:Android在此层实现了adb,mtp(Media Transfer Protocol 媒体传输协议),mass_storage等。

早期的USB只支持单一的gadget设备,使用场景较为简单,随后加入了composite framework,用来支持多个function的gadget设备,多个function的绑定在内核中完成,若需要修改,则需要修改内核,不灵活也不方便。Linux3.11版本引入了基于configfs的usb gadget configfs。
usb gadget configfs重新实现了复合设备层,可以在用户空间配置和组合内核的function,灵活的构成USB复合设备,极大了提高了工作效率。

system/core/rootdir/init.usb.configfs.rc

[persist.sys.usb.config]: [diag,adb]
[sys.usb.config]: [mtp,adb] 

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1
     write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"
     write /config/usb_gadget/g1/idVendor 0x0c2e
     write /config/usb_gadget/g1/idProduct 0x0ba3
     symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1
     symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
     write /config/usb_gadget/g1/UDC ${sys.usb.controller}
     setprop sys.usb.state ${sys.usb.config}

drivers/usb/gadget/configfs.c
drivers\usb\gadget\composite.c
drivers/usb/gadget/udc/core.c
drivers/usb/gadget/function/f_mtp.c

USB总线-Linux内核USB3.0设备控制器复合设备之USB gadget configfs分析

gadget -> composite -> function

make_group -> function_make -> usb_get_function_instance -> alloc_inst -> mtp_alloc_inst
每个function driver创建的时候会分配一个usb_function_instance

echo  4e00000.dwc3 >  configs/usb_gadget/g1/UDC 
usb_udc_attch_driver-> udc_bind_to_driver-> configfs_composite_bind 
                                         -> usb_add_function -> function->bind -> mtp_function_bind

HCD-XHCI

HCD:(Host Controller Driver)是主机控制器驱动,它是对主机控制器硬件的抽象。

XHCI:(eXtensible Host Controller Interface)也是主机控制器驱动,XHIC是基于USB3.0并且向下兼容,其中集成了两个roothub,一个对应usb2.0的(main_hcd),一个对应usb3.0的(shared_hcd)

struct xhci_hcd {
               /* usb_hcd结构体:用于描述USB主机控制器驱动*/
                struct usb_hcd *main_hcd;
                struct usb_hcd *shared_hcd;
                /* glue to PCI and HCD framework */
                struct xhci_cap_regs __iomem *cap_regs;
                struct xhci_op_regs __iomem *op_regs;
                struct xhci_run_regs __iomem *run_regs;
                struct xhci_doorbell_array __iomem *dba;
                /* Our HCD's current interrupter register set */
                struct    xhci_intr_reg __iomem *ir_set;

                /* Cached register copies of read-only HC data */
                __u32        hcs_params1;
                ...

                spinlock_t    lock;

                /* packed release number */
                u8        sbrn;
                u16        hci_version;
                ...
                ...
                ...
            };

root hub设备注册(三)
drivers/usb/host/xhci-plat.c
drivers/usb/core/hcd.c
drivers/usb/host/xhci.c
drivers/usb/core/hub.c


dwc3_otg_start_host ->   dwc3_host_init -> platform_device_add(xhci) -> xhci_plat_probe

xhci->main_hcd = hcd;  
usb_add_hcd(hcd, irq, IRQF_SHARED); //roothub对应usb0
usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
    hcd->driver->start(hcd)  //hc_driver
        xhci_run(hcd)
            xhci_try_enable_msi(hcd)
                hci_setup_msix(xhci)
                    xhci_irq(hcd)
                    ---------------------------------------------------------------------------------
                   |    xhci_handle_event(xhci)                                                        |
                   |    case: TRB_PORT_STATUS                                                       |
                   |        handle_port_status(xhci, event);                                        |
                   |    case: TRB_TRANSFER                                                          |
                   |        handle_tx_event(xhci, &event->trans_event);                             |
                   |            usb_hcd_giveback_urb                                                |
                   |                tasklet_schedule(&bh->bh);                                      |
                   |                    kick_hub_wq(hub);                                           |
                   |                        queue_work(hub_wq, &hub->events)                        |
                   |                            hub_event->port_event->hub_port_connect_change      |
                   |                                ->hub_port_connect -> usb_new_device(udev);     |
                    ----------------------------------------------------------------------------------        
    register_root_hub(hcd)
        usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE)
            usb_new_device (usb_dev)
                usb_enumerate_device(udev)
                announce_device(udev)/* 打印New USB device found*/
                device_add(&udev->dev)

DWC3

DWC3:(DesignWare USB 3.0 Controller) 在Android系统中,dwc3通常被用作USB3.0主机控制器,用于与XHCI驱动程序配合使用,控制USB3.0设备与主机之间的通信。同时,dwc3还可以与Gadget驱动程序配合使用,将linux设备转为USB设备,实现设备与主机间的通信。

dwc3控制器初始化的时候会将控制器设置为USB_DR_MODE_OTG模式,同时调用dwc3_host_init和dwc3_gadget_init函数初始化主机模式和设备模式所需的资源,控制器后续可以动态切换为主机模式和设备模式。

                  ->   host mode    xhci   dwc3_host_init()
dwc3 controller -
                  ->   device mode  udc    dwc3_gadget_init()

dual-role device (DRD) OTG State
enum dwc3_drd_state {
      DRD_STATE_UNDEFINED = 0, //put controller and phy in suspend if no cable connected
                             //pm_runtime_putsync decrease usage_count
      DRD_STATE_IDLE,             
      DRD_STATE_PERIPHERAL,
      DRD_STATE_PERIPHERAL_SUSPEND,
      DRD_STATE_HOST_IDLE,
      DRD_STATE_HOST,
  };
dual-role usb control(DR) works on a particular mode
enum usb_dr_mode {
      USB_DR_MODE_UNKNOWN,
      USB_DR_MODE_HOST,
      USB_DR_MODE_PERIPHERAL,
      USB_DR_MODE_OTG,
  };

状态的切换通过dwc3_otg_sm_work -> dwc3_otg_start_host/dwc3_otg_start_peripheral

power/supply/qcom/qpnp-smb5.c devm_extcon_dev_register 发送广播

static const unsigned int smblib_extcon_cable[] = {
      EXTCON_USB,
      EXTCON_USB_HOST,
      EXTCON_NONE,
};

smblib_notify_device_mode
    extcon_set_state_sync(chg->extcon, EXTCON_USB, enable);
smblib_notify_usb_host
    extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable);

usb/dwc3/dwc3-msm.c devm_extcon_register_notifier注册监听usb状态变化,接受广播

mdwc->extcon[idx].vbus_nb.notifier_call = dwc3_msm_vbus_notifier;
extcon_register_notifier(edev, EXTCON_USB, &mdwc->extcon[idx].vbus_nb);
extcon_register_notifier(edev, EXTCON_USB_HOST,&mdwc->extcon[idx].id_nb);
dwc3_msm_vbus_notifier(&mdwc->extcon[idx].vbus_nb,true, edev);
dwc3_msm_id_notifier(&mdwc->extcon[idx].id_nb,true, edev);

DBG-LOG

echo ‘file dwc3-msm.c +p’ > /d/dynamic_debug/control
echo ‘file phy-msm-snps-hs.c +p’ > /d/dynamic_debug/control
echo ‘file phy-msm-qmp.c +p’ > /d/dynamic_debug/control
echo ‘file hub.c +p’ > /d/dynamic_debug/control

标签:dwc3,xhci,USB,gadget,Driver,Qcom,hcd,usb
From: https://www.cnblogs.com/linhaostudy/p/18388053

相关文章

  • Android Qcom USB Driver学习(十三)
    DPMDevicePolicyManagerdealswiththeUSBPowerDeliveryresourcesusedbyoneormoreportsonthebasisofthelocaldevicepolicythebasisofthelocaldevicepolicy.OPMOSPolicyManageroperatingSoftwarethatinterfaceswiththePPMPPMPlatfor......
  • Android Qcom USB Driver学习(十二)
    keypad在suspend的过程中导致Android无法进入suspend的问题,导致整体功耗过高,其实是主机都没有进入睡眠,通过以下打log的方式最终定位到问题,pmicvbus输出的时候会有reverseboost所以pmic侧的功耗也会有增加,当pmic电量低的时候会触发uvlo导致vbus上的电断开,需要需要的话,我们可以降......
  • Qcom高通平台抓取wifi fw/driver + sniffer log
    抓取WLANDRIVER+WLANFW3日志进入开发者模式打开启动WLAN详细日志记录功能操作完之后,日志会保存在/data/vendor/wifi目录下adbpull出来压缩wifi.zip//WCNSS_qcom_cfg.ini#Firmwarelogmode#Validvaluesare0,1,2#0=Disable,1=WMI,2=DIAGgEnablefwlog=1orgEn......
  • linux下UsbMon-WireShark之USB协议抓取分析
    usbmon配置使用usbmon抓包分的,是需要内核开启CONFIG_USB_MON=m,重新编译内核,编译ko:makeARCH=arm64CROSS_COMPILE=aarch64-himix100-linux-CONFIG_USB_MON=mM=./drivers/usb/modules设备挂载debugfs,加载ko:mount-tdebugfsdebugfs/sys/kernel/debug/insmod......
  • Windows下使用Wireshark分析USB通信
    WireShark中对USB数据捕获可以监视与主机连接的usb数据.usb设备是三段地址描述,例如1.15.1,第一个是总线,第二个是设备地址,第三个是端口.USB数据抓包分析这些是鼠标的数据包包抓包内容键盘数据包,按下一个键后抓到的数据包,查询usb标准,对照后是a。......
  • USB设置之间通信
    在电脑上连接的USB设备之间,通常不能直接通信。USB(通用串行总线)是一种主从结构的总线系统,其中只有一个USB主机(通常是电脑),而其他连接的设备都作为从机。在这种结构中,设备之间的通信必须通过USB主机进行转发,即设备不能直接与其他设备交换数据或信号。USB主机负责控制和管理所有连接......
  • Q: USB无线网卡搜不到路由器WiFi,但也能搜索到少部分信号。
    原因分析:一般在路由器的配置的无线信道是自动,路由器的2.4G频段有13个左右交叠的信道。由于USB无线网卡的设置信道区间可能不在无线信道范围内,导致无线网卡搜索不到对应wifi。解决问题:鼠标右键点击任务栏上的网络图标,点击“打开网络和Internet设置”,在弹出的设置窗口左边选择......
  • Android Qcom USB Driver学习(十一)
    基于TI的FirmwareUpdate固件升级的流程分析usbapplictionlayers的数据USBProtocolPackage①/②maptocheckpasswordcorrectPackageFormat:Byte[0]=ReportIdByte[1]=ValidLength(0x21=33)Byte[2]=BSLCoreCommands(0x11RXPassword)Byte[3]=Val......
  • USB 逻辑分析仪分析丢包怎么分析(lecroy USB 逻辑分析仪)
    使用LeCroyUSB逻辑分析仪分析USB数据传输中的丢包现象,通常涉及以下步骤:1.设置触发条件在LeCroyUSB逻辑分析仪中,设置适当的触发条件来捕获数据包丢失的场景。常见的触发条件可以包括:特定的PID(PacketIdentifier)值,如DATA0或DATA1。错误类型,如CRCError(循环冗余......
  • 基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下:  本课题中,使用的USB摄像头为:   2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频) 程......