ATC系统平台因为硬件电路的设计的原因没有针对充电检测管脚可控导致系统关机时要反复重启的问题

问题分析:

 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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值