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

#include

#include

#include

#include

#include

#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");

==================================================================================================================

阿虚(Rockie Cheng)

如有错误,欢迎指正!

android电源驱动程序,[转]Android虚拟电源管理驱动相关推荐

  1. Android系统连按5次电源键,连按5次手机电源键竟有这个功能,紧急情况很有用,大家都该知道...

    手机现在是我们生活中必不可少的物品了,现在很多人都非常依赖手机,几乎都是手机不离手的.在以前,我们的手机也仅仅是用来通话,而现在通话只能说是手机众多功能中的其中一种.就拿电源键来说吧,电源键其实并不像 ...

  2. Android判断Wlan信号强弱及wlan管理信息

    http://blog.csdn.net/zd_1471278687/article/details/12158367 先来了解下Android如何获取wifi的信息: WifiManager wif ...

  3. Android系统移除电池电量监测管理功能

    系统优化 - 去除电池电量监测管理功能 去除电池电量监测管理功能,去除电量提示功能. 需要去除电池电量对升级功能的影响,如低电量时无法进行系统升级. 车机平台不需要电池电量监测管理,电池管理模块对界面 ...

  4. Ubuntu上为Android编写驱动程序

    在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软 ...

  5. android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)

    控件类概述 View 可视化控件的基类 属性名称 对应方法 描述 android:background setBackgroundResource(int) 设置背景 android:clickabl ...

  6. 【Android 应用开发】Activity 返回堆栈管理 ( 阶段总结 | 任务栈管理 | 返回堆栈 | 清除返回堆栈 | 亲和性 | 启动模式补充 | standard | singleTop )

    文章目录 一. 安卓应用任务栈管理 二. 任务与返回堆栈回顾 三. 返回堆栈清除 四. 关于亲和性回顾 五. Activity 启动模式 LaunchMode 补充 ( standard | sing ...

  7. Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...

    本文将带你了解Android应用开发之Android Activity栈管理  制定关闭某一个Activity,关闭所有Activit,希望本文对大家学Android有所帮助. 系统Api :打开新的 ...

  8. android判断多个按钮,Android开发之判断有无虚拟按键(导航栏)的实例

    判断有无虚拟按键(导航栏) 现在很大一部分手机没有虚拟按键,一部分有.我们在做适配的时候可能会用到这方面的知识. 例如:屏幕填充整个屏幕的时候,没办法只能连导航栏一起填充了,但是这个不是我们想要的,我 ...

  9. android 导航 美国,变美了 Android N或用全新虚拟导航按键

    原标题:变美了 Android N或用全新虚拟导航按键 变美了 Android N或用全新虚拟导航按键 [IT168 资讯]虽然距离谷歌Android N系统的发布已经有一段时间了,不过该系统目前仍旧 ...

最新文章

  1. html5关于定位功能的实现
  2. 10 个开发新人提及最多的 GitHub Repo
  3. php验证百度云doc,百度云推送通知埋的大大的坑,成功测试REST API for PHP服务端...
  4. URL编解码、Big Endian和Little Endian
  5. js 操作Listbox js 获取Listbox选择的值的代码
  6. ssma5.3_适用于Oracle的Microsoft SQL Server迁移助手(SSMA)v7.1
  7. ElasticSearch搜索底层基础原理总结
  8. Mac关闭应用与Windows有哪些不同?
  9. easyui下拉选项多怎么解决_30岁以后皮肤松弛皱纹越来越多怎么办?这组瑜伽帮你解决...
  10. 关于锐捷校园网断网的解决办法
  11. Ubuntu18.04、Ubuntu20.04之ROS安装教程
  12. 高斯核函数 python实现
  13. 关于采用消息钩子机制的透明加密的简单破解
  14. 有道计算机网络知识,网易有道推广介绍1 让你了解到网易的知识。。。.pptx
  15. mac 更新系统后无法使用 git
  16. confluence7安全补丁_Confluence 7 伴随程序的安装
  17. python报错No module named XXX通用解决方法
  18. 3G时会有两次 Activate PDP context request消息
  19. 小程序开发外包费用一般是多少?
  20. 全国30米土地利用数据分享(1980-2020)

热门文章

  1. vimdiff使用总结
  2. UITextView 取消键盘方法
  3. html5 javascript 事件练习3键盘控制练习
  4. 玩不转大数据就别勉强了,或许“小数据”才是真正的终南捷径
  5. Soldier and Badges
  6. 《网站设计 开发 维护 推广 从入门到精通》—— 2.3 页面设计创意思维
  7. Linux服务器上最简单的Nginx反向代理配置
  8. nginx已添加systemctl,但不能开机自启动问题
  9. Django模拟新浪微博的@功能
  10. ccform 表单的单据打印