`
liujianguangaaa
  • 浏览: 239083 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android虚拟电源管理驱动

阅读更多

Android系统如果没有电源管理相关的驱动程序,在启动时将会提示如下错误:

I/SystemServer(   50): Starting Battery Service.
E/BatteryService(   50): Could not open '/sys/class/power_supply/ac/online'
E/BatteryService(   50): Could not open '/sys/class/power_supply/usb/online'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/present'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/capacity'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/batt_vol'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/batt_temp'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/status'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/health'
E/BatteryService(   50): Could not open '/sys/class/power_supply/battery/technology'
I/SystemServer(   50): Starting Hardware Service.

此时启动完成后将显示Poweroff界面
图1


图2


这个问题的原因很简单,因为缺少相关电源部分驱动程序,Android系统无法获取/sys/class/power_supply/下的信息,从而导致启动不能。

对于开发板,开发的初期一般没有电源管理驱动程序,那要如何解决这个问题呢?

网上流传的解决办法是通过修改Android源码中的com_android_server_BatteryService.cpp,让android系统不去去读相关信息,强行赋值为电量充足。

但是如果无法重新编译android文件系统,应该如何处理?

其实,有一个更好的解决方法,就是在Linux内核中写一个虚拟电源驱动,这样的好处是增加电源芯片后,直接在此驱动上修改即可,也不用修改Android源码了。

/sys/class # cd power_supply/
/sys/class/power_supply # ls
ac       battery
/sys/class/power_supply # cd battery/
/sys/class/power_supply/battery # ls
capacity        manufacturer    subsystem       uevent
charge_counter power           technology      voltage_avg
current_avg     present         temp
device          serial_number   temp_ambient
health          status          type
/sys/class/power_supply/battery #

驱动源码:
=========================================================================================================
/*
* Fake Battery driver for android
*
* Copyright © 2009 Rockie Cheng <
aokikyon@gmail.com >
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#include <linux/module.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/jiffies.h>
#include <linux/sched.h>

#define BAT_STAT_PRESENT 0x01
#define BAT_STAT_FULL   0x02
#define BAT_STAT_LOW   0x04
#define BAT_STAT_DESTROY 0x08
#define BAT_STAT_AC   0x10
#define BAT_STAT_CHARGING 0x20
#define BAT_STAT_DISCHARGING 0x40

#define BAT_ERR_INFOFAIL 0x02
#define BAT_ERR_OVERVOLTAGE 0x04
#define BAT_ERR_OVERTEMP 0x05
#define BAT_ERR_GAUGESTOP 0x06
#define BAT_ERR_OUT_OF_CONTROL 0x07
#define BAT_ERR_ID_FAIL   0x09
#define BAT_ERR_ACR_FAIL 0x10

#define BAT_ADDR_MFR_TYPE 0x5F

static int android_ac_get_prop(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{

switch (psp)
{
case POWER_SUPPLY_PROP_ONLINE:
val->intval = BAT_STAT_AC;
break;
default:
break;
}
return 0;
}

static enum power_supply_property android_ac_props[] =
{
POWER_SUPPLY_PROP_ONLINE,
};

static struct power_supply android_ac =
{
.name = "ac",
.type = POWER_SUPPLY_TYPE_MAINS,
.properties = android_ac_props,
.num_properties = ARRAY_SIZE(android_ac_props),
.get_property = android_ac_get_prop,
};

static int android_bat_get_status(union power_supply_propval *val)
{

val->intval = POWER_SUPPLY_STATUS_FULL;
return 0;
}

static int android_bat_get_health(union power_supply_propval *val)
{

val->intval = POWER_SUPPLY_HEALTH_GOOD;
return 0;
}

static int android_bat_get_mfr(union power_supply_propval *val)
{

val->strval = "Rockie";
return 0;
}

static int android_bat_get_tech(union power_supply_propval *val)
{
val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
return 0;
}

static int android_bat_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
int ret = 0;

switch (psp)
{
case POWER_SUPPLY_PROP_STATUS:
ret = android_bat_get_status(val);
if (ret)
return ret;
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = BAT_STAT_PRESENT;
break;

case POWER_SUPPLY_PROP_HEALTH:
ret = android_bat_get_health(val);
break;
case POWER_SUPPLY_PROP_MANUFACTURER:
ret = android_bat_get_mfr(val);
if (ret)
return ret;
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
ret = android_bat_get_tech(val);
if (ret)
return ret;
break;
case POWER_SUPPLY_PROP_VOLTAGE_AVG:
val->intval = 3;
break;
case POWER_SUPPLY_PROP_CURRENT_AVG:
val->intval = 3;
break;
case POWER_SUPPLY_PROP_CAPACITY:
val->intval = 100;
break;
case POWER_SUPPLY_PROP_TEMP:
val->intval = 50;
break;
case POWER_SUPPLY_PROP_TEMP_AMBIENT:
val->intval = 50;
break;
case POWER_SUPPLY_PROP_CHARGE_COUNTER:
val->intval = 10;
break;
case POWER_SUPPLY_PROP_SERIAL_NUMBER:
break;
default:
ret = -EINVAL;
break;
}
return ret;
}

static enum power_supply_property android_bat_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_VOLTAGE_AVG,
POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TEMP_AMBIENT,
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_SERIAL_NUMBER,
POWER_SUPPLY_PROP_CHARGE_COUNTER,
};

/*********************************************************************
*   Initialisation
*********************************************************************/

static struct platform_device *bat_pdev;

static struct power_supply android_bat =
{
.properties = android_bat_props,
.num_properties = ARRAY_SIZE(android_bat_props),
.get_property = android_bat_get_property,
.use_for_apm = 1,
};

 

static int __init android_bat_init(void)
{
int ret = 0;

bat_pdev = platform_device_register_simple("battery", 0, NULL, 0);

ret = power_supply_register(&bat_pdev->dev, &android_ac);
if (ret)
goto ac_failed;

android_bat.name = bat_pdev->name;

ret = power_supply_register(&bat_pdev->dev, &android_bat);
if (ret)
goto battery_failed;

goto success;

power_supply_unregister(&android_bat);
battery_failed:
power_supply_unregister(&android_ac);
ac_failed:
platform_device_unregister(bat_pdev);
success:
return ret;
}

static void __exit android_bat_exit(void)
{
power_supply_unregister(&android_bat);
power_supply_unregister(&android_ac);
platform_device_unregister(bat_pdev);
}

module_init(android_bat_init);
module_exit(android_bat_exit);

MODULE_AUTHOR("Rockie Cheng < aokikyon@gmail.com >");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Fake Battery driver for android");

分享到:
评论

相关推荐

    Fluent电弧,激光,熔滴一体模拟 UDF包括高斯旋转体热源、双椭球热源(未使用)、VOF梯度计算、反冲压力、磁场力、表面张力,以及熔滴过渡所需的熔滴速度场、熔滴温度场和熔滴VOF

    Fluent电弧,激光,熔滴一体模拟。 UDF包括高斯旋转体热源、双椭球热源(未使用)、VOF梯度计算、反冲压力、磁场力、表面张力,以及熔滴过渡所需的熔滴速度场、熔滴温度场和熔滴VOF。

    基于协同过滤算法商品推荐系统.zip

    基于协同过滤算法商品推荐系统.zip

    锂电池半自动带电液舱标准手套箱(sw16可编辑+工程图)全套技术资料100%好用.zip

    锂电池半自动带电液舱标准手套箱(sw16可编辑+工程图)全套技术资料100%好用.zip

    jquery实现的网页版扫雷小游戏源码.zip

    这是一款基于jQuery实现的经典扫雷小游戏源码,玩家根据游戏规则进行游戏,末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏!是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。另外建议用户使用支持HTML5与css3效果较好的火狐或谷歌等浏览器预览本源码,可以看到地图的远景拉伸效果。

    Android studio 健康管理系统期末大作业App源码

    Android studio 健康管理系统期末大作业App源码

    校园表白墙网站源码、表白墙网站制作、网页表白墙源码

    校园表白墙网站源码、表白墙网站制作、网页表白墙源码 效果演示https://www.hybiaobai.cn/ 校园表白墙网站源码、表白墙网站制作、网页表白墙源码

    文字生成视频-可灵1.6

    In the video, a person stands alone in a snowy night, holding a delicate wine cup, with a desolate expression. The snowflakes are falling gently, and the person seems lost in deep thoughts and memories. They take a few steps, as if trying to follow the wind, with a sense of yearning and melancholy. The background shows an ancient Chinese-style house with eaves covered in snow, adding to the lonely and nostalgic atmosphere. The person's movements are slow and graceful, reflecting the complex emot

    ①软件 程序 网站开发路面附着系数估计,采用UKF和EKF两种算法 软件为Matlab Simulink,非Carsim联合仿真 dugoff轮胎模块:纯simulink搭非代码 整车模块:7自由

    ①软件 程序 网站开发路面附着系数估计,采用UKF和EKF两种算法。 软件为Matlab Simulink,非Carsim联合仿真。 dugoff轮胎模块:纯simulink搭非代码 整车模块:7自由度整车模型 估计模块:无迹卡尔曼滤波,扩展卡尔曼滤波,均是simulink现成模块应用无需S-function 带有相关文献和估计说明

    基于Spring Boot的在线考试系统--论文.zip

    基于Spring Boot的在线考试系统--论文.zip

    基于多边形逼近与仿射不变量的部分遮挡物体识别算法

    内容概要:本文介绍了一种新方法,用于识别仅由轮廓表示的部分遮挡物体。该方法通过对拐点检测来创建对象的近似多边形形状描述符,并采用一种简单易实施的匹配算法。描述符能够对噪声和部分遮挡保持较好的鲁棒性,在计算机视觉应用中尤其有效。研究涉及多种测试,涵盖人工数据、现实世界图像及不同条件下的变化(如加性高斯噪声、部分遮挡等),展示了良好的效果以及相较于同类方法的优势。 适用人群:从事计算机视觉相关工作的科研人员及技术人员。 使用场景及目标:适用于需要自动化的部分遮挡目标检测和匹配的各种应用场景,尤其是在机器学习项目中涉及光学字符识别等领域。通过使用该算法可以提高复杂环境中物体匹配的成功率,增强系统鲁棒性和适应范围。 其他说明:作者还讨论了关于边界表示法的一些优缺点并提出未来改进方向,例如自动生成迭代次数及引入新的层级化匹配策略。此外,文中提到的所有实验均在标准条件下进行,但当应用于实际环境中时可能需要额外调整参数以达到最佳性能。

    【Python】基于Python的美篇高清图片爬虫.zip

    【Python】基于Python的美篇高清图片爬虫

    node-v14.17.5-x64 msi安装包

    node-v14.17.5-x64 msi安装包

    ie8 升级到ie11 离线安装包

    ie8 升级到ie11 离线安装包 先安装补丁,再安装ie,某个补丁安装不上就跳过,先安装其他补丁,再回来安装。最后能装IE11就可以了

    设计与实现基于JavaWeb的校园兼职信息平台-毕业设计课程设计.zip

    Title: 《设计与实现基于JavaWeb的校园兼职信息平台——毕业设计/课程设计》 项目概述 本项目是一款针对校园环境的兼职信息平台,旨在为学生提供寻找兼职工作的机会,同时为企业提供一个发布兼职信息的平台。该平台采用JavaWeb技术,结合SSM(Spring, SpringMVC, MyBatis)框架开发,专注于解决学生兼职信息不对称的问题。 功能模块 兼职信息发布:企业用户可以发布兼职信息,包括职位描述、要求、薪资等。 兼职信息浏览:学生用户可以浏览兼职信息,并根据条件筛选合适的兼职。 评论与反馈:用户可以对兼职信息和雇主进行评论和反馈。 用户管理:包括学生和企业用户的注册、登录、信息修改等。 消息通知:系统会向用户推送相关的兼职信息和评论通知。 项目特色 评论功能(Comment Part-time):学生可以对企业发布的兼职进行评价,帮助其他学生更好地选择兼职。 信息审核:确保兼职信息的真实性和有效性。 用户互动:提供私信功能,方便学生与企业之间的沟通。 项目目标 帮助学生更快地找到合适的兼职工作。 为企业提供高效的人才招聘渠道。 增强校园内的就业服务和信息交流。 开发流

    基于springboot的应急救援物资管理系统.zip

    基于springboot的应急救援物资管理系统.zip

    用Python开发 Telegram 接口:涵盖用户登录、好友列表及聊天功能-含可运行代码及解释说明

    内容概要:本文档详细讲解了利用 Python 和 python-telegram-bot 库创建一个简易但实用性强的 Telegram 接口的方法。主要内容涵盖了从配置所需环境(如安装相关库)、编写登录验证逻辑,到实现获取好友列表和实施即时通信(聊天)等功能的具体代码演示及解释。文中还提供了关于用户认证的基本方法、简单用户数据模拟、基本的日志记录方式,以及启动机器人并维持监听状态的操作指导,最后提醒开发者替换成自己的 bot token 并指出了一些安全方面的考量,比如严格验证用户输入以保障应用程序的安全性。 适合人群:对于有兴趣探索社交平台集成或是初次接触即时通讯软件自动化构建,尤其是想基于 Python 来快速搭建一个 Telegram Bot 的初学者或是拥有基础编程经验的人士来说非常适合。 使用场景及目标:适用于想要快速建立个人或者小团队之间的信息交流渠道,测试和熟悉 Telegram Bot API 的工作机制,以及进一步理解和提升在社交平台上自动化工具开发技能的情况。这有助于加深理解 API 调用流程、异步消息传输机制等相关知识点,同时也可以作为更大规模项目的基础模块之一来考虑扩展。 其他说明:本指南侧重于理论联系实际的应用层面教学,不仅提供了完整的代码案例让读者可以亲手操作,还强调了良好编码习惯的重要性(像添加适当的注释),并且提及到了未来可能遇到的技术挑战——例如用户数据的真实保存与维护(推荐采用数据库解决方案)。这对于提高读者的实际动手能力和激发更多自主思考都起到了积极作用。

    手搓人工神经网络的教程

    手搓人工神经网络的教程。在CSDN文章中也有,但CSDN文章排版略有偏差,因此附上pdf文档

    回旋提升式柔性链输送机sw16可编辑全套技术资料100%好用.zip

    回旋提升式柔性链输送机sw16可编辑全套技术资料100%好用.zip

    视觉点胶+伺服打螺丝+压装+电测试生产线x_t全套技术资料100%好用.zip

    视觉点胶+伺服打螺丝+压装+电测试生产线x_t全套技术资料100%好用.zip

    基于java的准妈妈孕期交流平台设计新版源码+数据库+说明

    调试过可以运行。 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

Global site tag (gtag.js) - Google Analytics