最近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. IIS URL Rewrite redirect from one Domain to another

    IIS URL Rewrite enables Web administrators to create powerful rules to implement URLs that are easie ...

  2. 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享

    使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享   在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享 ...

  3. mysql在线改表结构 pt-online-schema-change

    https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html 不锁表更改数据库表结构 pt-online-s ...

  4. 错误是无法将“XXX”转换为“System.CompenentModel.Design.Serialization.InstanceDescrip”问题的解决办法

    发生原因: 出现这个问题的原因是两次编译生成的程序集的版本一样,导致VS的窗体设计器没有获取到最新的运行时对象,而出现的错误. 解决办法: 修改项目的配置信息,使其每次编译的时候都生成不同的版本. 在 ...

  5. sql语句感想

    select出来内容可以当成表拿来用,,比如取别名什么的. union是纵向的,追加记录(行) join on是横向的,追加列

  6. devexpress13学习系列(一)PDFViewer(2)

    DevExpress.XtraPdfViewer Namespace 该命名空间下,保留着pdfviewer组件需要的类,主要有:   Class Description   PdfCurrentPa ...

  7. 转:MIME(Multipurpose Internet Mail Extensions)类型

    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...

  8. oracle,sqlserver,mysql 命令行 开启、关闭所需要的服务

    ORACLE需要开启的服务   需要启动的服务:   口令: 启动Oracle 11g服务: (下面的可以作为bat 脚本,直接运行便可以不用去自己去启动和关闭服务了.) @echo off @ EC ...

  9. html5文件上传

    <!DOCTYPE html><html><head> <title>Html5 Ajax 上传文件</title></head> ...

  10. Ubuntu + CentOS7 搭建tftp Server

    基于Ubuntu系统做的tftp服务器,基于CentOS 7都差不多,书写了关键命令,测试过Ubuntu 12.0.4 和CentOS 7环境 1.介绍tftp服务器     TFTP(Trivial ...