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

本文转载自: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

[cpp]  view plain   copy
  1. int board_late_init (void)  
  2. {  
  3.     int keystate = 0;  
  4.     printf("check start mode\n");  
  5.   if ((*(int *)0x10020800==0x19721212) || (*(int *)0x10020804==0x19721212)  
  6. || (*(int *)0x10020808==0x19721212)) //(1)、检查是否有DC插入;  
  7. {  
  8.     setenv ("bootargs", "");//(2)、没有DC插入;  
  9.   } else  { //DC插入  
  10.         int tmp=*(int *)0x11000c08;  
  11.     *(int *)0x10020800=*(int *)0x10020804=0x19721212;  
  12.     *(int *)0x11000c08=(tmp&(~0xc000))|0xc000;  
  13.     udelay(10000);  
  14.     if ((*(int *)0x11000c04 & 0x80)!=0x80 && INF_REG4_REG != 0xf) {  
  15.         setenv ("bootargs", "androidboot.mode=charger");//(3)、设定bootargs为charger状态  
  16.         printf("charger mode\n");  
  17.     } else {  
  18.         setenv ("bootargs", "");  
  19.     }  
  20.     *(int *)0x11000c08=tmp;  
  21.   }  
  22. #ifdef CONFIG_CPU_EXYNOS4X12  
  23.     int charge_status=CheckBatteryLow();//(4)、检查电池电量;  
  24.     keystate=board_key_check();//(5)、检查按键状态;  
  25.     // fuse bootloader  
  26.     if(second_boot_info != 0) {  
  27.         boot_symbol=1;  
  28.         INF_REG2_REG =0x8;  
  29.         run_command(CONFIG_BOOTCMD_FUSE_BOOTLOADER, NULL);  
  30.     }  
  31.     if((INF_REG4_REG == 0xd)) {  
  32.         // reboot default  
  33.         char buf[10];  
  34.         sprintf(buf, "%d", CONFIG_BOOTDELAY);  
  35.         setenv ("bootdelay", buf);  
  36.         setenv ("reserved", NULL);  
  37.         saveenv();  
  38.     } else if((INF_REG4_REG == 0xe) || keystate == (0x1 | 0x2)) { //(6)、按键进入fastboot模式;  
  39.         // reboot bootloader  
  40.         boot_symbol=1;  
  41.         INF_REG2_REG =0x8;  
  42.         printf("BOOTLOADER - FASTBOOT\n");  
  43.         setenv ("reserved", "fastboot");  
  44.         setenv ("bootdelay", "0");  
  45.     } else if((INF_REG4_REG == 0xf) || keystate == (0x1 | 0x2 | 0x4)) { //(7)、按键进入recovery模式;  
  46.         // reboot recovery  
  47.         printf("BOOTLOADER - RECOVERY\n");  
  48.         boot_symbol=1;  
  49.         INF_REG2_REG =0x8;  
  50.         setenv ("reserved", CONFIG_BOOTCMD_RECOVERY);  
  51.         setenv ("bootdelay", "0");  
  52.     } else  
  53.     if(keystate == (0x1 | 0x4) || second_boot_info != 0 || partition_check()) { //(8)、按键进入卡升级模式;  
  54.         // 2nd boot  
  55.         printf("BOOTLOADER - 2ND BOOT DEVICE\n");  
  56.         boot_symbol=1;  
  57.         INF_REG2_REG =0x8;  
  58.         setenv ("bootcmd", CONFIG_BOOTCOMMAND);  
  59.         setenv ("reserved", CONFIG_BOOTCMD_FUSE_RELEASE);  
  60.         setenv ("bootdelay", "0");  
  61.     } else { //(9)、正常启动;  
  62.         // normal case  
  63.         char buf[10];  
  64.         sprintf(buf, "%d", CONFIG_BOOTDELAY);  
  65.         setenv ("bootdelay", buf);  
  66.     }  
  67.     INF_REG4_REG = 0;  
  68.     return 0;  
  69. }  

(1)、检查是否有DC插入;

[cpp]  view plain  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值