该系列文章总目录链接与各部分简介: 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_ACA_DOCK_CHARGER POWER_SUPPLY_TYPE_USB_ACA ( Accessory Charger Adapters )
USB_ACA_A_CHARGER
USB_ACA_B_CHARGER
USB_ACA_C_CHARGER
USB_DCP_CHARGER POWER_SUPPLY_TYPE_USB_DCP ( Dedicated Charging Port ) AC Charger
USB_PROPRIETARY_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_probeINIT_WORK(&motg->sm_work, msm_otg_sm_work);OTG_STATE_UNDEFINEDOTG_STATE_B_IDLEmsm_otg_start_host(otg, 1);OTG_STATE_A_HOSTormsm_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_DCDUSB_CHG_STATE_DCD_DONEmsm_chg_check_primary_det  //区分 SDP和DCP/CDP or SDP和FLOATUSB_CHG_STATE_DETECTED //检测完毕状态or   USB_CHG_STATE_PRIMARY_DONEmsm_chg_check_secondary_det  //区分DCP和CDPUSB_CHG_STATE_SECONDARY_DONEUSB_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;elsemotg->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.cstatic 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_propsmblib_get_charge_current(chg, &val->intval);smblib_get_apsd_result //smblib_apsd_results = usb charger type SDP/CDP/DCPsmb5_usb_set_propsmblib_set_prop_pd_activeupdate_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学习(二)相关推荐

  1. Android Qcom USB Driver学习(九)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 高通的某些平台将电源管理移植到了ADSP Subsystem, 分析一下其中比较关心的部分 Archite ...

  2. Android Qcom USB Driver学习(一)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...

  3. Android Qcom USB Driver学习(四)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) VID/PID识别USB设备 CDC-ACM驱动介绍   CDC-ACM(Communication De ...

  4. Android Qcom USB Driver学习(八)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 因为要看usb charging的问题,所以需要补充一下battery的相关知识,算是入门吧 BAT SC ...

  5. Android Qcom USB Driver学习(六)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼 ...

  6. Android Qcom Audio架构学习

    总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...

  7. Android Qcom lcd display 学习(4)

    DRM Linux DRM(二)基本概念和特性 DRM(Direct Rendering Manager)学习简介 DRM 的诞生就是用来处理多个程序对 Video Card 资源的协同使用问题,通过 ...

  8. ZYNQ学习之路9.USB总线学习(二)

    Linux中USB驱动程序依然遵循标准的设备驱动模型--总线.设备.驱动.和I2C总线设备驱动一样,所有的USB驱动程序都必须创建的主要结构体是struct usb_driver,它们向USB核心代码 ...

  9. Android Qcom lcd display 学习(1)

    LCD的结构 TFT-LCD屏幕构造组成原理 Android LCD(一):LCD基本原理篇 LCD: 奇景光电 (hx8399) .敦泰 (ft8719) .京东方 .联咏等IC厂商 由于TFT-L ...

最新文章

  1. 黑客渗透入门教程 第一课:粗暴的端口扫描
  2. 量子力学 一 基础1 角动量
  3. apt-get卸载命令
  4. Redis-3.2.4服务搭建
  5. Android开发笔记(三十七)按钮类控件
  6. Navicat连接MySQL8.0版本时出现Client does not support authentication protocol requested by server;报错的问题解决办法
  7. [Vue] : vue-resource 实现 get, post, jsonp请求
  8. PyCharm设置Python版本
  9. Kettle下载安装pdi-ce-7.1.0.0-12
  10. 调试器---镜像劫持
  11. Windows rundll32的用法-脚本命令管理打印机
  12. 51DITU地图接口
  13. k8s入坑之报错(4)报错:repomod.xml signature could not be verified
  14. 苹果登录skype显示无法连接服务器,无法连接appstore服务器 无法连接appstore服务器怎么办呢...
  15. oracle查询数字类溢出,有趣的数值溢出(一)
  16. 【黑灰产犯罪研究】涉物联网犯罪
  17. 什么是大数据?以及大数据的5V特性
  18. 使用netterm连接linux虚拟机
  19. 希望成功,给点积分,才有勇气开VIP
  20. android 高德地图移动卡顿_高德、百度和腾讯三家比拼,哪个 Android 车机地图 App 更好用?...

热门文章

  1. 富有哲理的12条大数据金句
  2. 开源项目Krita学习(二)
  3. leetcode奇技淫巧-递归中途强制跳出
  4. 鸟枪换炮,Android Studio的初体验——Android Studio系列(一)
  5. docker - 安装searx搜索引擎
  6. 文本到图像模型,如何快速生成高质量图片? #Google Muse AI
  7. 什么是私域流量?如何运营?
  8. 怎么把一个表格拆分成两个表格
  9. ARFoundation系列讲解 - 57 3D物体识别一
  10. 华为路由器交换机命令汇总-持续更新