微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 52A 中断作霍尔开关,注册后开不了机器--(已解决)

52A 中断作霍尔开关,注册后开不了机器--(已解决)

时间:10-02 整理:3721RD 点击:

52A 平台,开合盖的霍尔开关 在代码中 注册了一个此中断后,升级机器,只跑到logo阶段,有电流大概60-70MA
补充: 掉电后,第二次按电源键一点反应都没有,得用FlashTool擦除下才可以 看看到上面的现象
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
void CLAM_EINT_HISR(void)
{
ilm_struct           *clam_ilm;
aux_id_struct        *aux_id_data;
//kal_pROMpt_trace(MOD_NIL,"clam_state=%d",clam_state);
   
#if defined( __CLAM1_LEVEL_LOW_OPEN__)
    if (clam_state == LEVEL_HIGH  )
#else
    if (clam_state == LEVEL_LOW)
#endif
    {
       aux_id_data = (aux_id_struct*)
        construct_local_para(sizeof(aux_id_struct), TD_CTRL);
       aux_id_data->aux_id = AUX_ID_CLAM_CLOSE;     
       DRV_BuildPrimitive(clam_ilm,
                          MOD_EINT_HISR,
                          MOD_UEM,
                          MSG_ID_AUX_ID,
                          aux_id_data);
    }
    else
    {
       aux_id_data = (aux_id_struct*)
        construct_local_para(sizeof(aux_id_struct), TD_CTRL);
       aux_id_data->aux_id = AUX_ID_CLAM_OPEN;
       DRV_BuildPrimitive(clam_ilm,
                          MOD_EINT_HISR,
                          MOD_UEM,
                          MSG_ID_AUX_ID,      
                          aux_id_data);
    }
    msg_send_ext_queue(clam_ilm);
   
    clam_state = !clam_state;
  EINT_Set_Polarity(CLAMDET_EINT_NO,clam_state);
}
#endif /*__PHONE_CLAMSHELL__*/
在aux_task_main中注册
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
   EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
   EINT_Set_HW_Debounce(AUX_EINT_NO,200);   
#endif  /*__PHONE_CLAMSHELL__*/

中断服务函数有问题?
还有在什么地方注册中断的?

另一个方法通过打LOG的方式 ,是可以看堆栈里的调用关系,应当也能看到死机的地方。

中断响应函数应该没问题,从其他平台上移过来的,在aux_task_main里面注册的

是不是一直在中断?中断得太频繁也会死机的。

你要加个软件防抖动,估计是中断太多了  系统挂掉了!

如果是这样,有个奇怪的地方
补充: 掉电后,第二次按电源键一点反应都没有,得用flashtool擦除下才可以 看看到上面的现象

EINT_SW_Debounce_Modify(LOCK_EINT_NO,50);
加这句话试试,在中断服务函数里面

#if  (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
extern kal_uint8 is_close_system;
void CLAM_EINT_HISR(void)
{
   ilm_struct           *clam_ilm;
   aux_id_struct        *aux_id_data;
   if(is_close_system==1)
    {
        return;
    }
      if (clam_state == LEVEL_LOW)
      {
         aux_id_data = (aux_id_struct*)
                                   construct_local_para(sizeof(aux_id_struct), TD_CTRL);
         aux_id_data->aux_id = AUX_ID_CLAM_CLOSE;     
         DRV_BuildPrimitive(clam_ilm,
                            MOD_EINT_HISR,
                            MOD_UEM,
                            MSG_ID_AUX_ID,
                            aux_id_data);
      }
      else
      {
         aux_id_data = (aux_id_struct*)
                                   construct_local_para(sizeof(aux_id_struct), TD_CTRL);
         aux_id_data->aux_id = AUX_ID_CLAM_OPEN;
         DRV_BuildPrimitive(clam_ilm,
                            MOD_EINT_HISR,
                            MOD_UEM,
                            MSG_ID_AUX_ID,      
                            aux_id_data);
      }
      msg_send_ext_queue(clam_ilm);
      clam_state = !clam_state;
   EINT_Set_Polarity(CLAMDET_EINT_NO,clam_state);
}
#endif
下面这一段在aux_task_main中
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
//L_Clam_State();
EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
EINT_Set_HW_Debounce(CLAMDET_EINT_NO, 5);
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 20);
#endif

is_close_system 在EntryIdleScreen的时候设置为0,在ShutdownSystemOperation中设置为1

EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
EINT_Set_HW_Debounce(CLAMDET_EINT_NO, 5);
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 20);
这3句改为
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 0);
EINT_Registration(CLAMDET_EINT_NO,KAL_FALSE,clam_state,CLAM_EINT_HISR, KAL_TRUE); 就OK了!

你这个修改 在在mingchong2005基础上这样做? 我原来的也没加 sw debounce

is_close_system 这个是自己添加默认为0 么? 我是开机阶段死掉的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top