当前位置: 首页 > news >正文

怎样用编程语言做网站/深圳整合营销

怎样用编程语言做网站,深圳整合营销,网站设计验收,上海网站络公司1、概述随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状态的监控(电池电量、电池状态…

1、概述

随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状态的监控(电池电量、电池状态及电池温度等)。下面将详细分析android的电池系统架构。

2、Android电池系统架构

Android系统中对电池的管理驱动层继承了linux下的power supply class,而在用户层则是在BatteryService.java中通过广播的方式将如下一些电池相关的属性上报给上层app使用。这些属性都是在java中声明,在jni中调用更新的。

16eacddc98ca2189dd80a7dbe1e52bfe.jpg

而这些属性都是在com_android_server_BatteryService.cpp这个本地代码-jni中通过调用sys文件系统访问驱动层中电池相应的状态进行更新的。

94be24e264e48d7343c729977f96f9d0.jpg

3、BatteryService

代码路径:

frameworks/base/services/java/com/android/server/BatteryService.java

BatteryService 作为电池及充电相关的服务,主要作了如下几件事情: 监听 UEvent、读取sysfs 中的状态 、广播Intent.ACTION_BATTERY_CHANGED。

3.1、监听UEvent:

19ae0eb582e9c47c1b2f2c1898d5be15.jpg

BatteryService 实现了两个UEvenObserver mUEventObserver(如上代码所示)。uevent是Linux 内核用来向用户空间主动上报事件的机制,对于JAVA程序来说,只实现 UEventObserver的虚函数 onUEvent,然后注册即可。

3.2、读取sysfs电池状态

17b2ec14400838c7646828fbe5b27100.jpg

update读取sysfs文件做到同步取得电池信息,然后根据读到的状态更新BatteryService 的成员变量,并广播一个Intent来通知其它关注电源状 态的组件。当kernel有power_supply事件上报时,mUEventObserver调用update()函数,然后update 调用native_update从sysfs中读取相关状态(com_android_server_BatteryService.cpp)。

3.3、广播Intent.ACTION_BATTERY_CHANGED

8fed366f8d0bbdea204f6affe16945ae.jpg

通过广播Intent.ACTION_BATTERY_CHANGED,将电池状态、电池电量、电池工艺等属性打包,发送给其它的使用者,也就是说,只要在app程序里监听了Intent.ACTION_BATTERY_CHANGED这个广播,就能获取到电池的各种状态属性!

4、本地代码-jni

代码路径:

frameworks/base/services/jni/com_android_server_BatteryService.cpp

这是battery用户空间的本地代码,调用sys文件系统访问驱动程序,并向上层BatteryService封装本地方法以隔离平台化的差异。

在这个文件的头部有如下定义:

2fea6761989351b8a006b3799b620b17.jpg

这个就是底层battery驱动所生成的sys文件系统路径。

在这个文件里封装了一个本地方法:

6b3695bd82eeb14bf05d38e1653fbcbf.jpg

供上层BatteryService使用。另外,在这个文件中通过GetFieldID,得到BatteryService.java类中声明的电池属性ID,如下:

7e072813b36c6c85f30764e25cdc26d2.jpg

关于java与c/c++互调的问题,这里就不再赘诉了,网上有很多的资料。

在这个文件里通过操作相应的sys文件系统来获取电池的各种属性值,看看如下这段代码:

fb67c6bdb6172d24a32c51e92c663849.jpg

POWER_SUPPLY_PATH已经在文件头部定义过了,对应路径:/sys/class/power_supply,然后遍历整个文件夹,查找各个能源供应设备的各种属性,如上选中部分是用来查找交流设备的属性的。

各能源设备属性概况如下:

/sys/class/power_supply/ac/online AC 电源连接状态

/sys/class/power_supply/usb/online USB电源连接状态

/sys/class/power_supply/battery/status 充电状态

/sys/class/power_supply/battery/health 电池状态

/sys/class/power_supply/battery/present 使用状态

/sys/class/power_supply/battery/capacity 电池 level

/sys/class/power_supply/battery/batt_vol 电池电压

/sys/class/power_supply/battery/batt_temp 电池温度

/sys/class/power_supply/battery/technology 电池技术

当供电设备的状态发生变化时,driver会更新这些文件,然后通过jni中的本地方法android_server_BatteryService_update向java层发送信息。

5、驱动

5.1、驱动概述

android系统电池部

分的驱动程序,继承了传统linux系统下的Power Supply驱动程序架构,Battery驱动程序通过Power

Supply驱动程序生成相应的sys文件系统,从而向用户空间提供电池各种属性的接口。Linux标准的 Power

Supply驱动程序所使用的文件系统路径为:/sys/class/power_supply ,其中的每个子目录表示一种能源供应设备。

6b25be9fe8dd8586b04396b5ae3cf571.jpg

5.2、驱动头文件

Power Supply驱动程序头文件kernel/include/linux/power_supply.h,注册和注销驱动程序的函数如下:

intpower_supply_register(struct device *parent,struct power_supply *psy);

voidpower_supply_unregister(struct power_supply *psy);

structpower_supply {

constchar *name; /*设备名称*/

enumpower_supply_type type; /* 类型 */

enumpower_supply_property *properties; /* 属性指针 */

size_tnum_properties; /*属性的数目*/

char**supplied_to;

size_tnum_supplicants;

int(*get_property)(struct power_supply *psy, /*获得属性*/

enumpower_supply_property psp,

unionpower_supply_propval *val);

void(*external_power_changed)(struct power_supply *psy);

/* ...... 省略部分内容 */

};

5.3、power supply core

对应的驱动程序:power_supply

0f2dc738e69e5fdbfd090b7bae1882ba.jpg

来看看power_supply_sysfs.c这个文件。这里主要是对诸如如下这些电源设备属性创建uevent!

b0e790293fa7d10093ec084ce65a61cc.jpg

这些uevent节点不一定都会创建,节点创建与否还和具体的电源设备驱动传进来的num_properties和properties有关,在创建uevent函数power_supply_uevent中可以很容易的看出这一点:

4bd9bb24772f39d21b436b5f4f67c949.jpg

5.4、battery driver

目前项目(T808、T828)中所使用的电池检测与管理方式是POC ADC方式,对应的驱动文件是:

mediatek/kernel/drivers/power/battery_common.c

在此文件的probe函数里有如下内容:

8ada299ddcacf69971718ba47ae82cec.jpg

可以看出,在这里将ac、usb及battery三种电源供应设备注册到了power supply core中去了,而相应的全局结构体变量ac_main、usb_main及battery_main作了如下定义:

64233d238be1c3196ef3cbe2341516f6.jpg

92418fdbb6e8856039eaee3b530e855b.jpg

各个电源设备所需要创建的uevent节点由这里传入的xx_props决定,相应的定义如下:

a002a9a529023d6bb75bcfd500c70941.jpg

可发现:ac和usb只创建了一个online属性,上层app通过判断ac和usb的online状态便可知道当前系统是由什么设备在充电了;而battery则创建了如:status、health、present、capacity、batt_vol等等和电池相关的诸多属性,上层app通过这些电池属性uevent便可监控电池的当前工作状态了。

举例说明一下这些属性的状态改变后是如何向系统发送更新消息的,来看看ac online的状态更新。

4e9a6695f126bc90a9531a27ecd1a806.jpg

该函数在power supply sysfs中show property的时候得到调用,而AC_ONLINE作为ac电源唯一的属性会在ac_update中得到更新:

afc894331dd2959513b53b4435c5474f.jpg

ac_update则最终会在bat_thread_kthread中进行轮循,在这里有一个全局的BMT_status,作为整个电源供应设备的各种属性传达!另外再来看看CHARGING_CONTROL battery_charging_control这个全局的函数指针,原型定义如下:

a5ca169992d27e97b3a620aa722b85ce.jpg

6a845907187d450cb36e73afb949f105.jpg

chr_control_interface函数原型如下:

6db23d480731939a518949141f027f20.jpg

对应文件路径:

mediatek/platform/mt6572/kernel/drivers/power/charging_hw_pmic.c

charging_func函数指针数组定义如下:

dd21a51afa3a2e12e4b9a2e1ea1a2057.jpg

可以看出通过如下的调用关系:

f59d25219f2d4c89d347da328b11c007.jpg

最终会调用到由:

61d835873c67eccddba935d75f1c0640.jpg

这些枚举类型所一一对应的函数中去,如上面调用关系CHARGING_CMD_GET_CHARGER_TYPE,则是获取charger type,函数原型如下:

46b5506b12fad446c45ea10ee632f9b3.jpg

在这里通过pmic的硬件状态来获取相应的信息。

5.5、充电误差纠正

理想中的电池是没有内阻的,电池电压的消耗都在外部的负载上。

af72988f6f35bf4fd9d4570ee8b928c8.jpg

实际情况却不是这样的,正由于电池内阻的存在,通过直接测量电池电压(ADC)的方式获得的电池电量都会存在一定的误差,不管电池是处于供电还是放电的状

态,这种误差都会存在,特别是在电池电量满、电池电量空及关机充电的情况下这种误差很容易被用户察觉,从而带来不好的用户体验。

5bfd755486b990754664cfbd822eec81.jpg

那么针对电池内阻导致的这个误差,完全可以通过数学方式进行纠正。

1b798b5c298aa3b3a34497c2881969f3.jpg

通过上图可知,只要知道了电池内阻,就可以很容易地纠正这种误差。但电池的内阻不是不变的,而是随着电池电量的变化而变化的,不同型号的电池,这种特性还不一样,那么要想得到比较准确的电池电量,就很有必要让电池厂提供一组完整的电池电压与电池内阻的关系表了!

充放电过程中误差的纠正代码:

mediatek/kernel/drivers/power/battery_meter.c

在oam_run中有如下代码:

fce080d80e33ab869b16cce81e89ebaa.jpg

函数mtk_imp_tracking就是针对充放电过程中电池内阻所产生的压降所作的一个△V的修正。

另外一个是,由于电池特性,在开关机的时候会出现电量跳变的问题,在系统中采用了将关机时的UI电量保存到RTC中,在下次开机的过程中用实际检测到的电量值与保存到RTC中的UI电量值进行比较判断,由于用户可能会更换电池,这两者之间的差值控制在了20%的范围内,也就是说:实际检测到的电量值在RTC中保存的UI电量值的20%范围内则使用保存在RTC中的UI电量值作为当前电池的电量值;如果实际检测到的电量值超过了RTC中UI电量值的20%,则认为用户更换了电池,用实际检测到的电量值作为当前电池的电量值。

相应的判断代码如下:

908c472a2af67d790641a9fd1e790f6d.jpg

在头文件:

mediate/custiom/mt6572/kernel/battery/battery/cust_battery_meter.h

中有如下定义

d65dfc78be2b34a70590864c67fcae0a.jpg

6、写在最后

关于电池电量检测的算法过程,这里不再赘述,在MTK发布的Customer_Training_Battery_Charging.pdf这个文件中有比较详细的讲述。

原文:http://www.cnblogs.com/reality-soul/p/4794896.html

http://www.lbrq.cn/news/743095.html

相关文章:

  • 正规网站建设套餐报价/百度推广托管
  • 阿里去要企业网站建设方案书/百度知道合伙人官网
  • 肇庆网站上排名/seo的中文意思
  • 企业做门户网站的重要性/桔子seo查询
  • 校园云网站建设/留号码的广告网站不需要验证码
  • 网站控制/网络营销的市场背景
  • 成人学室内设计学校有哪些/青岛seo网站推广
  • 成都网站建设/站优化
  • 绍兴网站的优化/网络培训机构排名前十
  • 广州市建设厅官方网站/qq推广引流怎么做
  • 企业门户网站系统/网络营销岗位招聘信息
  • 建设部信访网站/百度广告联盟一个月能赚多少
  • 网站排名软件利搜/目录型搜索引擎有哪些
  • 雄安专业网站建设公司/百家号seo怎么做
  • 如何用ae做模板下载网站/网站结构
  • WordPress付费会员组/百度优化插件
  • 美国做海关数据知名网站/google海外推广
  • 网站页面设计公司推荐/地推团队联系方式
  • 网站开发项目延期说明/链接制作软件
  • 自己做整个网站的流程/个人怎么做百度竞价
  • 大淘客网站推广位怎么做/搜索引擎入口大全
  • 在什么网站可以接活做/全国十大教育机构
  • 移动门户网站建设特点/最佳磁力吧ciliba搜索引擎
  • 单位网站建设方案/青岛网站制作公司
  • 美食网站中饮食资讯该怎么做/2021时事政治热点50条
  • 网站友情链接形式/9个广州seo推广神技
  • 5h制作网站/福州百度seo排名
  • 昆明网站建设手机版/宁波seo网站推广
  • 外贸网站建设网站/网络营销企业案例
  • 创个网站怎么弄/南宁关键词排名公司
  • 机器人控制基础:串级 PID 和模糊 PID介绍与对比(干货总结)
  • 项目管理.管理理念学习
  • 【AI】算法环境-显卡、GPU、Cuda、NVCC和cuDNN的区别与联系
  • 链表-2.两数相加-力扣(LeetCode)
  • Linux设备树简介
  • 从哲学(业务)视角看待数据挖掘:从认知到实践的螺旋上升