sns_sensor_instance_api

//
如图所示:
spl07_inst_init 这个 函数是在什么地方开始执行的呢…

在这里插入图片描述
当然 对于这种确定函数在哪里调用的话,有种通用的方法:就是打印堆栈,然后分析elf 文件,就可以找的出来。但是 高通的 adsp 编译出来的 elf 文件,不知道怎样解析出来…
尝试用 objdump 或者 arm的 objdump工具 都解析不出来.
在这里插入图片描述瞬间就卡主了 ???

还好,在网上看到了一篇这个,就记录下…
看下高通的文档的
在这里插入图片描述instance 是 由 客户端(也可以是 sensor ) 创建的…

sns_sensor_init_fw

看下这个函数

sns_rc
sns_sensor_init_fw(void)
{
	.....
	sensor_cb = (sns_sensor_cb)
  {
    .struct_len = sizeof(sensor_cb),
    .get_service_manager = &get_service_manager,
    .get_sensor_instance = &get_sensor_instance,
    .create_instance = &sns_sensor_instance_init,
    .remove_instance = &sns_sensor_instance_deinit,
    .get_library_sensor = &get_library_sensor,
    .get_registration_index = &get_registration_index,
    .create_instance_v2 = &sns_sensor_instance_init_v2,
  };
  ......
}
create_instance 这个我们在点进去  看下

看下 create_instance 这个注释:
分配和初始化 sensor 的 实例
会调用 init . 不知道是 哪个 init ??? 在这里插入图片描述因为
.create_instance = &sns_sensor_instance_init,
进去看下 sns_sensor_instance_init

SNS_SECTION(".text.sns") sns_sensor_instance*
sns_sensor_instance_init(sns_sensor *sensor, uint32_t state_len)
{
  return sns_sensor_instance_init_v2(sensor, state_len, 0);
}

在看下 sns_sensor_instance_init_v2

SNS_SECTION(".text.sns") sns_sensor_instance*
sns_sensor_instance_init_v2(sns_sensor *sensor, uint32_t state_len,
    uint32_t state_len_ni)
{
 ......   //  sensor 的数量
   uint32_t sensors_cnt = fw_sensor->library->sensors.cnt;
   
....  绑定 instance.cb  
  instance->instance.cb = &instance_cb;
//  初始化 一些链表... 
//  instance->client_req_lists 为空 ,instance->data_streams 为空
 sns_isafe_list_init(&instance->client_req_lists);
  sns_isafe_list_init(&instance->data_streams);
 
//   用 instance 初始化  instance->list_entry  
  sns_isafe_list_item_init(&instance->list_entry, instance);
...... 不知道干啥的
for(uint8_t i = 0; i < ARR_SIZE(state_init); i++)
    if(NULL != state_init[i].init)
      state_init[i].init(instance, fw_sensor);

// ----   这个 会调用到 具体驱动的 
// 比如: sns_sensor_instance_api sns_see_spl07_sensor_instance_api
rv = sensor->instance_api->init(
          (sns_sensor_instance*)instance, sensor->state);
}

那么问题来了,是谁会调用呢?
spl07_sensor_set_client_request 这个函数 里面有

create_instance : 会进入上面讲的
instance = this->cb->create_instance(this,	                                  sizeof(spl07_instance_state));
rv = sensor->instance_api->init(
          (sns_sensor_instance*)instance, sensor->state);
          

更新传感器的客户端请求 (.set_client_request())
这里可以 看出 instance 是 sensor 的 实例,你有需要,我就创建…
所以 这个  也是属于  sns_sensor_api 里面的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值