MTK平台修改Bootloader源代码,让Android设备一通电就自动开机

您所在的位置:网站首页 nova8关机充电自动开机 MTK平台修改Bootloader源代码,让Android设备一通电就自动开机

MTK平台修改Bootloader源代码,让Android设备一通电就自动开机

2024-01-06 16:55| 来源: 网络整理| 查看: 265

为什么要一通电就自动开机

总所周知,一台Android设备,默认情况下,插上USB供电,都是显示正在充电的电池图标,按住开机键才能开机。如果你手里只有一台手机,按住开机键去开机很容易,如果你手里有1000台手机呢?通常见于微信推广、微信站街、手游工作室、刷单工作室等,往往拥有数百台数千台手机,使用群控和脚本批量控制这些手机做一些interesting的事情。这些工作室往往使用定制的手机,手里握着全套Android源代码,这样可以方便的做很多root都做不到的事情。那么一个工作室如果有数百台手机,如果断电了,需要开机,或者需要重启,都是很痛苦的事情,如果能让这些Android手机一通电就自动开机,岂不是方便极了。那么在有全套Android源代码的情况下,如何分析代码并修改去实现这一功能呢?

思路

其实一通电就开机这个功能,和Android没什么关系,分析的时候,也不要再去看Android源代码了。首先了解一下Android设备的启动流程:

启动流程 实际上通电以后,屏幕上出现电池充电的图标,就一直停留在Bootloader这个步骤了,电池充电和屏幕显示充电的动画都是在这里面实现的,这个时候连Linux内核都还没加载,更不用说Android了。 所以要实现这个功能,首先锁定代码位置,那就是Android的Bootloader,通常是LK,代码位于bootable/bootloader/lk/。锁定了范围,只需要分析这里面的代码就行了。LK的代码量并不多,只有几千行,借助开发板使用串口打LOG调试,观察LOG输出内容,并以此为关键词在代码中搜索,定位LOG对应的代码,相信你很快就能找到方法。这里有网上找到的两篇文章,以MTK平台为例,分析了按下开机键后,由Preloader -> LK -> Kernel 的过程,结合文章中的时序图去阅读LK代码,会得到事半功倍的效果,相信你很快就能分析出来,充电的时候,代码执行到那里,按住开机键的时候,代码执行到了哪里。

深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记

MTK平台改法

有了思路以后,使用开发板串口打LOG,通电进入到充电界面后,观察串口输出的日志,用日志内容中的关键词去LK代码中搜索,进一步定位关键代码位置,通过阅读代码,bootable\bootloader\lk\platform\mt6582\boot_mode.c 中的 void boot_mode_select(void) 函数引起了我的注意,看函数名,很可能是通电以后,选择如何boot,是开机呢,还是充电呢,还是进入recovery。

void boot_mode_select(void) { int factory_forbidden = 0; // int forbid_mode; /*We put conditions here to filer some cases that can not do key detection*/ extern int kedump_mini(void) __attribute__((weak)); if (kedump_mini) { if (kedump_mini()) { mrdump_check(); return; } } if (meta_detection()) { return; } mrdump_check(); #if defined (HAVE_LK_TEXT_MENU) /*Check RTC to know if system want to reboot to Fastboot*/ if(Check_RTC_PDN1_bit13()) { printf("[FASTBOOT] reboot to boot loader\n"); g_boot_mode = FASTBOOT; Set_Clr_RTC_PDN1_bit13(false); return; } /*If forbidden mode is factory, cacel the factory key detection*/ if(g_boot_arg->sec_limit.magic_num == 0x4C4C4C4C) { if(g_boot_arg->sec_limit.forbid_mode == F_FACTORY_MODE) { //Forbid to enter factory mode printf("%s Forbidden\n",MODULE_NAME); factory_forbidden=1; } } // forbid_mode = g_boot_arg->boot_mode &= 0x000000FF; /*If boot reason is power key + volumn down, then disable factory mode dectection*/ if(mtk_detect_pmic_just_rst()) { factory_forbidden=1; } /*Check RTC to know if system want to reboot to Recovery*/ if(Check_RTC_Recovery_Mode()) { g_boot_mode = RECOVERY_BOOT; return; } /*If MISC Write has not completed in recovery mode before system reboot, go to recovery mode to finish remain tasks*/ if(unshield_recovery_detection()) { return; } ulong begin = get_timer(0); /*we put key dectection here to detect key which is pressed*/ printf("eng build\n"); printf("MT65XX_FACTORY_KEY 0x%x\n",MT65XX_FACTORY_KEY); printf("MT65XX_BOOT_MENU_KEY 0x%x\n",MT65XX_BOOT_MENU_KEY); printf("MT65XX_RECOVERY_KEY 0x%x\n",MT65XX_RECOVERY_KEY); while(get_timer(begin)sec_limit.magic_num == 0x4C4C4C4C) { if(g_boot_arg->sec_limit.forbid_mode == F_FACTORY_MODE) { //Forbid to enter factory mode printf("%s Forbidden\n",MODULE_NAME); factory_forbidden=1; } } // forbid_mode = g_boot_arg->boot_mode &= 0x000000FF; /*If boot reason is power key + volumn down, then disable factory mode dectection*/ if(mtk_detect_pmic_just_rst()) { factory_forbidden=1; } /*Check RTC to know if system want to reboot to Recovery*/ if(Check_RTC_Recovery_Mode()) { g_boot_mode = RECOVERY_BOOT; return ; } /*If MISC Write has not completed in recovery mode and interrupted by system reboot, go to recovery mode to finish remain tasks*/ if(unshield_recovery_detection()) { return ; } ulong begin = get_timer(0); /*we put key dectection here to detect key which is pressed*/ while(get_timer(begin)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3