Android Qcom USB Driver学习(二)
BC v1.2充电规范
Battery Charging Specification
USB port 如何识别不同的Charger类型
USB Charger类型
| USB_SDP_CHARGER | POWER_SUPPLY_TYPE_USB ( Standard Downstream Port ) | USB Charger |
|---|---|---|
| USB_CDP_CHARGER | POWER_SUPPLY_TYPE_USB_CDP ( Charging Downstream Port ) | USB Charger |
| USB_ACA_DOCK_CHARGER | POWER_SUPPLY_TYPE_USB_ACA ( Accessory Charger Adapters ) | USB Charger |
| USB_ACA_A_CHARGER | POWER_SUPPLY_TYPE_USB_ACA ( Accessory Charger Adapters ) | USB Charger |
| USB_ACA_B_CHARGER | POWER_SUPPLY_TYPE_USB_ACA ( Accessory Charger Adapters ) | USB Charger |
| USB_ACA_C_CHARGER | POWER_SUPPLY_TYPE_USB_ACA ( Accessory Charger Adapters ) | USB Charger |
| USB_DCP_CHARGER | POWER_SUPPLY_TYPE_USB_DCP ( Dedicated Charging Port ) | AC Charger |
| USB_PROPRIETARY_CHARGER | POWER_SUPPLY_TYPE_USB_DCP ( Dedicated Charging Port ) | AC Charger |
DCP
Dedicated Charging Port就是wall adapter or AC charger。平时用的连到220v插座的充电器。不能枚举USB设备,可以供(4.75v< VCHG <5.25v)的稳定电压和(0.5A <IDCP <5A)的充电电流。DCP在内部将D+和D-短接。
ACA
Accessory Charger Adapter,PD设备连接到OTG port上,连接到Accessory Port上的外设能正常的使用USB信号和OTG设备进行通信,charger port仅标识为充电口口,并且需要指示何时给OTG和Accessory ports进行供电,ACA这种还没很了解。
CDP
Charging Downstream Port就是大电流充电端口,其实就是特殊USB口,它可以提供1.5A ~ 5A的大电流充电。 没连通外设时,当CDP检测到D+线上的电压VDAT_REF (Data Detect Voltage 0.25V ~ 0.4V)< VDP < VLGC (Logic Threshold 0.8V ~ 2V)后,会在D-线上输出VDM_SRC (0.5v ~ 0.7v);从外设联通时起,CDP将不再把电压VDM_SRC输出到D-上,直到外设断开联通。
SDP
Standard Downstream Port是标准的DS Port,通常是值电脑的USB口,是遵循USB2.0规范的host或hub的朝下端口。支持USB1.1(100 mA), USB2.0(100 mA/500mA) 和 USB 3.0(150 mA/900 mA),D+ and D- 一般内部下拉电阻14.25-24.8欧姆。
Other
除此以上遵循USB BC 1.2 specification,其实还有两类Other charging port (OCP) ,具有专有 D+/D- 充电配置的非标准充电器,USB 充电规范 1.2 未涵盖的端口。 这些充电器具有与普通 DCP 相似的电流能力。 D+ 和 D- 连接到Vbus 通过电阻分压器提供固定电压电平以及 Floating charger ,D+ 和 D- 浮动的非标准充电器, Type-C允许使用这种类型的充电器规格,只要它具有 Type-C 插座或系留电缆。
高通检测流程
高通平台的电池充电是被PMIC或者外部的充电芯片所控制。它必须知到充电器类型和最大充电电流。
充电类型
(1)DCD:DP上有150mV(= 10uA x 15K欧姆下拉电阻)的电压,DM上电压为0,
这是一个硬件检测模块,用于帮助检测 USB数据线已与另一端的引脚接触,与FLOAT类型有关
DCD机制向D+提供的电流源,可用定时器替代,但DCD能尽快检测数据线的连接,不必等待定时器超时,
DCD(data contact detect)的检测机制等待时间是可编程的通常是300ms 或者 600 ms。
(2)Primary Det(DP发起检测DM):
DP上加载0.6V电压,DM上电压为0,充电器类型是SDP
DP上加载0.6V电压,DM上电压为0.6V,进入Secondary Det
(3)Secondary Det(DM发起检测DP):
DM上加载0.8V电压,DP上电压为0,充电器类型是CDP
DM上加载0.8V电压,DP上电压为0.8V,充电器类型是DCP
kernel/msm-4.19/drivers/usb/phy/phy-msm-usb.c
kernel/msm-4.19/drivers/power/supply/qcom/qpnp-smb5.c
msm_otg_probe
INIT_WORK(&motg->sm_work, msm_otg_sm_work);
OTG_STATE_UNDEFINED
OTG_STATE_B_IDLE
msm_otg_start_host(otg, 1);
OTG_STATE_A_HOST
or
msm_otg_start_peripheral(otg, 1);
OTG_STATE_B_PERIPHERAL;
INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work);
USB_CHG_STATE_IN_PROGRESS // 正在检测中
USB_CHG_STATE_WAIT_FOR_DCD
USB_CHG_STATE_DCD_DONE
msm_chg_check_primary_det //区分 SDP和DCP/CDP or SDP和FLOAT
USB_CHG_STATE_DETECTED //检测完毕状态
or
USB_CHG_STATE_PRIMARY_DONE
msm_chg_check_secondary_det //区分DCP和CDP
USB_CHG_STATE_SECONDARY_DONE
USB_CHG_STATE_DETECTED //检测完毕状态
kernel/msm-4.19/drivers/usb/phy/phy-msm-usb.c
float类型检测应该主要跟硬件有关,在DCD Done阶段, 如USB数据线不短路并悬空,当连接上拉和下拉时,电压不符标准
case USB_CHG_STATE_DCD_DONE:
...
vout = msm_chg_check_primary_det(motg);
line_state = readl_relaxed(USB_PORTSC) & PORTSC_LS;
dm_vlgc = line_state & PORTSC_LS_DM;
if (vout && !dm_vlgc) { /* VDAT_REF < DM < VLGC */
if (line_state) { /* DP > VLGC */
motg->chg_type = USB_NONCOMPLIANT_CHARGER;
motg->chg_state = USB_CHG_STATE_DETECTED;
} else {
msm_chg_enable_secondary_det(motg);
delay = MSM_CHG_SECONDARY_DET_TIME;
motg->chg_state = USB_CHG_STATE_PRIMARY_DONE;
}
} else { /* DM < VDAT_REF || DM > VLGC */
if (line_state) /* DP > VLGC or/and DM > VLGC */
motg->chg_type = USB_NONCOMPLIANT_CHARGER;
else if (!dcd && floated_charger_enable)
motg->chg_type = USB_FLOATED_CHARGER;
else
motg->chg_type = USB_SDP_CHARGER;
motg->chg_state = USB_CHG_STATE_DETECTED;
}
break;
充电电流
kernel/msm-4.19/drivers/power/supply/qcom/qpnp-smb5.c
kernel/msm-4.19/drivers/power/supply/qcom/smb5-lib.c
static const struct power_supply_desc usb_psy_desc = {
.name = "usb",
.type = POWER_SUPPLY_TYPE_USB_PD,
.properties = smb5_usb_props,
.num_properties = ARRAY_SIZE(smb5_usb_props),
.get_property = smb5_usb_get_prop,
.set_property = smb5_usb_set_prop,
.property_is_writeable = smb5_usb_prop_is_writeable,
};
smb5_usb_get_prop
smblib_get_charge_current(chg, &val->intval);
smblib_get_apsd_result //smblib_apsd_results = usb charger type SDP/CDP/DCP
smb5_usb_set_prop
smblib_set_prop_pd_active
update_sw_icl_max(chg, apsd->pst);
/* rp-std or legacy, USB BC 1.2 */
switch (pst) {
case POWER_SUPPLY_TYPE_USB:
/*
* USB_PSY will vote to increase the current to 500/900mA once
* enumeration is done.
*/
if (!is_client_vote_enabled(chg->usb_icl_votable,
USB_PSY_VOTER)) {
/* if flash is active force 500mA */
vote(chg->usb_icl_votable, USB_PSY_VOTER, true,
is_flash_active(chg) ?
SDP_CURRENT_UA : SDP_100_MA);
}
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, false, 0);
break;
case POWER_SUPPLY_TYPE_USB_CDP:
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
CDP_CURRENT_UA);
break;
case POWER_SUPPLY_TYPE_USB_DCP:
rp_ua = get_rp_based_dcp_current(chg, typec_mode);
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, rp_ua);
break;
case POWER_SUPPLY_TYPE_USB_FLOAT:
/*
* limit ICL to 100mA, the USB driver will enumerate to check
* if this is a SDP and appropriately set the current
*/
smblib_info(chg, "debug float set to %d uA\n", chg->dcp_icl_ua);
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
chg->dcp_icl_ua);
break;
case POWER_SUPPLY_TYPE_UNKNOWN:
default:
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
SDP_100_MA);
break;
}
}
Android Qcom USB Driver学习(二)的更多相关文章
- Android JNI学习(二)——实战JNI之“hello world”
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Delphi 调试连接 任意Android手机/平板/盒子(要安装Google USB Driver,并且还有USB的相关许多文章)
Delphi有时候无法连接调试一些手机,解决方案: 1.安装Google USB Driver 2.通过设备管理器查看手机或平板USB的VID,PID 3.修改你的电脑上的android_winusb ...
- CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.
CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android.Buffer Overflow Vu ...
- android 与usb 设备通信(二)
再次遇到android mUsbManager.getDevicelist() 得不到usb 设备的问题.于是深入去探讨android 与usb 外围设备通信的问题.第一篇文章写的有点乱,本质就是需 ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- Android系列之网络(二)----HTTP请求头与响应头
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android Wear(手表)开发 - 学习指南
版权声明:欢迎自由转载-非商用-非衍生-保持署名.作者:Benhero,博客地址:http://www.cnblogs.com/benhero/ Android Wear开发 - 学习指南 http: ...
- Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
一. 移动支付: 用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...
- android 适配器 BaseAdapter 的学习
昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类.事实上 ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
随机推荐
- adb对安卓app进行抓包(ip连接设备)
adb对安卓app进行抓包(ip连接设备) 一,首先将安卓设备的开发者模式打开,提示允许adb调试 二,自己的笔记本要和安卓设备在同一个网段下(同连一个WiFi就可以了) 三,在笔记本上根据ip来连接 ...
- Linux下查看压缩文件内容的 10 种方法【转】
转载地址:https://zhuanlan.zhihu.com/p/91593509 1.使用 Vim 编辑器 Vim 不仅仅是编辑器,它还包含其他许多强大的功能.下面的命令将直接显示压缩归档文件的内 ...
- 【Spring-Security】Re11 Oauth2协议 P2 Redis存储 密码模式令牌
一.Redis配置 需要的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- 台式机,华硕主板z390ws,cpu为i7-9700k 安装Ubuntu18.04系统 使用独立显卡工作 (但是显示器HDMI线缆插在主板的HDMI插槽)开机进入系统运行几分钟后自动重启,此时主板显示错误码为AMI错误
如题: 手上有这样一台新的工作站,配置为华硕主板z390ws,cpu为i7-9700k ,独立显卡为技嘉2060super, 安装Ubuntu18.04系统 . 在主板bios中进行设置(设置使用 P ...
- 8月5日CSP-S模拟赛赛后总结
8月5日CSP-S模拟赛赛后总结 \[8月5日 \ \ CSP-S模拟赛 \ \ 赛后总结 \\ 2024年8月5日 \\ by \ \ \ uhw177po \] 一.做题情况 第一题比赛 \(10 ...
- MySQL 5.7 DDL 与 GH-OST 对比分析
作者:来自 vivo 互联网存储研发团队- Xia Qianyong 本文首先介绍MySQL 5.7 DDL以及GH-OST的原理,然后从效率.空间占用.锁阻塞.binlog日志产生量.主备延时等方面 ...
- 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具
Metabase 是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板.与传统的 BI 工具相比,Metabase 不需要用户具备编写 SQL 的能力 ...
- quartz监控日志(四)自定义QuartzJobBean来实现监控
quartz监控日志(一) quartz监控日志(二)添加监听器 quartz监控日志(三)查看卡死线程堆栈 上面几章介绍了quartz监控的几种方式,下面再介绍一种监听方式:自定义QuartzJob ...
- vs code 快速配置
1. 基本操作 打开工程文件: ctrl + p 在文件搜索内容: ctrl + shift + f 进入设置: ctrl + shift + p, 然后输入 user setting 添加插件: c ...
- THUPC2024 初赛
<南开大学数分I月考III在初赛开始四十分钟时结束> 早晨试图速成泰勒展开失败了 考试前 zsy 把 yzf 接到学校了,应该是国赛后第一次见 yzf 考完试发现 yzf 已经买好 KFC ...