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

本文探讨了Android设备在关机充电时的流程,包括硬件逻辑和软件处理。在关机充电过程中,系统会经过UBOOT、kernel、init,并设定androidboot.mode为charger。init阶段会跳过常规启动流程,进入charger.c,显示充电画面。同时,介绍了如何初始化图形界面、处理按键事件以及更新充电状态的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

电池的基本原理;

android关机充电流程、充电画面显示;

Android开机充电流程,电池电量、低电信息是怎么处理的;

上一篇我们讲了锂电池的充放电的流程和电池的一些特性,这一节我们重点说一下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值