Android Qcom USB Driver学习(十四)

news/2024/10/20 16:19:29/

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)

了解什么是dwc3 udc gadget hcd xhci, 差点被Chatgpt绕晕了,看的比较浅显就像知道这些都是什么作用的。

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=1write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"write /config/usb_gadget/g1/idVendor 0x0c2ewrite /config/usb_gadget/g1/idProduct 0x0ba3symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2write /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 -> functionmake_group -> function_make -> usb_get_function_instance -> alloc_inst -> mtp_alloc_inst
每个function driver创建的时候会分配一个usb_function_instanceecho  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_probexhci->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_driverxhci_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_countDRD_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_modeextcon_set_state_sync(chg->extcon, EXTCON_USB, enable);
smblib_notify_usb_hostextcon_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);

http://www.ppmy.cn/news/373643.html

相关文章

三星GT-N8010刷机教程

本刷机教程只针对三星GT-N8010机器(以下简称GT-N8010),以下操作本人已在GT-N8010机器上亲测,且都成功,其它机器没有测试不能保证成功。 刷机有风险,请谨慎使用!请先备份资料和信息。 目录 一、GT-N8010刷机教程 刷机工具包下载

解决Centos安装时找不到磁盘:未选择任何磁盘(no diks selected),本地标准磁盘为空

文章目录 问题描述问题原因解决办法 问题描述 笔者最近又买了一台新电脑,并打算在上面安装 Linux 来充当一个新的服务器结点。但很不幸的是,每次笔者略微尝试新事物时,都要踩很多坑。笔者在使用 U 盘刻录 CentOS 8 镜像之后,准备在…

2.6 TCP与UDP的可靠性传输

目录 一、TCP可靠性传输1、重传机制1.1、超时重传1.2、快速重传1.3、SACK1.4、Duplicate SACK 2、滑动窗口3、流量控制3.1 滑动窗口与流量控制3.2窗口关闭 4、拥塞控制4.1拥塞窗口4.2 慢启动4.3 拥塞避免4.4 拥塞发生4.5 快速恢复 二、UDP可靠性传输1、主要策略2、重传机制2.1 …

P1125 [NOIP2008 提高组] 笨小猴 java

题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设max是单词中出现次数最多的字母的出现…

公平锁/非公平锁/可重入锁/自旋锁

在JAVA中我们知道有很多加锁的方式,比如常见的 通过synchronized关键字,还有Lock,还有之前说原子CAS操作时有看到过的死循环方式的自旋锁。 借此来说一下锁的分类: 公平锁: 是指多个线程按照申请的顺序来获取锁,每次获取锁时会…

Mysql UDF Bug “ERROR 1125 (HY000): Function ‘xxx‘ already exists“

今天在测试UDF提权时,发现一个令人蛋疼的BUG。 正常在导入UDF.dll后,直接创建函数即可。 mysql> create function sys_eval returns string soname "udf.dll"; Query OK, 0 rows affected (0.00 sec)mysql> select * from mysql.func;…

1125渐变

渐变 使用background-image:linear-gradient(); 渐变是多个颜色逐渐变化的视觉效果 一般用于设置盒子的背景 <style>.box {width: 300px;height: 200px;background-image: linear-gradient(transparent,rgba(0,0,0,.5));}</style> </head> <body>&l…

洛谷P1125笨小猴C语言

先放题目 本题较简单&#xff0c;我个人觉得本题关键在于统计每个字母出现的次数。用以下的代码来处理这件事应该算是比较方便的&#xff08;详情请看下面的代码及注释&#xff0c;我觉得应该是比较好理解的&#xff09;。 for (int i0; i<len; i) { bch[i]; …