本文导读:
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