typedef struct
{
qmi_client_os_params os_params;
qmi_client_type user_handle;
qmi_client_type notifier_handle;
uint8_t svc_num;
} smgr_mr_qmi_client_if_s;
typedef struct
{
/* QMI client interface */
smgr_mr_qmi_client_if_s qmi_cl_reg;
sns_q_s msg_queue;
OS_EVENT* msg_queue_mutex_ptr;
sns_q_s req_queue;
OS_EVENT* req_queue_mutex_ptr;
} sns_smgr_mr_s;
sns_smgr_mr_msg_s* sns_smgr_mr_get_msg(void)
{
uint8_t os_err;
sns_smgr_mr_msg_s* msg_ptr = NULL;
/* ---------------------------------------------------------------------- */
sns_os_mutex_pend(sns_smgr_mr.msg_queue_mutex_ptr, 0, &os_err );
msg_ptr = (sns_smgr_mr_msg_s*) sns_q_get(&sns_smgr_mr.msg_queue);
(void)sns_os_mutex_post(sns_smgr_mr.msg_queue_mutex_ptr );
return msg_ptr;
}
sensor函数调用流程:
1.main() //sns_pd.c文件
2.coremain_main() /* Core Init for user PD */
3.qurt_elite_globalstate_init(); /* Init global state structure *///初始化的值都为0或者为NULL
4.sns_init(); //sensor init ----->接下来就是进入一个死循环,函数的主要在 init 函数中;
5.sns_profiling_init(); /* 初始化模组 */ //m模组就是sensor芯片集成到一块PCB板上
6.sns_init_once(); /* const sns_init_fcn init_ptrs[] = SNS_INIT_FUNCTIONS; //函数名放到数组里面去 */
/* SNS_INIT_FUNCTIONS = {} 一系列的sensor初始化函数,根据宏定义来的,文件在sns_init.h中 */
7.sns_heap_init(); /* sensor 堆的初始化,堆的空间大小为 512K */
8.sns_os_sigs_create(); /* 核心是调用malloc()函数来申请一个 os_FLAG_GNP 结构体类型的变量 */
9.for循环依次去执行 init_ptrs[i](); /* 该函数名数组中,存放着一些初始化函数,如:sns_init_dsps, sns_em _init, sns_smgr_init 等函数*/
10.sns_smgr_init();--> sns_os_task_create_ext(sns_smgr_task, NULL,.....);//smgr: sensors manager 通过这个函数进入sensors驱动函数;
/*
#ifdef FEATURE_MSM8960
# define SNS_INIT_FUNCTIONS \
{ sns_memmgr_init, \ // 内存管理器
sns_init_dsps, \ // 各种dsps服务的初始化
sns_em_init, \ // 事件管理器
sns_smr_init, \ // Message Router用于传递消息(resp/ind)
sns_dl_init, \ // Dynamic Loading service
sns_smgr_init, \ // Sensor Manager(核心部分)
sns_scm_init, \ // 检验管理器
sns_sam_init, \ // 算法管理器
sns_pm_test_task_init, \ //
dog_init, \
NULL }
*/
11.调用sns_os_task_create_ext()函数中的sns_smgr_task的函数,该函数初始化SMGR 模块;
12.sns_init();/* sensor 初始化 */
13.sns_init_once(); /* */
14.sns_smgr_init(); /* */
15.sns_smgr_task(); /* */
16.sns_smgr_hw_init(); /* 进行一些的ADSP初始化和sensors模块的硬件初始化;并调用sns_smgr_process_msg(void) */
17.sns_smgr_process_msg(void); /* 从消息队列中,去获取要处理的消息,并在这函数中把参数变量向下传递 ,函数遍历调用*/
SMGR_STATIC void sns_smgr_process_msg(void)
{
sns_smgr_mr_msg_s* msg_ptr;
sns_smgr_update_last_tick();
while ( NULL != (msg_ptr = sns_smgr_mr_get_msg()) )
{
sns_smgr_mr_header_s* hdr_ptr = &msg_ptr->header;
SNS_SMGR_PRINTF3(
MED, "process_msg - svc=%d msg=0x%x now=%u",
hdr_ptr->svc_num, hdr_ptr->msg_id, sns_smgr.last_tick);