sns_sensor_instance_api
时间:2022-08-08 11:30:01
//
如图所示:
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 里面的