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

高通的某些平台将电源管理移植到了ADSP Subsystem, 分析一下其中比较关心的部分

Architecture

    —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —| Generic TypeC Drvier             PowerSupply Framework  ||  GlinkClient-UCSI                   GlinkClient-BM      ||               PMIC Glink(Linux kernel)                  |—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —|                  PMIC GLink(ADSP)                       ||     Charger Thread                    BM Thread      |—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —BM    (Battery Manager)
SSDEV (Sink/Source devices)
BCS   (Battery Charging Status)
ICM   (Intelligent Charging Module)
APSD  (Automatic power source detection)
AICL  (automatic input current limiting)
UCSI  (USB Type-C Connector System Software Interface driver)

Charge Detection

不同于之前是先运行BC1.2再运行APSD,这里是直接运行APSD其中兼容BC1.2

BattMngrDevice_InitContext (既然ChgConfigData没有初始化 usb_connector_type,但检测的时候需要判断类型)
//CHARGER_CONFIG_DATA -> CHARGER_DETECTION_CONFIG_DATA usb_connector_type + NoofInputs 检测时有用
//charget_cfg.NoOfInputs = 2; (Input0  Type-C port or microUSB port + Input1  Wireless charging)ssdev_initialize(0, (usb_connector_type == CONNECTOR_TYPE_MICRO_USB) ? SSDEV_MODULE_USB : SSDEV_MODULE_TYPEC);
ssdev_initialize(1, SSDEV_MODULE_WLS);PmSchgAdcCmn2_GetUSBConnectorType(&usb_connector_type) (battmngrconfig_props.c CONNCfg定义的属性 0:microB 1:typec)
从这里我们可以得知,如果没有定义属性或者属性置为0,则默认是 SSDEV_MODULE_TYPEC,否则则需要通过PMIC内部来进行判断charger初始化的时候通过BattMngr_Thread_Create创建了线程charger_main,
while的循环执行charger_events (CHARGER_EVENT_TYPE 包含CHARGER_EVENT_CHGTYPE_CHANGE 角色电压电流等)
charger_process_eventscharger_detection_event_handlerssdev_detect_partnerSSDEV_MODULE_TYPEC ->  ssdev_typec_detect_partnerSSDEV_MODULE_USB   ->  ssdev_usb_detect_partnerbreakcharger_detection_evaluate_chargerSSDEV_MODULE_TYPEC ->  charger_detection_evaluate_typec_chargerbreakSSDEV_MODULE_USB   ->  charger_detection_evaluate_usb_chargerbreakSSDEV_PARTNER_TYPESSDEV_PARTNER_SNK_USB_SDP  SSDEV_PARTNER_SNK_USB_OCP, SSDEV_PARTNER_SNK_USB_CDP,SSDEV_PARTNER_SNK_USB_DCP, SSDEV_PARTNER_SNK_USB_FLOAT,...

SSDEV_PARTNER_TYPE跟之前平台类似 Android Qcom USB Driver学习(二)

需要注意在SSDEV_MODULE_TYPEC中ssdev_typec_detect_partner 和 ssdev_usb_detect_partner之间是没有break的,
也就是说无论是Typec还是usb都要通过ssdev_usb_detect_partner来调用PmSchgUsb_GetApsdResultStatus (APSD算法兼容BC1.2)返回
UsbPartnerType (充电类型),并且在charger_detection_evaluate_charger中应用,只执行一个来进行Input Current Limit的配置,
charger_detection_evaluate_typec_charger与charger_detection_evaluate_usb_charger 中就有break,

那时什么情况下会去触发detect呢? 中断 BATTMNGR_INTERRUPT_TYPE

battmngr_plat_irq_schgp_qg_apsd_done
在APSD运行的结束的中断后charger_notify(CHARGER_EVENT_DETECTION_UPDATE)通知到Charger Thread
battmngr_plat_irq_schgp_qg_plug_in
在插入的时候会发送BATTMNGR_DRV_USB_PLUGIN_EVENT,再通过charger_notify通知到Charger Thread

Kernel communication with ADSP

Battery Charging

battery_chg_write -> pmic_glink_write + wait_for_completion_timeout(等待ADSP的ack)
pmic_glink_process_rx_data -> pmic_glink_tx
处理数据并且回调给Kernel,返回响应,使得上面发送时的wait_for_completion_timeout等待结束
pmic_glink_rx_callback -> client->msg_cbbattery_chg_callback -> handle_message -> completion ackbattery_dock_charger_notify_msg(通信的message由两部分组成)
(1)PMIC Glink message header
#define MSG_OWNER_BC            32778   (kernel)
#define MSG_TYPE_REQ_RESP       1req_msg.hdr.owner = MSG_OWNER_BC;
req_msg.hdr.type = MSG_TYPE_REQ_RESP;
req_msg.hdr.opcode = (opcode for battery charger)(2)req_msg.value + req_msg.property_id注意Kernle和ADSP定义的名称不同
#define PMIC_GLINK_MSG_OWNER_CHARGER     32778  (ADSP)
#define PMIC_GLINK_MSG_TYPE_REQ_RESP      1

