高通 sensor see"/>
高通 sensor see
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]t);for(int j = 0; j < sns_register_sensor_list[i]t; 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);}elsesns_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 sensorbool 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 listsns_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
发布评论