slpi sensor初期化


slpi_proc/ssc/sensors/ams_tmd3702/build/sns_tmd3702.scons
一.プロファイル:
if 'USES_SSC_STATIC_LIB_BUILDER' in env:
  if 'SSC_TARGET_HEXAGON' in env['CPPDEFINES']:
    env.AddSSCSU(inspect.getfile(inspect.currentframe()),
               flavor = ["hexagon"],
               register_func_name = "sns_register_tmd3702",
               binary_lib = False,
               add_island_files = tmd3702_island_enable,
               diag_ssid = "MSG_SSID_SNS_SENSOR_EXT")

 
ここではsns_をシステムに登録しましたregister_tmd 3702メソッド、モジュールが最初に呼び出されたメソッドはsns_register_tmd3702.
 
二:プログラム入口:
1.sensorモジュール入口
前にsns_と言いましたregister_tmd 3702は、モジュールが最初に呼び出される方法であり、次に、なぜそれが最初に呼び出される方法であるのかを見てみましょう.SLPIディレクトリの下にssc_があります.static_lib_builder.pyスクリプト、このスクリプトはsns_の解析を担当します.tmd3702.scons(xxx.scons)プロファイルを作成し、対応するコードを自動的に生成します.ssc_static_lib_builder.pyの中にgenerateがありますstatic_sensor_List()関数、これは静的登録を構築するsensor listです.
def generate_static_sensor_list(env, tags):
  global static_sensors
  if env.IsKeyEnable(tags) is True:
    logger.info("generate_static_sensor_list() called with %d sensors" % len(static_sensors))

    #dest = os.path.join(env.subst('${SSC_ROOT}'), 'framework', 'src')
    #if not os.path.isdir(dest) or not os.listdir(dest):
    #  return None

    if len(static_sensors) == 0:
      logger.error("There are no static sensors?!!!")
      return None

    static_sensors_file = os.path.join(env.subst('${SSC_ROOT}'),
                                       'framework', 'src', 'sns_static_sensors.c')
    dirname = os.path.dirname(static_sensors_file)
    if not os.path.exists(dirname):
      os.makedirs(dirname)
    fo = open(static_sensors_file, "w")
    fo.write("/* Autogenerated file.  Manual modification is pointless. */

") fo.write("#include \"sns_rc.h\"
") fo.write("#include \"sns_register.h\"
") fo.write("#include \"sns_types.h\"
") fo.write("
") for reg_func,reg_cnt in static_sensors: fo.write("sns_rc %s(sns_register_cb const *register_api);
" % reg_func) fo.write("
const sns_register_entry sns_register_sensor_list[] =
{
") reg_cnt_1 = -1 reg_cnt_2 = -1 reg_cnt_3 = -1 reg_cnt_4 = -1 reg_cnt_5 = -1 reg_cnt_6 = -1 ....

このコードは主に私たちのプロファイルを解析し、解析した内容をsns_に書きます.static_sensors.c、開けてみましょう(生成ファイルをコンパイルする必要があります):
/* Autogenerated file.  Manual modification is pointless. */

#include "sns_rc.h"
#include "sns_register.h"
#include "sns_types.h"

 sns_rc sns_register_suid_sensor(sns_register_cb const *register_api);
 ......
 sns_rc sns_register_tmd3702(sns_register_cb const *register_api);
......
sns_rc sns_register_vl53l1(sns_register_cb const *register_api);

const sns_register_entry sns_register_sensor_list[] =
{
 { sns_register_suid_sensor, 1},
 ......
 { sns_register_tmd3702, 1},
 ......
 { sns_fusion_sensor_register, 1},
};

const uint32_t sns_register_sensor_list_len = ARR_SIZE(sns_register_sensor_list);

以前に構成されたsns_register_tmd 3702メソッドはsns_に書かれています.static_sensors.cファイルでは、後でsns_を巡回します.register_sensor_listはsensorを1つずつ初期化します.
 
2.SLPIコールsensorモジュールエントリメソッド
 
高通が顧客に開放する入り口方法はsnsです.user_pd_init.cのsns_user_pd_Initメソッドは、ここから見てみましょう.
sns_rc sns_user_pd_init()
{
......
    
  //Map SDC TCM region
    sns_sdc_init();

    sns_osa_init();

    sns_timer_init();
    sns_fw_init(); //NO.1
    sns_heap_init_delayed();
    sns_init_done = true;
    return SNS_RC_SUCCESS;
  }
  return SNS_RC_FAILED;
}

NO.1ここでは主にframeworkを初期化します.
int
sns_fw_init(void)
{
  sns_rc rc;
  SNS_PRINTF(LOW, sns_fw_printf, "Init started");
  rc = sns_island_init();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = sns_thread_manager_init();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = sns_sensor_init_fw();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = sns_pwr_sleep_mgr_init();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = sns_pwr_scpm_mgr_init();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = sns_service_manager_init();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);

  rc = sns_sensor_instance_init_fw();
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  rc = register_static_sensors();  //NO.1
  SNS_ASSERT(SNS_RC_SUCCESS == rc);
  SNS_PRINTF(LOW, sns_fw_printf, "Init Finished");

  // Re-enable the thread manager; disabled by default in sns_thread_manager_init
  sns_thread_manager_disable(false);

  return 0;
}

NO.1 register_が呼び出されたstatic_sensorsメソッド、そしてregister_にフォローし続けますstatic_sensorsメソッド:
static sns_rc
register_static_sensors(void)
{
  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++)
    {
      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); //NO.1
      library->removing = SNS_LIBRARY_ACTIVE;
      sns_sensor_library_start(library); //NO.2

      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);
    }
  }

  return SNS_RC_SUCCESS;
}

NO.1は、tmd 3702などの以前の静的登録sensorメソッドを呼び出します.
sns_tmd3702.scons構成の方法はsns_register_tmd 3702であるため、md 3702モジュールが最初に呼び出される方法はsns_である.register_tmd3702.
NO.2対応するsns_を呼び出すsensor_api initメソッドは、後で分析を続けます.