Type-C Role

Android Qcom USB Driver学习(一)

#define MSG_OWNER_UC         32779             (kernel)
#define PMIC_GLINK_MSG_OWNER_USB_TYPE_C  32779    (ADSP)ucsi_acknowledge_connector_change ucsi_qti_async_write -> ucsi_qti_glink_write -> pmic_glink_write
UCSI最终还是通过PMIC GLink的API来实现,并且同样会产生回调,会通过msg head中的owner来区分Client
pmic_glink_rx_callback->client->msg_cbucsi_callback -> handle_ucsi_notify -> ucsi_connector_changetypedef enum _PM_TYPEC_PORT_ROLE_TYPE                typedef enum _PM_TYPEC_EXIT_CONTROL_TYPE
{                                                     {TYPEC_PORT_ROLE_DRP,    //Source还是Sink由CC决定       TYPEC_EXIT_CONTROL_SNK,TYPEC_PORT_ROLE_SNK,    //Source 供电                  TYPEC_EXIT_CONTROL_SRC,TYPEC_PORT_ROLE_SRC,    //Sink接受供电            } PM_TYPEC_EXIT_CONTROL_TYPE;TYPEC_PORT_ROLE_DISABLE,TYPEC_PORT_ROLE_INVALID
} PM_TYPEC_PORT_ROLE_TYPE;这个还是跟之前如果需要转变则需要kernel调用两个API(1)typec_set_data_role (2)usb_role_switch_set_roleenum typec_data_role {                               enum typec_role {TYPEC_DEVICE,                                        TYPEC_SINK,TYPEC_HOST,                                          TYPEC_SOURCE,
};

Battery Status

Android uevent 电池电量上报机制

BM Thread -> battmngr_platform_charger_update
BattMngrPlatformFuncs.BattMngrPlat_Charger_Update_FuncPtr -> battmngr_plat_scpqchg_qbg_update_charger_power_supply将propery都存到到对应的属性中,例如usb_power_supply_propertiespmic_glink_send_power_supply_notification (msg.notifcation == USB_POWER_SUPPLY_GET_REQ == BC_USB_STATUS_GET)pmic_glink_tx(msg.hdr.opcode = BATT_MNGR_NOTIFY_IND == BC_NOTIFY_IND)根据opcode在callback回kernel中调用handle_notification发生变化,再去将ADSP返回的值更新到powersupply properties最后还是调用到power_supply_changed就跟原先的上报流程一样了,通过uevent上报各上层的healthd

Android Qcom USB Driver学习(九)相关推荐

  1. Android Qcom USB Driver学习(二)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) BC v1.2充电规范 Battery Charging Specification USB port 如 ...

  2. Android Qcom USB Driver学习(八)

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

  3. Android Qcom USB Driver学习(一)

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

  4. Android Qcom USB Driver学习(六)

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

  5. Android Qcom USB Driver学习(四)

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

  6. Android Qcom Audio架构学习

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

  7. Android Qcom lcd display 学习(1)

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

  8. Android Qcom lcd display 学习(4)

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

  9. Android Qcom lcd display 学习(3)

    Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...

最新文章

  1. C基础知识小总结(十)
  2. Spring Boot“内存泄漏”?看看美团大牛是如何排查的
  3. mysql timestamp 转型_MySQL的timestamp类型自动更新问题【转】
  4. 基于maven使用IDEA创建多模块项目
  5. 算法打卡39:喷水装置
  6. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  7. spring——使用xml声明式事务整合jdbc——GRUD
  8. c语言的上级步骤,数据结构 上级程序一(C语言).doc
  9. 多线程写mysql数据库_多线程读写mysql数据库
  10. Redis高级项目实战!北京java编程入门培训
  11. linux删除jpeg动态库,linux如何不用的删除动态库
  12. VB中的New 与 CreateObject的区别
  13. mysql创建一张日期表_MySQL创建一张日期表
  14. 计算机学院毕设翻译模版,计算机毕设外文翻译
  15. Ruby‘s Adventrue游戏制作笔记(十五)UnityNPC对话
  16. 最新Oracle官网JDK 8.0的下载
  17. HNUST Java 数据库系统课程设计:学生管理系统
  18. Z05 - 006、网站转化以及漏斗分析(转化分析)
  19. 舞台灯光计算机控制,舞台灯光的操作
  20. C# 调用Windows media play 播放器方法

热门文章

  1. 如何成功?但行实事,莫问前程
  2. 荷兰国旗问题的解决:额外空间复杂度O(1),时间复杂度O(N)
  3. JavaScript票据出票日期中文大写填写规范
  4. windows下GeoscenePro2.1连接postgis空间数据库
  5. 基于ChatGPT上线《你说我猜》小游戏
  6. python Mock模块
  7. ioctl() FIONREAD
  8. idea Springboot项目sout控制台中文输出乱码解决方案
  9. python cookielib 登录人人网
  10. 《群体遗传学》学习笔记