问题分析:
1.目前在关机流程是quickBoot 模式 最后调用逻辑是: machine_power_off->mt_power_off 最终会在mt_power_off函数的的while 循环中 通过 pmic_chrdet_status函数检测pimc的电压 来重重启机器
2 目前在关机的时候PIMC的 charldo以及vcdt pin脚是一只供电的所以关机后立马检测到有上电所以机器重启了,
3. 解决方案: 让charldo或者vcdt pin 脚变为可控 或者pmic_chrdet_status这个函数注视掉不再检测pmic电压
最终跟供应商沟通的结果:
pmic_chrdet_status函数之前系统已经重启了,在 mt_power_off 调用 hal_rtc_bbpu_pwdn函数的是否重启了,目前确认 使用软件的方法解决此Bug 在此函数中先关闭看门狗 接着使用while(1)挂起系统,后续必须让mcu重新上电 才能启动机器。即可整个导航车机使用冷启动,不进行系统休眠。实现方式如下:
1、添加修改代码开关
kernel-3.18\arch\arm\configs\8227LGO_demo_defconfig
CONFIG_FIT_FLYAUDIO_BOARD=y
CONFIG_FLYAUDIO_SHUTDOWN=y
2、添加修改的配置
kernel-3.18\drivers\misc\mediatek\rtc\mt6323\Kconfig
config FIT_FLYAUDIO_BOARD
bool "fit flyaudio board shutdown logic"
depends on MTK_RTC
default n
help
Say y open this func
config FLYAUDIO_SHUTDOWN
bool "notify MCU to shutdown"
depends on MTK_RTC
default n
help
Say y open this func
3、修改Makefile文件
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
ifeq ($(CONFIG_FIT_FLYAUDIO_BOARD), y)
ccflags-y += -I$(srctree)/drivers/watchdog/mediatek/include
ccflags-y += -DFIT_FLYAUDIO_BOARD
endif
ifeq ($(CONFIG_FLYAUDIO_SHUTDOWN), y)
ccflags-y += -DFLYAUDIO_SHUTDOWN
endif
obj-$(CONFIG_MTK_RTC) := mtk_rtc_hal.o
4、修改rtc驱动
kernel-3.18\drivers\misc\mediatek\rtc\mt6323\mtk_rtc_hal.c
#include <mt_gpio.h>
/*#include <mach/sync_write.h>
#include "mach/ext_wd_drv.h"*/
#include <mt-plat/charging.h>
#ifdef FIT_FLYAUDIO_BOARD
#include <ext_wd_drv.h>
#include <mach/wd_api.h>
#endif
#ifdef FLYAUDIO_SHUTDOWN
#include <linux/gpio.h>
#define GPIO_CHIP_BASE 881
#define GPIO_POWER_OFF 30
#endif
................................................
...............................................
void hal_rtc_bbpu_pwdn(void)
{
u16 ret_val, con;
/* disable 32K export if there are no RTC_GPIO users */
if (!(rtc_read(RTC_PDN1) & RTC_GPIO_USER_MASK)) {
con = rtc_read(RTC_CON) | RTC_CON_F32KOB;
rtc_write(RTC_CON, con);
rtc_write_trigger();
}
ret_val = hal_rtc_get_spare_register(RTC_32K_LESS);
//add by tangzhifeng@flyaudio.cm{
#ifdef FIT_FLYAUDIO_BOARD
hal_rtc_xinfo("flyaudio: close WDT, wait mcu turn off system\n");
mtk_wdt_enable(WK_WDT_DIS); //关闭看门狗
/* ****************************
* add by oumeiyin@flyaudio.cn
* notify MCU to power down
* **************************** */
#ifdef FLYAUDIO_SHUTDOWN
hal_rtc_xinfo("flyaudio: notify mcu turn off system\n");
//通过之前系统设计预留的GPIO通知MCU断ARM1的电,然后重新对ARM1上电进行冷启动,达到开关机的效果
gpio_direction_output(GPIO_CHIP_BASE+GPIO_POWER_OFF,0);
#endif
while(1); //ARM1在等待MCU重新给ARM上电进行冷启动
#endif
//}
if (!ret_val && pmic_chrdet_status() == KAL_FALSE) {
#if 0
/* 1. Set SRCLKENAs GPIO GPIO as Output Mode, Output Low */
mt_set_gpio_dir(GPIO_SRCLKEN_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_SRCLKEN_PIN, GPIO_OUT_ZERO);
/* 2. pull PWRBB low */
rtc_bbpu_pwrdown(true);
/* 3. Switch SRCLKENAs GPIO MUX function to GPIO Mode */
mt_set_gpio_mode(GPIO_SRCLKEN_PIN, GPIO_MODE_GPIO);
#endif
} else
rtc_bbpu_pwrdown(true);
}