最近RK3026的项目需要修改开机充电,才分析了Android原生态的充电过程。

充电的代码和图标在system/core/charger中,会编译成名字为charger的可执行文件,打包进ramdisk中,在init.rc中脚本启动:

[java] view plain copy

  1. on charger
  2. setprop ro.boot.charger.emmc
  3. export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
  4. export LD_LIBRARY_PATH /vendor/lib:/system/lib
  5. setprop sys.usb.config adb
  6. service charger /charger
  7. disabled

on charger会触发该服务执行,所以现在要分析的就是on charger是如被何触发的。

在system/core/init/init.c中:

[java] view plain copy

  1. is_charger = !strcmp(bootmode, "charger");
  2. 。。。。。。
  3. if (is_charger) {
  4. action_for_each_trigger("charger", action_add_queue_tail);
  5. } else {
  6. action_for_each_trigger("early-boot", action_add_queue_tail);
  7. action_for_each_trigger("boot", action_add_queue_tail);
  8. }

可见,要触发charger, is_charger为真即可,即bootmode为“charger”,所以继续跟踪代码:

[java] view plain copy

  1. struct {
  2. const char *src_prop;
  3. const char *dest_prop;
  4. const char *def_val;
  5. } prop_map[] = {
  6. //   { "ro.boot.serialno", "ro.serialno", "", },
  7. { "ro.boot.mode", "ro.bootmode", "unknown", },
  8. { "ro.boot.baseband", "ro.baseband", "unknown", },
  9. { "ro.boot.bootloader", "ro.bootloader", "unknown", },
  10. };
  11. for (i = ; i < ARRAY_SIZE(prop_map); i++) {
  12. ret = property_get(prop_map[i].src_prop, tmp);
  13. if (ret > )
  14. property_set(prop_map[i].dest_prop, tmp);
  15. else
  16. property_set(prop_map[i].dest_prop, prop_map[i].def_val);
  17. }
  18. ret = property_get("ro.boot.console", tmp);
  19. if (ret)
  20. strlcpy(console, tmp, sizeof(console));
  21. /* save a copy for init's usage during boot */
  22. property_get("ro.bootmode", tmp);
  23. strlcpy(bootmode, tmp, sizeof(bootmode));

读取“ro.bootmode”得到的,但是“ro.bootmode”的属性又是通过"ro.boot.mode"来设置的。

而这个属性是读取/proc/cmdline参数,最终在import_kernel_nv函数中设置的:

[java] view plain copy

  1. if (!strcmp(name,"qemu")) {
  2. strlcpy(qemu, value, sizeof(qemu));
  3. } else if (!strncmp(name, "androidboot.", ) && name_len > ) {
  4. const char *boot_prop_name = name + ;
  5. char prop[PROP_NAME_MAX];
  6. int cnt;
  7. cnt = snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);
  8. if (cnt < PROP_NAME_MAX)
  9. property_set(prop, value);
  10. }
  11. }

命令行是kernel传进来的,所以要进入驱动中去了。

在kernel/drivers/power/rk29_charger_display.c文件中:

[java] view plain copy

  1. static void add_bootmode_charger_to_cmdline(void)
  2. {
  3. char *pmode=" androidboot.mode=charger";
  4. //int off = strlen(saved_command_line);
  5. char *new_command_line = kzalloc(strlen(saved_command_line) + strlen(pmode) + , GFP_KERNEL);
  6. sprintf(new_command_line, "%s%s", saved_command_line, pmode);
  7. saved_command_line = new_command_line;
  8. //strcpy(saved_command_line+off,pmode);
  9. //int off = strlen(boot_command_line);
  10. //strcpy(boot_command_line+off,pmode);
  11. printk("Kernel command line: %s\n", saved_command_line);
  12. }

终于看到了,就是在这里设置了androidboot.mode=charger属性。

继续跟进什么条件下才设置该属性,发现关机充电情况下,设置该属性,机子运行charger执行文件;这时候如果电源键按下超过两秒,charger执行文件重启机子,把标记设置为BOOT_MODE_CHARGE;重启后在驱动中,判断电量如果小于5%(可以修改该值),继续进入charger模式;否则不再设置androidboot.mode=charger属性,系统不会再执行charger文件,系统进入正常启动。

