关机充电line进入充电流程简要分析.doc_第1页
关机充电line进入充电流程简要分析.doc_第2页
关机充电line进入充电流程简要分析.doc_第3页
关机充电line进入充电流程简要分析.doc_第4页
关机充电line进入充电流程简要分析.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录1. 概述22. modm部分开机原因33. LK与kernel部分设置充电模式44. Android进入充电模式5i深圳国速科技有限公司1. 概述本文档将要分析手机充电模式下的流程,用android4.0的代码分析在关机时插入USB到android识别为充电模式的大致过程。主要涉及模块有高通modem部分、LK的cmdline部分、kernel的cmdline部分、android的init部分和android的charger部分。最为关键的是LK部分使启动模式进入充电模式,android才能具体的识别为充电模式。2. modm部分开机原因在USB插入时最先检测到USB插入的是PMIC,这时会触发一个上电时序,在代码执行到oemsbl_mc.c的oemsbl_shared_ram_init( )函数用于初始化共享内存时,会进入如下流程:oemsbl_shared_ram_init( ) - oemsbl_smem_store_pon_status( ) - Adjust_pwr_on_status( )最终在Adjust_pwr_on_status( )这个函数里面会根据文件hsu_chg_boot.c中的函数Get_Power_On_Composite_Event( )所得到的开机原因来判断最终的开机原因。int Adjust_pwr_on_status(int * PowerOnReason) int temp = (Pwr_Composite_Event | Pwr_Original_Composite_Event); int AdjustedPowerReason = pwr_on_status; int i;if(PM_PWR_ON_EVENT_USB_CHG & temp) / usb chg AdjustedPowerReason = PM_PWR_ON_EVENT_USB_CHG; if(PM_PWR_ON_EVENT_WALL_CHG & temp) / wall chg AdjustedPowerReason = PM_PWR_ON_EVENT_WALL_CHG; if(PM_PWR_ON_EVENT_KEYPAD & temp) / keypad AdjustedPowerReason = PM_PWR_ON_EVENT_KEYPAD;* *PowerOnReason = AdjustedPowerReason;return 0;在关机插入USB后会执行AdjustedPowerReason = PM_PWR_ON_EVENT_USB_CHG,将开机原因设置为充电模式,已经过验证不管是插入USB还是AC都是执行这一段代码。开机原因保存在共享内存后,在LK中就可以通过读取共享内存的数据获取开机原因。3. LK与kernel部分设置充电模式在进入到LK后,会执行主函数void kmain(void),在这个函数中会创建一个线程bootstrap2用于执行bootstrap2(void *arg)这个函数,bootstrap2( )中调用函数apps_init( )对app进行初始化,这个函数所调用的函数都是已经通过宏定义#define APP_START(appname)声明,bootablebootloaderlkappaboot.c中使用APP_START(aboot) .init = aboot_init, APP_END对aboot_init进行了声明。在apps_init( )中就会调用aboot_init( ),然后进入如下调用流程,aboot_init( ) - aboot_init( ) - boot_linux_from_mmc( ) - boot_linux( )在boot_linux( )中,通过以下代码判断是否需要进入充电模式,通过将pause_at_bootup赋值为1来标识是USB插入开机,在下面的代码中通过这个标识来决定是否进入充电模式。if (target_pause_for_battery_charge() = PWR_ON_EVENT_USB_CHG & enter_charging_pause) pause_at_bootup = 1;cmdline_len += strlen(battchg_pause);其中函数target_pause_for_battery_charge( )就是通过读取modem写入共享内存的数据来判断开机原因,调用流程如下:target_pause_for_battery_charge( ) target_check_power_on_reason( ) - smem_read_alloc_entry( )接下来通过如下代码将设置为充电模式的字符串char *battchg_pause = androidboot.mode=charger保存到cmdline中。最后调用entry(0, machtype, tags)通过tags将cmdline传入并启动kernel。if (pause_at_bootup) src = battchg_pause;if (have_cmdline) -dst;while (*dst+ = *src+);在通过函数void _init start_kernel(void)进入到kernel后,需要执行的函数setup_arch( )和setup_command_line( )读取boot中的cmdline,并且解析里面的信息保存到saved_command_line字符串中,qics1003kernelfsproc cmdline.c文件中的proc_cmdline_init( )会创建proc/cmdline节点输出saved_command_line中的信息,android在初始化时就会读取这个节点里面保存的启动模式。4. Android进入充电模式在进入到android后会根据LK里面所获取的cmdline来决定是否进入充电模式,首先进入qics1003systemcoreinit.c中的main( )函数开始对android进行初始化。这里会调用函数import_kernel_cmdline(0, import_kernel_nv)读取proc/cmdline节点的数据,并且通过函数import_kernel_nv( )将充电的开机原因保存在bootmode中:static void import_kernel_nv(char *name, int in_qemu)* else if (!strcmp(name,androidboot.console) strlcpy(console, value, sizeof(console); else if (!strcmp(name,androidboot.mode) strlcpy(bootmode, value, sizeof(bootmode); else if (!strcmp(name,androidboot.serialno) strlcpy(serialno, value, sizeof(serialno);*其中androidboot.mode就是在进入充电模式后会是字符串 androidboot.mode=charger。通过函数queue_builtin_action(set_init_properties_action, set_init_properties)设置android系统的属性,其中set_init_properties_action( )函数中:static int set_init_properties_action(int nargs, char *args) char tmpPROP_VALUE_MAX; if (qemu0) import_kernel_cmdline(1, import_kernel_nv); if (!strcmp(bootmode,factory) property_set(ro.factorytest, 1); else if (!strcmp(bootmode,factory2) property_set(ro.factorytest, 2); else property_set(ro.factorytest, 0); property_set(ro.serialno, serialno0 ? serialno : ); property_set(ro.bootmode, bootmode0 ? bootmode : unknown); property_set(ro.baseband, baseband0 ? baseband : unknown); property_set(ro.carrier, carrier0 ? carrier : unknown); property_set(ro.bootloader, bootloader0 ? bootloader : unknown); property_set(ro.bootupmode, bootupmode0 ? bootupmode : unknown); if (modelno0) property_set(ro.boot.modelno, modelno); property_set(ro.hardware, hardware); snprintf(tmp, PROP_VALUE_MAX, %d, revision); property_set(ro.revision, tmp); property_set(ro.emmc,emmc_boot ? 1 : 0); return 0;通过函数property_set( )设置ro.bootmode为charger,就会触发qics1003systemcoreinit.rc中定义的配置文件:on chargerclass_start charger这里会调用所有声明为class_start类的服务,在qics1003systemcorerootdirinit.qcom.rc中就配置了所需要执行的服务。service charger /charger class charger oneshotservice chg-post-boot /system/bin/sh /system/etc/init.qcom.post_boot.sh class chargeroneshot在进入到充电服务后就进入qics1003systemcorecharger.c文件中的main(int argc, char *argv),这里主要是关机状态充电图标显示、长按按键开机检测和USB拔出后的关机动作。进入到event_loop( )中。handle_input_state(charger, now) - process_key( ) - exit_offmode_charging( ) 函数实现了在充电模式下长按按键开机功能,upd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论