高通 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].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(&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);
      }
      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(&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 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 是否是合理的

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值