android的充电图标显示的更多相关文章

  1. Android 开机充电图标和充电动画

    首先驱动需要先获取到2个power supply kernel\msm-3.18\drivers\usb\phy\phy-msm-usb.c motg->usb_psy.name = " ...

  2. Android 使用Font Awesome 显示文字图标

    Android 使用Font Awesome 显示文字图标 简单几步就可以完成 简单的效果图: 1. 创建 assets 文件夹 在Android Studio 上的创建步骤为: 在 src/main ...

  3. Android 类似未读短信图标显示数字效果的分析

    之前一直以为是应用本身在对图标进行修改,看了源码之后发现其实主要的工作并不是应用自己完成的,主要的工作在是launcher里面完成的. 关于系统里面类似未读短信的具体处理流程如下, 原理 一个应用要实 ...

  4. Android Studio 那些事|Activity文件前标识图标显示为 j 而是 c

    问题:Activity文件前标识图标显示为 j 而是 c 的图标,或是没有显示,并且自己主动提示不提示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/fo ...

  5. 【转】android 电池(二):android关机充电流程、充电画面显示

    关键词:android 电池关机充电 androidboot.mode charger关机充电 充电画面显示 平台信息:内核:linux2.6/linux3.0系统:android/android4. ...

  6. android 电池(二):android关机充电流程、充电画面显示【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8498580 上一篇我们讲了锂电池的充放电的流程和电池的一些特性,这一节我们重点说一下a ...

  7. 浅谈Android系统的图标设计规范

    http://homepage.yesky.com/89/11620089.shtml 目前移动平台的竞争日益激烈,友好的用户界面可以帮助提高用户体验满意度,图标Icon是用户界面中一个重要的组成部分 ...

  8. 网页中多个图标在一张图片上,使用css将各图标显示

    现在的网页中显示很多图标算是常态,发现项目中页面上用到的图标都是单个图标单个文件,用的时候直接往页面上挂,这确实很常态. 如果,网站是挂在外网上,或者网速过低,又大量使用图标的情况下,由于浏览器和服务 ...

  9. WIN10图标显示异常

    1.打开控制面板,右上边查看方式选择边小图标显示 2.打开显示里面的自定义缩放级别 3.设置级别为125%  然后点击 应用 4.注销或者重启,然后将异常的快捷方式点击打开,就会恢复正常,至少我的是回 ...

随机推荐

  1. 清除UIWebView的缓存

    //清除cookies NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCook ...

  2. 抽取AWR数据

    使用$ORACLE_HOME/rdbms/admin/awrextr.sql $ sqlplus '/as sysdba' SQL*Plus: Release Production on Fri No ...

  3. MongoDB分片集群还原

    从mongodb 3.0开始,mongorestore还原的时候,需要一个运行着的实例.早期的版本没有这个要求. 1.为每个分片部署一个复制集 (1)复制集中的每个成员启动一个mongod mongo ...

  4. Java基础之写文件——在通道写入过程中的缓冲区状态(BufferStateTrace)

    控制台程序,在Junk目录中将字符串“Garbage in, garbage out\n”写入到名为charData.txt的文件中. import static java.nio.file.Stan ...

  5. Error : L6218E: Undefined symbol downloadAddress (referred from nand.o).

    MKD 报错: linking...LCD.axf: Error: L6218E: Undefined symbol EnZK (referred from ht128x64.o).LCD.axf: ...

  6. Lintcode: Flip Bits

    Determine the number of bits required to flip if you want to convert integer n to integer m. Have yo ...

  7. .vimrc文件配置及航意

    1.  vimrc文件常见语句释义 设定 tab 的位置          :set tabstop=4 输入 tab 时自动将其转化为空格          :set expandtab       ...

  8. DataFrame使用mysql数据

    错误提示:  Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc ...

  9. paper 75:使用MATLAB的神经网络工具箱创建神经网络

    % 生成训练样本集 clear all; clc; P=[110 0.807 240 0.2 15 1 18 2 1.5; 110 2.865 240 0.1 15 2 12 1 2; 110 2.5 ...

  10. 导出Excel offer2007以上

    package cn.knet.data.untils; import java.awt.Color; import java.io.File; import java.io.FileOutputSt ...