Mstar方案CEC启动流程

  1. 开机启动:

在android系统启动起来会调用MSrv_Control_common.cpp(该类继承与msrv,子类有MSrv_Control)中的PostVideoInit()函数(暂不跟踪系统从哪里调用该方法)

Z:\msd358_AN8.0\vendor\mstar\supernova\projects\msrv\control\src\MSrv_Control_common.cpp

BOOL MSrv_Control_common::PostVideoInit()

{

#if (CEC_ENABLE == 1)

  CECStart();

#endif

return TRUE;

}

调用了CECStart()函数:

MSrv_CEC * MSrv_Control_common::GetMSrvCEC(void)

{

MSRV_CONTROL_COMMON_INFO("%s line %d\n", __PRETTY_FUNCTION__, __LINE__);

MSrv_CEC *p = dynamic_cast<MSrv_CEC *>(m_pMSrvList[E_MSRV_CEC]);//获取对象指针

ASSERT(p);

return p;

}

void MSrv_Control_common::CECStart(void)

{

pthread_attr_t attr2;

pthread_attr_init(&attr2);

pthread_attr_setdetachstate(&attr2, PTHREAD_CREATE_DETACHED);

pthread_attr_setstacksize(&attr2, PTHREAD_STACK_SIZE);

m_stCecThreadInfo.pclass = GetMSrvCEC();

if(m_stCecThreadInfo.bActive == FALSE) //该结构体中存下MSrv_CEC的类和一个CEC线程是否启动的类

{

        if(PTH_RET_CHK(pthread_create(&m_CECThread, &attr2, GetMSrvCEC()->CECMonitor, &m_stCecThreadInfo)) != 0) //创建并启动线程,调用CECMonitor函数

{

ASSERT(0);

}

}

}

现在我们来看一下主要实现代码的MSrv_CEC.cpp,只列出主要代码,并进行注释梳理:

Z:\msd358_AN8.0\vendor\mstar\supernova\projects\msrv\common\src\MSrv_CEC.cpp

void * MSrv_CEC::CECMonitor(void *arg)

{

ST_THREAD_ARG_INFO *ptr = (ST_THREAD_ARG_INFO *)arg; //pthread_create的参数

MSrv_CEC *c_ptr = (MSrv_CEC*)ptr->pclass; //从参数中获取到对象

prctl(PR_SET_NAME, (unsigned long)"CECMonitor");//把当前线程命名为CECMonitor

c_ptr->m_pCec = mapi_interface::Get_mapi_cec();

if(c_ptr->m_pCec == NULL)

{

MSRV_CEC_ERROR("[CEC] mapi_interface::Get_mapi_cec() is NULL!\n");

}

else

{

pthread_cond_signal(&(c_ptr->m_CECCond)); //利用条件变量来唤醒阻塞线程

}

c_ptr->m_pCec->SetARC(FALSE);

MS_CEC_SETTING CEC_Setting;

memset(&CEC_Setting, 0, sizeof(CEC_Setting)); //清零

c_ptr->GetCECConfiguration(&CEC_Setting);//从数据库中获取CEC的状态

if( CEC_Setting.u8CECStatus == FALSE )

{

pthread_exit(NULL); //获取到CEC的状态为false,线程退出,函数结束

}

ptr->bActive = TRUE; //记录CEC的状态

c_ptr->m_CECInfoExtend.fCecProtocolFirstInit=FALSE;

c_ptr->CECInit();//初始化CEC相关数据

while(ptr->bActive)

{

usleep(CEC_HANDLER_POLLING_TIME);

MSrv_Control::GetMSrvCEC()->CECHandler();

}

mapi_interface::Get_mapi_cec()->CEC_Exit();

c_ptr->Finalize();

pthread_exit(NULL);

}

上述代码逻辑清晰:要注意的是,如果从数据库中获取的到CEC的状态为false,那么就会执行线程退出、函数结束。导致CEC初始化不能完整进行。那么再次使用CEC的话就会出问题。

上层app,主要调用MSrv_CEC中的SetCECConfiguration(MS_CEC_SETTING * CECSetting)来控制CEC、ARC,CECSetting参数中记录了详细的状态数据。

void MSrv_CEC::SetCECConfiguration(MS_CEC_SETTING * CECSetting)

{

if(m_pCec == NULL)

{

pthread_cond_wait(&m_CECCond, &m_CECMutex); //使用条件变量阻塞线程m_CECMutex,在CECMonitor有唤醒操作。

}

m_CECDatabase->SetCECSetting(CECSetting);//存到数据库中

if((m_CECSetting.bCECLink == FALSE)&&(CECSetting->u8CECStatus == TRUE))

{   printf("CEC_Setting.u8CECStatus2 =%d\n",CECSetting->u8CECStatus);

///CEC turn on

if((m_pCec->CEC_GetMsgCnt()) != 0 )

{

m_pCec->CEC_SetFifoIdx((m_pCec->CEC_GetFifoIdx() + m_pCec->CEC_GetMsgCnt())%(m_pCec->Get_CEC_FIFO_CNT()));

m_pCec->CEC_SetMsgCnt(0);

}

MSrv_Control::GetInstance()->CECStart(); //调用MSrv_Control_common.cpp中的CECStart()函数,就和上面逻辑一样,执行CECMonitor()方法,进行CEC初始化,注意这时候CEC的状态是true,所以不会执行线程退出动作!

}

else if(CECSetting->u8CECStatus == FALSE)

{

///CEC turn off

MSrv_Control::GetInstance()->CECStop();

}

if(OldARCStatus != NewARCStatus)

{

PostEvent(0, EV_AUDIO_MUTE, 0, 0);// report ui to unmute  msg上传到上层

}

}

之后会执行m_CECMutex线程所指向的函数。

Mstar方案CEC启动流程相关推荐

  1. 【拒绝一问就懵】之Activity的启动流程

    背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...

  2. android activity启动流程_1307页!一线大厂Android面试全套真题解析!

    /   前言   / 金九银十到了,很多读者都反映有面试的需求,所以我特地给大家准备了一点资料! 下面的题目都是大家在面试一线互联网大厂时经常遇到的面试真题和答案解析,如果大家还有其他好的题目或者好的 ...

  3. Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]

    摘要:上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程. ActivityManagerService简称AMS ...

  4. Spring Boot 应用程序启动流程分析

    SpringBoot 有两个关键元素: @SpringBootApplication SpringApplication 以及 run() 方法 SpringApplication 这个类应该算是 S ...

  5. 鸟哥的Linux私房菜(基础篇)- 第二十章、启动流程、模块管理与 Loader

    第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 系统启动其实是一项非常复杂的程序,因为核心得要侦测硬件并加载适当的驱动程序后,接下来则必须要呼叫程序来准备好系统运行的 ...

  6. ARM 之八 Cortex-M/R 内核启动过程 / 程序启动流程(基于IAR)

      在前面的文章<ARM 之 Cortex-M/R 内核启动过程 / 程序启动流程(基于ARMCC)>中已经介绍过了 Cortex-M/R 内核相关内容.这里基于 IAR 的启动流程与之前 ...

  7. 理解Tomcat架构、启动流程及其性能优化

    PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ...

  8. uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践

    Alibaba Cloud Linux 2 (原Aliyun Linux 2)是阿里云操作系统团队基于社区版 4.19 LTS 内核打造的一款针对云产品优化的下一代 Linux 操作系统发行版,不仅提 ...

  9. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

最新文章

  1. 惠普企业第三财季净利润23亿美元 同比增长914%
  2. SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案
  3. 转换时间对象和字符串对象添加时间
  4. 热部署Devtools的简单使用
  5. 在 React 工程中利用 Mota 编写面向对象的业务模型
  6. java的equals方法_Java Date equals()方法与示例
  7. 算法 matlab_MATLAB遗传算法及其实现
  8. 在docker上和ubuntu上运行InfoGAN
  9. 21天学通Java调用不存在的对象或成员变量
  10. 单片机重要组成部分还有什么,引脚封装分布知识讲解(二)
  11. 设定MyEclipse编辑代码区域文字的大小及非关键字的字体、字形和颜色
  12. matlab打开模型步骤,基于Matlab/Simulink的模型开发(连载一)
  13. Linux 视频教程 ( 猿课 )
  14. html chm用浏览器打开,解决chm文件无法使用浏览器打开的问题
  15. Android 去掉标题栏
  16. Python错误集锦:除法运算时提示ZeroDivisionError: division by zero
  17. 【ct107d】独立键盘
  18. Mezzanine 修改默认主页
  19. 生猪出售 matlab,数学建模论文-肥猪最佳销售时机问题.doc
  20. Android开发入门到实战精通 完整全套开发教程送给你

热门文章

  1. 一款数据挖掘软件——WEKA
  2. android fmod,Android利用Fmod仿QQ变声音效
  3. pngquant——一个好用的png压缩工具
  4. 华为欧拉EulerOS修改网卡名字
  5. 序列数据缺失值插补(线性插值)
  6. 企业微信群机器人每日天气提醒(shell + crontab)
  7. Sikuli 优缺点
  8. sikuli java_Sikuli--基于像素的图像识别(JAVA)
  9. TypeScript基本类型总结
  10. 十个常用网络密码的安全保护措施