Sensor系列之SensorDaemon与DSPS端通信过程

本文导读:

SensorDaemon服务端流程解析
Qualcomm messaging Interface(QMI)消息定义概述
Sensor架构系列之dsps架构分析

之前的文章我们知道了SensorDaemon服务端的启动以及dsps的架构及主要组成模块,今天我们继续深入挖掘下SensorDaemon与dsps具体的通信构建过程。

首先回顾下,SensorDaemon的启动过程。

1.init.qcom.sh中配置调用start_sensors启动,配置settings文件;
2.call start sensors则我们的daemon进程main方法开始执行
3.初始化sensors,sns_init_once;
4.创建服务端socket,注册sns_main_notify_cb回调
5.启动线程监听服务端数据,一旦数据达到,遍历客户端 handle,将数据发到client端

那么SensorDaemon又是怎样与DSPS端通信的呢?我们跟进sns_init_once来一探究竟。

static void sns_init_once( void )
{
  int              i;
  struct sigaction action;
  sigset_t         set;

  static const struct init_ptrs
  {
    sns_init_fcn fcn;
    const char * fcn_name;
  } init_ptrs[] = SNS_INIT_FUNCTIONS;

  static const struct opt_init_ptrs
  {
    sns_init_fcn fcn;
    const char * fcn_name;
  } opt_init_ptrs[] = SNS_INIT_OPT_FUNCTIONS;

  /* Mask of SIGALRM for use by EM */
  sigemptyset( &set );
  sigaddset( &set, SIGALRM );
  sigprocmask( SIG_SETMASK, &set, NULL );

  /* Set up the fault handler */
  action.sa_handler = sns_init_fault_hndlr;
  sigemptyset(&action.sa_mask);
  action.sa_flags = 0;
  for( i = 1; i < NSIG ; i++ )
  {
    sigaction( i, &action, &old_action[i] );
  }

  (void)sem_init( &sns_init_sem, 0, 0 );

  /* Call each module's init function */
  for( i = 0; NULL != init_ptrs[i].fcn; i++ ) {
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "initializing %s",
                             (intptr_t)init_ptrs[i].fcn_name);

    sns_init_sns_err = init_ptrs[i].fcn();
    if( SNS_SUCCESS != sns_init_sns_err ) {
      SNS_PRINTF_STRING_ERROR_2(SNS_DBG_MOD_APPS_INIT,
                                "Error %d initializing %s",
                                sns_init_sns_err,
                                (intptr_t)init_ptrs[i].fcn_name);

      return;
    }
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Waiting for %s...",
                             (intptr_t)init_ptrs[i].fcn_name);
    sem_wait( &sns_init_sem );
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Done waiting for %s",
                             (intptr_t)init_ptrs[i].fcn_name);
  }

  /* Call each module's optional init function */
  for( i = 0; NULL != opt_init_ptrs[i].fcn; i++ ) {
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "initializing %s",
                             (intptr_t)opt_init_ptrs[i].fcn_name);

    sns_init_sns_err = opt_init_ptrs[i].fcn();
    if( SNS_SUCCESS != sns_init_sns_err ) {
      SNS_PRINTF_STRING_ERROR_2(SNS_DBG_MOD_APPS_INIT,
                                "Error %d initializing %s",
                                sns_init_sns_err,
                                (intptr_t)opt_init_ptrs[i].fcn_name);
      sns_init_sns_err = SNS_SUCCESS;
      continue;
    }
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Waiting for %s...",
                             (intptr_t)opt_init_ptrs[i].fcn_name);
    sem_wait( &sns_init_sem );
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Done waiting for %s",
                             (intptr_t)opt_init_ptrs[i].fcn_name);
  }

  (void)sem_destroy( &sns_init_sem );
  SNS_PRINTF_STRING_HIGH_0(SNS_DBG_MOD_APPS_INIT,
                           "All modules initializied" );
}

之前也提到过,这个方法的主体部分就是通过定义的init_ptrs以及opt_init_ptrs指向的多个init func依次调用。

我们从log来看看这些fuction的初始化顺序。

[ 01-03 04:39:11.125 713: 713 I/] main, sensordaemon started.
[ 01-03 04:39:11.125 713: 713 I/] sensor1_init, huilin, sns_acm.c
01-03 04:39:11.125 E/Sensors: sns_debug_set_dbg_str_mask: Setting log level to 0
01-03 04:39:11.132 I/Sensors: sns_init_la.c(216):Waiting for sns_debug_test_init1...
01-03 04:39:11.132 I/Sensors: sns_init_la.c(220):Done waiting for sns_debug_test_init1
01-03 04:39:11.132 I/Sensors: sns_init_la.c(203):initializing sns_pwr_init
01-03 04:39:11.134 I/Sensors: sns_pwr.c(332):releasing wakelock
01-03 04:39:11.134 I/Sensors: sn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值