slpi sensor初期化
6233 ワード
slpi_proc/ssc/sensors/ams_tmd3702/build/sns_tmd3702.scons
一.プロファイル:
ここでは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です.
このコードは主に私たちのプロファイルを解析し、解析した内容をsns_に書きます.static_sensors.c、開けてみましょう(生成ファイルをコンパイルする必要があります):
以前に構成された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メソッドは、ここから見てみましょう.
NO.1ここでは主にframeworkを初期化します.
NO.1 register_が呼び出されたstatic_sensorsメソッド、そしてregister_にフォローし続けますstatic_sensorsメソッド:
NO.1は、tmd 3702などの以前の静的登録sensorメソッドを呼び出します.
sns_tmd3702.scons構成の方法はsns_register_tmd 3702であるため、md 3702モジュールが最初に呼び出される方法はsns_である.register_tmd3702.
NO.2対応するsns_を呼び出すsensor_api initメソッドは、後で分析を続けます.
一.プロファイル:
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(®_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メソッドは、後で分析を続けます.