该系列文章总目录链接与各部分简介: 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. Python3.3 学习笔记1 - 初步安装
  2. php errorcode,php中pdo错误处理方法详解
  3. rzsz上传下载命令
  4. 《渗透测试实战第三版(红队版)》翻译完成
  5. android computescroll_Android Scroller与computeScroll的调用机制关系
  6. android service莫名启动问题
  7. mysql索引使用b_mysql索引的数据结构,为什么用b+树
  8. android之自定义弹框
  9. asp.net中使用FreeTextBox控件
  10. ppt设置外观样式_ppt设置主题样式的方法步骤详解
  11. 生产质量分析报告常用模板汇总,质量人必备!
  12. 计算机管理员密码忘记了怎么恢复,新版tplink(tplogin.cn)管理员密码忘记了怎么办?...
  13. 2013-2015阿里双十一技术网络文章总结
  14. android播放swf文件
  15. Shell脚本文本三剑客之Sed
  16. 利用微搭低代码操作微信缓存
  17. 谈谈对python中的日期、时间、时区的理解(1)
  18. 睿赛德科技(RT-Thread)宣布完成A轮融资
  19. 把Windows给印度人做,微软大佬都去搞小工具了
  20. 成人想补充蛋白质,光吃鸡蛋就够了?鸡蛋和蛋白粉哪个好一点?

热门文章

  1. navicat mysql创建表_Navicat for MySQL如何创建数据表
  2. 变革管理 | 四种类型项目管理办公室(PMO)及Activist PMO
  3. 忘记RAR、ZIP压缩包密码?尝试这3个绝妙解决办法!
  4. Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记
  5. 小米平板 粉色版 16GB,不可以听书
  6. xcode 4 制作静态库详解
  7. Testin一日游实验室发布的行级APP质量报告:在那里拍携程双赢
  8. vim编辑器、用户管理常见命令
  9. 03_nand 闪存特性
  10. fastjson已经导入到项目中但还是提示:java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSON