充电器类型检测实现代码分析
代码路径:/kernel/msm-3.18/drivers/usb/phy/phy_msm_usb.c
msm_otg_probe
(1)工作队列初始化
INIT_WORK(&motg->sm_work, msm_otg_sm_work);
INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work);充电器类型检测的work
INIT_DELAYED_WORK(&motg->id_status_work, msm_id_status_w);batt id状态的work
- 1
- 2
- 3
- 4
(2)注册power supply
motg->usb_psy.name = "usb";//文件节点/sys/class/power_supply/usbmotg->usb_psy.type = POWER_SUPPLY_TYPE_USB;motg->usb_psy.supplied_to = otg_pm_power_supplied_to;motg->usb_psy.num_supplicants = ARRAY_SIZE(otg_pm_power_supplied_to);motg->usb_psy.properties = otg_pm_power_props_usb;//所有支持的propertymotg->usb_psy.num_properties = ARRAY_SIZE(otg_pm_power_props_usb);motg->usb_psy.get_property = otg_power_get_property_usb;motg->usb_psy.set_property = otg_power_set_property_usb;motg->usb_psy.property_is_writeable= otg_power_property_is_writeable_usb;if (!msm_otg_register_power_supply(pdev, motg))psy = &motg->usb_psy;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
下面来重点分析两个工作队列sm_work和chg_detected_work
msm_otg_sm_work
case OTG_STATE_B_IDLE:
switch (motg->chg_state) {case USB_CHG_STATE_UNDEFINED://代码里面定义了USB chg detection涉及的多个状态motg->chg_state = USB_CHG_STATE_IN_PROGRESS;//状态设置为检测中msm_chg_detect_work(&motg->chg_work.work);//启动充电器类型检测的workcase USB_CHG_STATE_DETECTED://充电器类型检测完毕,也就是说上面的chg detect work
完毕后一定会设置该状态。
switch (motg->chg_type) {case USB_DCP_CHARGER:/* fall through */case USB_PROPRIETARY_CHARGER:msm_otg_notify_charger(motg,dcp_max_current);if (!motg->is_ext_chg_dcp)otg->phy->state =OTG_STATE_B_CHARGER;break;case USB_UNSUPPORTED_CHARGER:msm_otg_notify_charger(motg, 0);if (!motg->is_ext_chg_dcp)
otg->phy->state =OTG_STATE_B_CHARGER;break;case USB_CDP_CHARGER:msm_otg_notify_charger(motg,IDEV_CHG_MAX);/* fall through */case USB_SDP_CHARGER:msm_chg_check_dcd_flchg(motg);
msm_otg_start_peripheral(otg, 1);otg->phy->state =OTG_STATE_B_PERIPHERAL;mod_timer(&motg->chg_check_timer,CHG_RECHECK_DELAY);break;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
根据不同的充电器类型都调用了msm_otg_notify_charger函数,该函数一个参数为电流
msm_otg_notify_charger(struct msm_otg *motg, unsigned mA)
dev_dbg(motg->phy.dev, "Requested curr from USB = %u, max-type-c:%u\n",mA, motg->typec_current_max);//打印log信息
/* Save bc1.2 max_curr if type-c charger later moves to diff mode */
-> motg->bc1p2_current_max = mA;
-->if (msm_otg_notify_chg_type(motg))//通知PMIC充电器类型dev_err(motg->phy.dev,"Failed notifying %d charger type to PMIC\n",motg->chg_type);msm_otg_notify_power_supply(motg, mA);//设置其他property属性
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
msm_chg_detect_work:
switch (motg->chg_state) {case USB_CHG_STATE_UNDEFINED:case USB_CHG_STATE_IN_PROGRESS:……motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD;break;case USB_CHG_STATE_WAIT_FOR_DCD:msm_chg_enable_primary_det(motg);motg->chg_state = USB_CHG_STATE_DCD_DONE;
case USB_CHG_STATE_DCD_DONE:vout = msm_chg_check_primary_det(motg);
if (vout && !dm_vlgc) { /* VDAT_REF < DM < VLGC */if (line_state) { /* DP > VLGC */motg->chg_type = USB_PROPRIETARY_CHARGER;//到这里检测出第一种充电器类型proprietary,具体是啥类型也不清楚。motg->chg_state = USB_CHG_STATE_DETECTED;delay = 0;} else {msm_chg_enable_secondary_det(motg);//再做进一步的类型检测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_PROPRIETARY_CHARGER;else if (!dcd) {if (motg->pdata->enable_floated_charger== FLOATING_AS_DCP)motg->chg_type = USB_DCP_CHARGER;//根据配置设置这种情况下的充电器类型到底是DCP还是unsupported的,enable_floated_charger可以在dtsi中配置。else if (motg->pdata->enable_floated_charger== FLOATING_AS_INVALID)motg->chg_type =USB_UNSUPPORTED_CHARGER;} else {motg->chg_type = USB_SDP_CHARGER;//检测到SDP充电器}motg->chg_state = USB_CHG_STATE_DETECTED;//状态设置为检测完成。delay = 0;}
case USB_CHG_STATE_PRIMARY_DONE:vout = msm_chg_check_secondary_det(motg);if (vout)motg->chg_type = USB_DCP_CHARGER;elsemotg->chg_type = USB_CDP_CHARGER;//在secondary检测阶段区分是DCP还是CDPmotg->chg_state = USB_CHG_STATE_SECONDARY_DONE;
case USB_CHG_STATE_SECONDARY_DONE:motg->chg_state = USB_CHG_STATE_DETECTED;// secondary检测完毕整个类型检测完毕,状态设置为detected
case USB_CHG_STATE_DETECTED://下面看检测完毕后又做了哪些工作?看注释!!!
/* Notify the charger type to power supply owner as soon as we determine the charger.*/
msm_otg_notify_chg_type(motg);
queue_work(motg->otg_wq, &motg->sm_work);再次去调度sm_work
充电器类型检测实现代码分析相关推荐
- OSEA中QRS波检测算法代码分析-未完待续
最近一直在搞R波检测算法,对OSEA代码主要是对注释做一个翻译,增加注释,使代码更容易理解. 一.首先看QRSDE.H /*************************************** ...
- python编程思维代码_Python编程快速上手——强口令检测算法案例分析
本文实例讲述了Python强口令检测算法.分享给大家供大家参考,具体如下: 强口令检测 题目如下: 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令定义:长度不少于8个字符,同时包含 ...
- MSM USB插入流程代码分析
点击打开链接 代码路径:kernel\msm-3.18\drivers\power\qpnp-smbcharger.c src_detect_handler -->update_usb_stat ...
- Device Tree(三):代码分析
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...
- 原创 | 基于AI的智能急性颅内出血类型检测
作者:杨毅远 本文约6400字,建议阅读10分钟 本文介绍了通过AI技术检测急性颅内出血类型方面的知识. 颅内出血(颅骨内出血)是医疗领域严重的健康问题,需要快速且经常进行密集的医学治疗.在美国,颅内 ...
- 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析
2018-2019-2 网络对抗技术 20165324 网络对抗技术 Exp4:恶意代码分析 课下实验: 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析E ...
- 2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中生成后门软 ...
- Exp4 恶意代码分析 20164303 景圣
Exp4 恶意代码分析 实验内容 实验点一:系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果.目标就是找出 ...
- 用自定义代码分析来标准开发人员的开发规范
代码分析(关于代码分析详见http://msdn.microsoft.com/zh-cn/library/3z0aeatx(VS.80).aspx),是visual studio开发工具中提供的一 ...
最新文章
- python pandas 独热编码
- Run-Time Check Failure #3
- java怎么制作放置游戏_从零开始实现放置游戏(八)——实现后台管理系统(6)代码重构...
- argb888与rgb888转换程序_通过相机获取bayer 图像数据转换成RGB888数据并保存
- 虚拟机当作设置服务器,虚拟机当作设置服务器
- 浏览器 UC 自动添加关键字 去掉关键字
- JAVA如何选中一行上移,怎么把表格一行整体上移
- 快过年了,分享 25 个 JS 实用技巧送给大家吧
- microsoft账户登录一直加载_LoL手游登录常见问题答疑
- 1.thinkphp6配置文件详解
- 转:Secure CRT 中文乱码问题解决
- 深度贝叶斯神经网络(Deep Bayesian Neural Networks)实现方法
- android gps 经纬度转换,AndroidGPS获取当前经纬度坐标
- eclipse快捷方式打不开解决方法
- 12306 抢票助手 Java
- jflash添加芯片_工欲善其事,必先利其器:动手给JLink添加官方不支持的芯片
- 使用 IDEA 文件统计工具 Statistic
- 好吧! 阿达 奥古尼斯
- Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻
- Netty 实现一对一客户端聊天(由服务器转发)
热门文章
- Mybatis自定义轻量级分页组件(易集成,易拓展)
- 关于国产化系统银河麒麟(Kylin)的问题记录--持续更新
- 新浪微博 ios/android 你所访问的站点在新浪微博的认证失败 解决方法
- HP deskjet 2132 如何顺利在mac上使用
- android 自动亮屏解锁,android 点亮手机屏幕与屏幕解锁方法
- javascript_ES6新特性
- 手机OA是什么?有何优点?
- 词根词缀|ori/orn/ortho/pact/pan及词源O的故事
- Quartus中jtagserver找不到指定文件的解决方法
- UG 信息窗口弹不出来 测量 长度 角度 信息 窗口 弹不出来