此添加方法,通过重启命令的参数修改RTC模块的的一个端口的一位寄存器,待重新启动后通过读取改为的值来选择进入normal模式还是factory模式。
(1)mediatek/platform/mt6582/kernel/core/include/mach/mt_rtc_hw.h文件修改:
添加代码:
#define RTC_PDN1_FACTORY (1U<<5) //将RTC_PDN1口的第五位设置成命令标志位
(2)mediatek/kernel/kernel/system.c文件修改:
在函数void arch_reset(char mode, const char *cmd)的定义内添加:
if(cmd && !strcmp(cmd,"factory")){
rtc_mark_factory();
} //cmd即adb reboot 后面的参数,当参数为factory时,通过rtc_mark_factory()修改命令标志位。
(3)mediatek/kernel/include/mach/mtk_rtc.h文件修改:
添加代码:
extern void rtc_mark_factory(void);
(4)mediatek/kernel/drivers/rtc/mtk_rtc_common.c文件修改:
添加代码:
vodi rtc_mark_factory(void)
{ unsigned long flags:
spin_lock_irqsave(&rtc)lock,flags);
hal_rtc_mark_mode("fact");
spin_unlock_irqrestore(&rtc_lock,flags);
}
(5)mediatek/platform/mt6582/kernel/drivers/rtc/mtk_rtc_hal.c文件修改:
在函数 void hal_rtc_mark_mode(const char *cmd)的定义中添加:
if(!strcmp(cmd,"fact")){
pdn1 = rtc_read(RTC_PDN1) & (~RTC_PDN1_FACTROY);
rtc_write(RTC_PDN1,pdn1 | RTC_PDN1_FACTORY);
} //真正修改标志位,置RTC_PDN1_BIT5标志位为1
以上5步,是命令发出后,手机重启前进行相关操作所涉及的修改
(6)mediatek/platform/mt6582/lk/facotry.c文件修改:
在函数 bool factory_detection(void)函数的定义中添加:
#if 1
if(Check_RTC_PDN1_bit5())
{
dprintf(INFO,"[FACTORY] reboot to factory mode \n");
g_boot_mode = FACTORY_BOOT;
Set_Clr_RTC_PDN1_bit5(false);
return TRUE;
}
#endif // 确认RTC_PDN1_bit5标志位,进入factory mode
(7)mediatek/platform/mt6582/lk/include/platform/mt_rtc.h文件修改:
添加代码:
extern void Set_Clr_RTC_PDN1_bit5(bool flag);
extern void bool Check_RTC_PDN1_bit5(void);
(8)mediatek/platform/mt6582/lk/mt_rtc.c文件修改:
添加代码:
void Set_Clr_RTC_PDN1_bit5(bool flag)
{ U16 pdn1;
rtc_writeif_unlock();
//use PDN BIT 5 for LK
pdn1 = RTC_Read(RTC_PDN1);
if (flag == true)
pdn1 = pdn1 | RTC_PDN1_FACTORY;
else if (flag == false)
pdn1 = pdn1 & ~RTC_PDN1_FACTORY;}
RTC_Write(RTC_PDN1,pdn1);
rtc_write_trigger();
}
bool Check_RTC_PDN1_bit5(void)
{
U16 pdn1;
pdn1 = RTC_Read(RTC_PDN1);
if(pdn1 & RTC_PDN1_FACTORY)
return true;
else
return false;
}
(9)最后,修改/mediatek/config/$project$/ProjectConfig.mk
添加代码: MTK_USER_ROOT_SWITCH=yes 、//打开重启开关