概述
sns_user_pd_init.c
slpi 的入口函数
sns_user_pd_init
抓取 sensor log .
可以抓到非常全的 log
但是 这里有个问题,就是 开机了,sensor 不能使用,所以这个只是适合 debug .
记录下 :
sns_fw_init.c
register_static_sensors
sns_register_cb reg_cb = (sns_register_cb)
{
.struct_len = sizeof(reg_cb),
.init_sensor = &sns_sensor_init // init sensor
};
sns_register_sensor_list[i].func(®_cb);
点进去 看下
以 icm4x6xx 举例,这样的话,我们就能知道 这个
register_api->init_sensor 就是调用的
sns_sensor_init 函数… ( 就是在 register_static_sensors 中 .init_sensor = &sns_sensor_init 这句话.)
sns_rc sns_register_icm4x6xx(sns_register_cb const *register_api)
{
/** Register Accel Sensor. */
register_api->init_sensor(
sizeof(icm4x6xx_state), &icm4x6xx_accel_sensor_api, &icm4x6xx_sensor_instance_api);
sns_sensor_init_fw 这个函数 里面还是有些东西很重要
sensor_cb 这里进行了初始化,后面会用到这个…
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,
};
这个…
sns_rc
sns_sensor_instance_init_fw(void)
{
instance_cb = (sns_sensor_instance_cb)
{
.struct_len = sizeof(instance_cb),
.get_service_manager = &get_service_manager,
.get_client_request = &get_client_request,
.remove_client_request = &remove_client_request,
.add_client_request = &add_client_request
};
return SNS_RC_SUCCESS;
}
register_static_sensors(); 注册 sensor
看下 这个 register_static_sensors
1:初始化 reg_cb
sns_register_cb reg_cb = (sns_register_cb)
{
.struct_len = sizeof(reg_cb),
.init_sensor = &sns_sensor_init
};
for(int i = 0; i < sns_register_sensor_list_len; i++)
{
SNS_PRINTF(LOW, sns_fw_printf, "Register Sensor from static list %i",
sns_register_sensor_list[i].cnt);
for(int j = 0; j < sns_register_sensor_list[i].cnt; j++) // 2222
{
sns_isafe_list_iter iter;
sns_sensor_library *library =
sns_sensor_library_init(sns_register_sensor_list[i].func, j);
sns_osa_lock_acquire(library->library_lock);
sns_register_sensor_list[i].func(®_cb);
library->removing = SNS_LIBRARY_ACTIVE;
sns_sensor_library_start(library);
sns_isafe_list_iter_init(&iter, &library->sensors, true);
if(0 == sns_isafe_list_iter_len(&iter))
{
sns_sensor_library_deinit(library);
sns_thread_manager_remove(library);
sns_osa_lock_release(library->library_lock);
sns_sensor_library_delete(library);
}
else
sns_osa_lock_release(library->library_lock);
}
}
sns_register_sensor_list_len :
ssc/framework/build/sensor_img/qdsp6/kamorta.adsp.prod2 中定义.
不知道为啥是 prod2 ?? 我看这个目录 还有个 .prod
获取到长度后, 就开始遍历…
sns_sensor_library_init
{
// malloc 内存
1: sns_sensor_library *library = sns_malloc(SNS_HEAP_ISLAND, sizeof(*library));
//Initialize a list item. 用 library 初始化 library->list_entry ??
2: sns_isafe_list_item_init(&library->list_entry, library);
3: library->sensors 变成 empty 状态?
sns_isafe_list_init(&library->sensors);
}
这个是很重要的,进行初始化 .
我们是 这样调用的
sns_sensor_library_init(sns_register_sensor_list[i].func, j);
library->register_func = register_func;
library->registration_index = registration_index;
library->removing = SNS_LIBRARY_INIT;
为 libraries 链表创建一个迭代器?
library->list_entry 这个插入到 iter 中去?
这个后续有时间再来看下 这个链表是怎么写的…
sns_isafe_list_iter_init(&iter, &libraries, false);
sns_isafe_list_iter_insert(&iter, &library->list_entry, true);
在回答 这个函数
register_static_sensors
reg_cb 上面已经进行初始化了.
sns_register_sensor_list[i].func(®_cb);
就选 一个 这个吧 { sns_register_stk3x1x, 1},
这条语句 就进入 sensor driver 里面去了 以 stk 举例
sns_rc sns_register_stk3x1x(sns_register_cb const *register_api)
register_api->init_sensor // 会执行 sns_sensor_init 函数
看下 sensor init 在干啥.
1: 判断是否是 island sensor
bool island_sensor = is_island_sensor(sensor_api, instance_api);
2: 计算大小,为后面分配内容
size_t alloc_size = sns_cstruct_extn_compute_total_size(sizeof(*sensor),2,
ALIGN_8(sizeof(struct sns_sensor_state) + state_len) + ALIGN_8(sizeof(struct sns_attribute_info)));
3:创建一个 迭代器, 遍历 libraries,( 我猜测 这个 libraries应该指的是这个 系统中所有的 sensor )
// The current library will always be at the end of the list
sns_isafe_list_iter_init(&iter, &libraries, false);
// 2: 这个 sns_sensor_library_init 会把 这个 library 放进去.
library = (sns_sensor_library*)
sns_isafe_list_iter_get_curr_data(&iter);
SNS_ASSERT(library);
4: 分配 内存. 好吧 island 内存分配方式都不一样??
if(island_sensor)
{
sensor = sns_malloc(SNS_HEAP_ISLAND, alloc_size);
}
if(NULL == sensor)
{
sensor = sns_malloc(SNS_HEAP_MAIN, alloc_size);
island_sensor = false;
}
5:初始化 一些 参数.
sensor->sensor.cb = &sensor_cb;
sensor->sensor.sensor_api = sensor_api;
sensor->sensor.instance_api = instance_api;
6: sensor attr 属性的参数的初始化?
for(uint8_t i = 0; i < ARR_SIZE(state_init); i++)
if(NULL != state_init[i].init)
state_init[i].init(sensor);
7: 初始化链表,插入到链表
sns_isafe_list_init(&sensor->sensor_instances);
sns_isafe_list_item_init(&sensor->list_entry, sensor);
sns_osa_lock_acquire(library->library_lock);
sns_isafe_list_iter_init(&iter, &library->sensors, false);
sns_isafe_list_iter_insert(&iter, &sensor->list_entry, true);
继续往下走
sns_sensor_library_start
1:遍历链表
for(sns_isafe_list_iter_init(&iter, &library->sensors, true);
NULL != sns_isafe_list_iter_curr(&iter);
sns_isafe_list_iter_advance(&iter))
2: 找到了的话,就开始执行 sensor.sensor_api->init
sns_fw_sensor *sensor = (sns_fw_sensor*)
sns_isafe_list_iter_get_curr_data(&iter);
sns_rc rc = sensor->sensor.sensor_api->init((sns_sensor*)sensor);
// 这里的 sensor.sensor_api->init 是那个函数?
// 我们在 sns_sensor_init 中设置了
// sensor->sensor.sensor_api = sensor_api;这个 sensor_api 是具体 sensor 驱动的函数. 以 sns_register_stk3x1x 举例 就是 这个 sensor 的 init 函数.
// 举个例子:
register_api->init_sensor(sizeof(stk3x1x_state),
&stk3x1x_ambient_light_sensor_api,
&stk3x1x_sensor_instance_api);
sns_sensor_api stk3x1x_ambient_light_sensor_api =
{
.struct_len = sizeof(sns_sensor_api),
.init = &stk3x1x_als_init,
......
}
就是 执行 sensor 驱动中 注册进去的 驱动的 init .
这样看的话, init 应该是 sensor 的 入口函数.
3: 获取 suid
sns_sensor_uid const *sensor_uid = sensor->sensor.sensor_api->get_sensor_uid((sns_sensor*)sensor);
4: 设置 suid 到 sns_attr
sns_attr_info_set_suid(sensor->attr_info, sensor_uid);
//
这里再来说下
sns_sensor_library_start 函数里面. 打印 suid
// 获取到 suid 后,会进行检查..
1: 打印 suid .
举个 例子:
软件中设置的 uid
#define TCS3701_ALS_SUID
{
.sensor_uid =
{
0x61, 0x6D, 0x73, 0x54, 0x43, 0x53, 0x33, 0x37,
0x30, 0x31, 0x41, 0x4C, 0x53, 0x5F, 0x5F, 0x5F
}
}
打印出来的是 :
[ 53/ 1] MSG 00:00:51.230000 SNS/Medium [ sns_sensor.c 495] Initialized new sensor b2595568 in island: 2, with SUID 5f5f5f53 4c413130 37335343 54736d61 sns_sensor.c Initialized new sensor b2595568 in island: 2, with SUID 5f5f5f53 4c413130 37335343 54736d61
是从 设置的 高位开始读取的..
// ------
SNS_PRINTF(MED, sns_fw_printf, "Initialized new sensor "SNS_DIAG_PTR
" in island: %d, with SUID %"PRIsuid,
sensor, sensor->island_operation, SNS_PRI_SUID(sensor_uid));
// 2: 软件中 会进行判定 suid 是否合法.
if(sns_sensor_uid_compare(sensor_uid, &(sns_sensor_uid){{0}}) ||
!sns_attr_svc_sensor_foreach(&suid_match, (void*)sensor_uid))
{
SNS_PRINTF(ERROR, sns_fw_printf,
"Invalid SUID for sensor " SNS_DIAG_PTR, sensor);
sns_sensor_deinit(sensor);
}
register_static_sensors 看完了,主要是 负责 注册 sensor 驱动以及加入到 sensor 链表 中去…
当然 ,以及打印 suid 以及验证 suid 是否是合理的
最后
以上就是洁净黑夜为你收集整理的高通 sensor see的全部内容,希望文章能够帮你解决高通 sensor see所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复