Android Qcom USB Driver学习(九)
该系列文章总目录链接与各部分简介: 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学习(九)相关推荐
- Android Qcom USB Driver学习(二)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) BC v1.2充电规范 Battery Charging Specification USB port 如 ...
- Android Qcom USB Driver学习(八)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 因为要看usb charging的问题,所以需要补充一下battery的相关知识,算是入门吧 BAT SC ...
- Android Qcom USB Driver学习(一)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...
- Android Qcom USB Driver学习(六)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼 ...
- Android Qcom USB Driver学习(四)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) VID/PID识别USB设备 CDC-ACM驱动介绍 CDC-ACM(Communication De ...
- Android Qcom Audio架构学习
总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...
- Android Qcom lcd display 学习(1)
LCD的结构 TFT-LCD屏幕构造组成原理 Android LCD(一):LCD基本原理篇 LCD: 奇景光电 (hx8399) .敦泰 (ft8719) .京东方 .联咏等IC厂商 由于TFT-L ...
- Android Qcom lcd display 学习(4)
DRM Linux DRM(二)基本概念和特性 DRM(Direct Rendering Manager)学习简介 DRM 的诞生就是用来处理多个程序对 Video Card 资源的协同使用问题,通过 ...
- Android Qcom lcd display 学习(3)
Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...
最新文章
- Python3.3 学习笔记1 - 初步安装
- php errorcode,php中pdo错误处理方法详解
- rzsz上传下载命令
- 《渗透测试实战第三版(红队版)》翻译完成
- android computescroll_Android Scroller与computeScroll的调用机制关系
- android service莫名启动问题
- mysql索引使用b_mysql索引的数据结构,为什么用b+树
- android之自定义弹框
- asp.net中使用FreeTextBox控件
- ppt设置外观样式_ppt设置主题样式的方法步骤详解
- 生产质量分析报告常用模板汇总,质量人必备!
- 计算机管理员密码忘记了怎么恢复,新版tplink(tplogin.cn)管理员密码忘记了怎么办?...
- 2013-2015阿里双十一技术网络文章总结
- android播放swf文件
- Shell脚本文本三剑客之Sed
- 利用微搭低代码操作微信缓存
- 谈谈对python中的日期、时间、时区的理解(1)
- 睿赛德科技(RT-Thread)宣布完成A轮融资
- 把Windows给印度人做,微软大佬都去搞小工具了
- 成人想补充蛋白质,光吃鸡蛋就够了?鸡蛋和蛋白粉哪个好一点?
热门文章
- navicat mysql创建表_Navicat for MySQL如何创建数据表
- 变革管理 | 四种类型项目管理办公室(PMO)及Activist PMO
- 忘记RAR、ZIP压缩包密码?尝试这3个绝妙解决办法!
- Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记
- 小米平板 粉色版 16GB,不可以听书
- xcode 4 制作静态库详解
- Testin一日游实验室发布的行级APP质量报告:在那里拍携程双赢
- vim编辑器、用户管理常见命令
- 03_nand 闪存特性
- fastjson已经导入到项目中但还是提示:java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSON