Android Qcom USB Driver学习(十四)
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
Android Qcom USB Driver学习(十四)的更多相关文章
- Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理
Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...
- 强化学习(十四) Actor-Critic
在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法.但是由于该算法 ...
- Scala学习十四——模式匹配和样例类
一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...
- android学习十四(android的接收短信)
收发短信是每一个手机主要的操作,android手机当然也能够接收短信了. android系统提供了一系列的API,使得我们能够在自己的应用程序里接收和发送短信. 事实上接收短信主要是利用我们前面学过的 ...
- android 学习十四 探索安全性和权限
1.部署安全性:应用程序必须使用数字证书才能安装到设备上. 2.执行期间的安全性: 2.1 使用独立进程 2.2 使用固定唯一用户ID 2.3 申明性权限模型 3数字证书 ...
- Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中
前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...
- 【Android测试】【第十四节】Appium——简述
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5124340.html 前言 同样的,这一篇我要介绍的也是一 ...
- Android项目实战(三十四):蓝牙4.0 BLE 多设备连接
最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据. 查询了很多资料终于实现,现进行总结. ------------------------------------------- ...
- Android源码分析(十四)----如何使用SharedPreferencce保存数据
一:SharedPreference如何使用 此文章只是提供一种数据保存的方式, 具体使用场景请根据需求情况自行调整. EditText添加saveData点击事件, 保存数据. diff --git ...
- Java学习十四
学习内容: 1.Junit 2.maven安装配置环境 一.Junit实例演示步骤 1.引入jar包 junit包需要引入hamcrest-core包,否则会报错 2.测试如下代码 package c ...
随机推荐
- Maven入门(idea)
1.Maven是什么? Maven是一个跨平台的项目管理工具(对jar包进行统一管理). 1.1. Maven主要内容如下: 项目对象模型 项目生命周期 依赖管理系统 1.2. 使用Maven的好处: ...
- Jmeter函数助手25-log
log函数用于记录一条日志并返回其值. String to be logged (and returned):函数会返回该值.控制台也能看到该字符 Log level (default INFO) o ...
- NVIDIA黃仁勳給年輕人的忠告 —— 持续强化学习算法会是未来10年的技术变革点
地址: https://www.youtube.com/watch?v=ER4xNhSVJ2c 强化学习,已经不是什么稀奇的概念了,强化学习算法是大语言模型.自动驾驶.人形机器人的核心算法,但是现有的 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-65 - Canvas元素推拽-番外篇
1.简介 上一篇宏哥想了好多办法都没有演示成功的拖拽Canvas元素,宏哥也说的太绝对了,给大家造成困惑或者误导.一连好几天吃饭睡觉都不怎么香了,脑子中始终对这件事耿耿于怀,自己问自己难道就真的没有办 ...
- Grafana的仪表盘URL参数设置
转载请注明出处: 在调试grafana时,需要对grafana进行share的url图表进行一些自定义设置,总结下常用的参数 参考网站:https://grafana.com/docs/grafana ...
- 23. 基于Cortex-A9 uboot代码启动分析
本篇文章是彭老师第一次在B站直播间,边直播边记录笔记,视频已经上传到B站. 现在完善整理成该篇文章,有想学习uboot启动的代码详细流程的老铁可以进入我B站空间配合视频一起学习. [视频地址] B站用 ...
- kali常用配置
用户须知 1.免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失.系统损坏.个人隐私泄露或经济损失等,不承担任何责任.所有使用本教程内 ...
- zabbix 4.0 监控 mysql
zabbix官方支持监控MySQL,但直接使用默认的模板是不可用的,需要经过额外的设置才可以使用.如果只需要对mysql数据库做简单的监控,zabbix自带的模板完全能够满足要求 下面是用zabbix ...
- Tesla 开发者 API 指南:BLE 密钥 – 身份验证和车辆命令
注意:本工具只能运行于 mac 或者 linux, win下不支持. 1. 克隆项目到本地 https://github.com/teslamotors/vehicle-command.git 2. ...
- 动态规划专题--容斥原理--codeforces-285E Positions in Permutations
codeforces-285E \(Positions \ in \ Permutations\) $$codeforces$$ 题意 给定一个序列长度为 \(n\) 的序列 , \(A=\{1 \d ...