本文转载自:http://blog.csdn.net/xubin341719/article/details/8498580
上一篇我们讲了锂电池的充放电的流程和电池的一些特性,这一节我们重点说一下android关机充电是怎么、充电画面显示是怎么实现的,这个在工作中也比较有用,我们开始做这一块的时候也走了不少的弯路。我记得我们做adnroid2.3的时候,关机状态和充电logo显示是在uboot中做的。应该是有两种做法,回头我再看下uboot中做画面显示那一块是怎么做的,这一节我们重点说系统中的充电logo显示。
一、android正常开机流程、关机充电流程
在写这篇文章之前我们先看两个流程:正常开机流程,关机充电系统启动流程
1、正常开机流程,按开机键。
可大致分成三部分
(1)、OS_level:UBOOT、kenrel、init这三步完成系统启动;
(2)、Android_level:这部分完成android部的初始化;
(3)、Home Screen:这部分就是我们看到的launcher部分。
2、关机充电系统启动流程
与前面相比,这个流程只走到init这一部分,就没有往后走了,这部分我们会在后面的代码中分析。
二、关机充电逻辑硬件逻辑
1、插入DC,charger IC从硬件上唤醒系统,相当于长按开机键开机。
下面这部分是charger IC连接系统的控制部分。
三、软件逻辑。
DC插入,其实相当于关机状态下“按开机键”开机。第一步要走UBOOT、kernel 、android init这一流程。
1、UBOOT
UBOOT启动代码我们不在这里详细分析,这里我们只要注意二个问题:
a:如何判断是DC插入;
b:设定setenv("bootargs", "androidboot.mode=charger"),androidboot.mode这个参数相当重要,这个参数决定系统是正常启动、还是关机充电状态。
Uboot/board/samsung/smdk4212/smkd4212.c
- int board_late_init (void)
- {
- int keystate = 0;
- printf("check start mode\n");
- if ((*(int *)0x10020800==0x19721212) || (*(int *)0x10020804==0x19721212)
- || (*(int *)0x10020808==0x19721212)) //(1)、检查是否有DC插入;
- {
- setenv ("bootargs", "");//(2)、没有DC插入;
- } else { //DC插入
- int tmp=*(int *)0x11000c08;
- *(int *)0x10020800=*(int *)0x10020804=0x19721212;
- *(int *)0x11000c08=(tmp&(~0xc000))|0xc000;
- udelay(10000);
- if ((*(int *)0x11000c04 & 0x80)!=0x80 && INF_REG4_REG != 0xf) {
- setenv ("bootargs", "androidboot.mode=charger");//(3)、设定bootargs为charger状态
- printf("charger mode\n");
- } else {
- setenv ("bootargs", "");
- }
- *(int *)0x11000c08=tmp;
- }
- #ifdef CONFIG_CPU_EXYNOS4X12
- int charge_status=CheckBatteryLow();//(4)、检查电池电量;
- keystate=board_key_check();//(5)、检查按键状态;
- // fuse bootloader
- if(second_boot_info != 0) {
- boot_symbol=1;
- INF_REG2_REG =0x8;
- run_command(CONFIG_BOOTCMD_FUSE_BOOTLOADER, NULL);
- }
- if((INF_REG4_REG == 0xd)) {
- // reboot default
- char buf[10];
- sprintf(buf, "%d", CONFIG_BOOTDELAY);
- setenv ("bootdelay", buf);
- setenv ("reserved", NULL);
- saveenv();
- } else if((INF_REG4_REG == 0xe) || keystate == (0x1 | 0x2)) { //(6)、按键进入fastboot模式;
- // reboot bootloader
- boot_symbol=1;
- INF_REG2_REG =0x8;
- printf("BOOTLOADER - FASTBOOT\n");
- setenv ("reserved", "fastboot");
- setenv ("bootdelay", "0");
- } else if((INF_REG4_REG == 0xf) || keystate == (0x1 | 0x2 | 0x4)) { //(7)、按键进入recovery模式;
- // reboot recovery
- printf("BOOTLOADER - RECOVERY\n");
- boot_symbol=1;
- INF_REG2_REG =0x8;
- setenv ("reserved", CONFIG_BOOTCMD_RECOVERY);
- setenv ("bootdelay", "0");
- } else
- if(keystate == (0x1 | 0x4) || second_boot_info != 0 || partition_check()) { //(8)、按键进入卡升级模式;
- // 2nd boot
- printf("BOOTLOADER - 2ND BOOT DEVICE\n");
- boot_symbol=1;
- INF_REG2_REG =0x8;
- setenv ("bootcmd", CONFIG_BOOTCOMMAND);
- setenv ("reserved", CONFIG_BOOTCMD_FUSE_RELEASE);
- setenv ("bootdelay", "0");
- } else { //(9)、正常启动;
- // normal case
- char buf[10];
- sprintf(buf, "%d", CONFIG_BOOTDELAY);
- setenv ("bootdelay", buf);
- }
- INF_REG4_REG = 0;
- return 0;
- }
(1)、检查是否有DC插入;