目录

Android PowerSupply (一)总概

Android PowerSupply (二)power_supply_core

Android PowerSupply (三)power_supply_sys

Android PowerSupply (四)ChargeIC SGM41511 IC driver调试

Android PowerSupply (五)ChargeIC SGM41511 IC简介

Android Healthd BartteryMonitor

通过power supply class类的加载 了解其过程

static int __init power_supply_class_init(void)
{power_supply_class = class_create(THIS_MODULE, "power_supply");//!< 注册powersupply类,路径  /sys/class/powersupply By: jixuan 2021年6月15日power_supply_class->dev_uevent = power_supply_uevent; //!< uevent处理 By: jixuan 2021年6月15日power_supply_init_attrs(&power_supply_dev_type);//!< 伴随powersupply类创建的节点属性 By: jixuan 2021年6月15日return 0;
}
void power_supply_init_attrs(struct device_type *dev_type)
{int i;dev_type->groups = power_supply_attr_groups;for (i = 0; i < ARRAY_SIZE(power_supply_attrs); i++)__power_supply_attrs[i] = &power_supply_attrs[i].attr;
}
static const struct attribute_group *power_supply_attr_groups[] = {&power_supply_attr_group,NULL,
};
static struct attribute_group power_supply_attr_group = {.attrs = __power_supply_attrs,.is_visible = power_supply_attr_is_visible,//!< 在实际新增加的powersupply中 会设置其可见性,仅展示所需要的proerty By: jixuan 2021年6月15日
};
/* Must be in the same order as POWER_SUPPLY_PROP_* */
//!< 顺序必须与枚举定义的类型顺序一致,是判断可见性的依据 By: jixuan 2021年6月15日
static struct device_attribute power_supply_attrs[] = {/* Properties of type `int' */POWER_SUPPLY_ATTR(status),POWER_SUPPLY_ATTR(charge_type),POWER_SUPPLY_ATTR(health),POWER_SUPPLY_ATTR(present),POWER_SUPPLY_ATTR(online)POWER_SUPPLY_ATTR(cycle_count),POWER_SUPPLY_ATTR(voltage_max),POWER_SUPPLY_ATTR(voltage_min)POWER_SUPPLY_ATTR(voltage_now),POWER_SUPPLY_ATTR(voltage_avg),POWER_SUPPLY_ATTR(voltage_ocv),POWER_SUPPLY_ATTR(voltage_boot),POWER_SUPPLY_ATTR(current_max),POWER_SUPPLY_ATTR(current_now),POWER_SUPPLY_ATTR(power_now),POWER_SUPPLY_ATTR(power_avg),POWER_SUPPLY_ATTR(charge_full)POWER_SUPPLY_ATTR(capacity)POWER_SUPPLY_ATTR(capacity_raw),POWER_SUPPLY_ATTR(temp),POWER_SUPPLY_ATTR(temp_max)POWER_SUPPLY_ATTR(battery_type),POWER_SUPPLY_ATTR(cycle_counts),............//!< power_supply 类中具有N多属性,仅展示部分,实际在init过程中会指明这些属性是否可见 By: jixuan 2021年6月15日
};
 //!< 通过POWR_SUPPLY_ATTR宏 定义show shore函数 By: jixuan 2021年6月15日
#define POWER_SUPPLY_ATTR(_name)                    \
{                                   \.attr = { .name = #_name },                  \.show = power_supply_show_property,               \.store = power_supply_store_property,             \
}
 //!< 以 show函数为例 By: jixuan 2021年6月15日
static ssize_t power_supply_show_property(struct device *dev,struct device_attribute *attr,char *buf) {static char *type_text[] = {"Unknown", "Battery", "UPS", "Mains", "USB", "USB_DCP","USB_CDP", "USB_ACA", "USB_HVDCP", "USB_HVDCP_3", "USB_PD","Wireless", "USB_FLOAT", "BMS", "Parallel", "Main", "Wipower","TYPEC", "TYPEC_UFP", "TYPEC_DFP"};
/*这里以 type为例, 类似的解析还有:status_textcharge_typehealth_texttechnology_textscope_text
*/struct power_supply *psy = dev_get_drvdata(dev);const ptrdiff_t off = attr - power_supply_attrs;power_supply_get_property(psy, off, &value);//!< 核心函数调用,通过driver中注册的回调,获取当前powersupply的具体属性 By: jixuan 2021年6月15日else if (off == POWER_SUPPLY_PROP_TYPE ||off == POWER_SUPPLY_PROP_REAL_TYPE)return scnprintf(buf, PAGE_SIZE, "%s\n",type_text[value.intval]);//!< 以type为例,通过回调获取到返回的 num号,对应到上面定义的type类型的字符串 By: jixuan 2021年6月15日//!< 这里显然需要 确保 枚举的type种类和 上面定义的字符串顺序要一一对应 By: jixuan 2021年6月15日 、//!< 其他属性 和 type的解析类似 By: jixuan 2021年6月15日
}

所有的属性如下图这些,实际在驱动的解析过程中,会根据注册的powersupply有的存在的属性去设置其可见性,通过统一的show shore方法读写;

在sysfs中uevent的处理

int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)
{struct power_supply *psy = dev_get_drvdata(dev);int ret = 0, j;char *prop_buf;char *attrname;dev_dbg(dev, "uevent\n");dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->desc->name);ret = add_uevent_var(env, "POWER_SUPPLY_NAME=%s", psy->desc->name);prop_buf = (char *)get_zeroed_page(GFP_KERNEL);for (j = 0; j < psy->desc->num_properties; j++) {struct device_attribute *attr;char *line;attr = &power_supply_attrs[psy->desc->properties[j]];ret = power_supply_show_property(dev, attr, prop_buf);//!< 主动调用show property将获取的属性值转换为对应的字符串 By: jixuan 2021年6月15日line = strchr(prop_buf, '\n');attrname = kstruprdup(attr->attr.name, GFP_KERNEL);dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf);ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf);//!< 添加uevent By: jixuan 2021年6月15日}return ret;
}

