点击打开链接

代码路径:/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

充电器类型检测实现代码分析相关推荐

  1. OSEA中QRS波检测算法代码分析-未完待续

    最近一直在搞R波检测算法,对OSEA代码主要是对注释做一个翻译,增加注释,使代码更容易理解. 一.首先看QRSDE.H /*************************************** ...

  2. python编程思维代码_Python编程快速上手——强口令检测算法案例分析

    本文实例讲述了Python强口令检测算法.分享给大家供大家参考,具体如下: 强口令检测 题目如下: 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令定义:长度不少于8个字符,同时包含 ...

  3. MSM USB插入流程代码分析

    点击打开链接 代码路径:kernel\msm-3.18\drivers\power\qpnp-smbcharger.c src_detect_handler -->update_usb_stat ...

  4. Device Tree(三):代码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...

  5. 原创 | 基于AI的智能急性颅内出血类型检测

    作者:杨毅远 本文约6400字,建议阅读10分钟 本文介绍了通过AI技术检测急性颅内出血类型方面的知识. 颅内出血(颅骨内出血)是医疗领域严重的健康问题,需要快速且经常进行密集的医学治疗.在美国,颅内 ...

  6. 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析

    2018-2019-2 网络对抗技术 20165324 网络对抗技术 Exp4:恶意代码分析 课下实验: 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析E ...

  7. 2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中生成后门软 ...

  8. Exp4 恶意代码分析 20164303 景圣

    Exp4 恶意代码分析 实验内容 实验点一:系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果.目标就是找出 ...

  9. 用自定义代码分析来标准开发人员的开发规范

      代码分析(关于代码分析详见http://msdn.microsoft.com/zh-cn/library/3z0aeatx(VS.80).aspx),是visual studio开发工具中提供的一 ...

最新文章

  1. python pandas 独热编码
  2. Run-Time Check Failure #3
  3. java怎么制作放置游戏_从零开始实现放置游戏(八)——实现后台管理系统(6)代码重构...
  4. argb888与rgb888转换程序_通过相机获取bayer 图像数据转换成RGB888数据并保存
  5. 虚拟机当作设置服务器,虚拟机当作设置服务器
  6. 浏览器 UC 自动添加关键字 去掉关键字
  7. JAVA如何选中一行上移,怎么把表格一行整体上移
  8. 快过年了,分享 25 个 JS 实用技巧送给大家吧
  9. microsoft账户登录一直加载_LoL手游登录常见问题答疑
  10. 1.thinkphp6配置文件详解
  11. 转:Secure CRT 中文乱码问题解决
  12. 深度贝叶斯神经网络(Deep Bayesian Neural Networks)实现方法
  13. android gps 经纬度转换,AndroidGPS获取当前经纬度坐标
  14. eclipse快捷方式打不开解决方法
  15. 12306 抢票助手 Java
  16. jflash添加芯片_工欲善其事,必先利其器:动手给JLink添加官方不支持的芯片
  17. 使用 IDEA 文件统计工具 Statistic
  18. 好吧! 阿达 奥古尼斯
  19. Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻
  20. Netty 实现一对一客户端聊天(由服务器转发)

热门文章

  1. Mybatis自定义轻量级分页组件(易集成,易拓展)
  2. 关于国产化系统银河麒麟(Kylin)的问题记录--持续更新
  3. 新浪微博 ios/android 你所访问的站点在新浪微博的认证失败 解决方法
  4. HP deskjet 2132 如何顺利在mac上使用
  5. android 自动亮屏解锁,android 点亮手机屏幕与屏幕解锁方法
  6. javascript_ES6新特性
  7. 手机OA是什么?有何优点?
  8. 词根词缀|ori/orn/ortho/pact/pan及词源O的故事
  9. Quartus中jtagserver找不到指定文件的解决方法
  10. UG 信息窗口弹不出来 测量 长度 角度 信息 窗口 弹不出来