高通 sensor see

编程入门 行业动态 更新时间:2024-10-08 14:42:41

<a href=https://www.elefans.com/category/jswz/34/1768455.html style=高通 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(&reg_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(&reg_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(&reg_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

本文发布于:2024-02-28 01:14:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767720.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:高通   sensor

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!