例如 barttery 类powersupply 通过uevent上报的信息

Android PowerSupply (三)power_supply_sys相关推荐

  1. Gradle for Android 第三篇( 依赖管理 )

    Gradle for Android 第三篇( 依赖管理 ) 依赖管理是Gradle最闪耀的地方,最好的情景是,你仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的j ...

  2. android camera(三):camera V4L2 FIMC

    关键词: android  camera CMM 模组 camera参数  CAMIF   V4L2   平台信息: 内核: linux 系统: android 平台:S5PV310(samsung ...

  3. Android之Android Studio三种方式导入外部资源 以及 报错处理

    Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 . 2 ...

  4. Android的三种网络联接方式(URL / HttpURLConnection | HttpClient | InetAddress )

    Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets.Internet 协议和常见 HTTP ...

  5. Android开发-WebView中实现Android调用JS JS调用Android 【三】

    老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面,注册 ...

  6. Gradle For Android(三)Gradle优化与灵活的使用技巧

    <Gradle For Android(三)Gradle优化与灵活的使用技巧 > 转载请注明来自傻小孩b(gold.xitu.io/user/57e089-喜欢的可以关注我,不定期总结文章 ...

  7. 单枪匹马撸个聊天室, 支持Web/Android/iOS三端

    单枪匹马撸个聊天室, 支持Web/Android/iOS三端 原文地址: github.com/yinxin630/b- 前排提醒, 阅读本文需要对JavaScript较为熟悉, 本文将讲解核心功能点 ...

  8. Android Camera 三 CameraService 和 Client 链接到 HAL

    Android Camera 一 源码路径 Android Camera 二 JNI JAVA和C/CPP图像数据传输流程分析 Android Camera 三 CameraService 和 Cli ...

  9. Android桌面三:手机壁纸

    Android桌面三:手机壁纸 手机壁纸 手机壁纸分为静态壁纸和动态壁纸,设置方式也不同 一:静态壁纸 Android允许使用WallpaperManager来改变手机壁纸,提供了如下方法进行设置: ...

最新文章

  1. 【视频】显示器固定参数struct fb_fix_screeninfo中char id[16]说明
  2. 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)...
  3. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解
  4. c++ int 转 short_C/C++结构体内存对齐
  5. LeetCode 4 Median of Two Sorted Arrays
  6. 蓝桥杯2015年第六届C/C++省赛B组第七题-牌型种数
  7. Open Inventor学习资源
  8. SVM(三)—Kernels(核函数)
  9. html 显示编辑xml文件,如何将 XML 文件显示为 HTML 表格展示
  10. VC2008 快捷键
  11. 使用C语言输出菱形详解
  12. js获取上周、本周、上月、本月、第一天和最后一天
  13. Error from chokidar (C:\): Error: EBUSY: resource busy or locked, lstat ‘C:\hiberfil.sys‘的解决方案
  14. eclipse报 The word is not correctly spelled问题
  15. DCloud使用小结
  16. 简单的python装b代码_一秒学会,小白也能上手,最简单的装逼代码
  17. 最大似然估计算法(简单,通俗易懂)
  18. 如何在ESP8266中使用深度睡眠模式降低功耗
  19. 恶意网站http://www.chaxun.com,近日不断受到这个无耻网站的弹出广告骚扰(已找到解决方法)
  20. windows访问共享文件夹 登录失败: 禁用当前的账户 解决方法

热门文章

  1. 支付宝的下个千亿生意!揭秘阿里智能公交布局
  2. NDK编译FFmpeg
  3. 宜盟费控-成长型企业首选的移动报销及费控解决方案
  4. 合字研究——看看藏文里面一共有多少个字吧
  5. Spine的使用技巧笔记
  6. 替代TeamViewer 5分钟限制的免费远程控制软件 - UltraViewer 免费远程控制软件
  7. 新能源汽车热泵空调技术方案
  8. 计算机组装课教学要求,计算机组装与维护考试 [《计算机组装与调试》课程的教学改革]...
  9. C++建造者模式(4)
  10. ROS——rosdep国内源更新