如何在高通平台hal 层添加宏控
一:找到cpp文件编译时会用到的mk,在 mk文件添加
调试sar sensor 的时候需要在hal 层做判断,基于项目宏控。
vendorqcomproprietarysensors-seesensors-hal-2.0Android.mk
ifeq ($(TARGET_PRODUCT), pnc560)
#添加编译信息,方便在编译结果里面确认,c和c++不同,建议看一下平台怎么写的
$(warning pxs_pnc560 sar debug!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
LOCAL_CFLAGS += -DPNC560_SAR (c)
LOCAL_CPPFLAGS += -DPNC560_SAR (c++)
endif
二:在对应的 cpp文件添加,可以添加xxx 编译错误,这样在编译的时候直接可以看到具体走的哪个判断,加速定位。
1:
#if defined(PNC560_SAR)
xxx1111 (编译提示错误方便分析)
coding.....
#else
xxx2222 (编译提示错误方便分析)
coding.....
#endif
2:
#ifdef PNC560_SAR
#else
#endif
3:错误写法
#ifdefined (PNC560_SAR)
#else
#endif
vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/sensors/sar.cpp:39:2:
error: invalid preprocessing directive
#ifdefined (PNC560_SAR)
^
vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/sensors/sar.cpp:41:1: error: unknown type name 'xxxx1111'
xxxx1111
三:编译我们的文件,需要看一下代码结构,首先找到 sar.cpp 是哪个mk/bp 文件来确认是否编译到代码的。
vendorqcomproprietarysensors-seesensors-hal-2.0Android.mk
vendorqcomproprietarysensors-seesensors-hal-2.0Android.bp
vendorqcomproprietarysensors-seeAndroid.mk
vendorqcomproprietarysensors-seeAndroid.bp
vendorqcomproprietarysensors-seebuild_configsns_vendor_board.mk
vendorqcomproprietarysensors-seesensors-hal-2.0Android.bp
cc_library_shared {
srcs: [
"framework/sensor.cpp",
"framework/ssc_sensor.cpp",
"framework/sensors_hw_module.cpp",
"sensors
sensor_factory::register_sensor(SENSOR_TYPE_PPG,
ssc_sensor::get_available_sensors
);
sensor_factory::request_datatype(SSC_DATATYPE_PPG);
return true;
#else
return false;
#endif
}
vendor/qcom/proprietary/sensors-see$ grep SNS_WEARABLES_TARGET * -nR
Android.bp:83: "-DSNS_WEARABLES_TARGET", //编译标志位使能的地方终于找到了
Android.bp:95: "-DSNS_WEARABLES_TARGET_BG",
sensordaemon/src/sensordaemon.cpp:43:#ifdef SNS_WEARABLES_TARGET_BG
sensordaemon/src/sensordaemon.cpp:571:#ifdef SNS_WEARABLES_TARGET_BG
sensordaemon/src/wrist_orientation_update.cpp:9:#ifdef SNS_WEARABLES_TARGET_BG
sensordaemon/src/wrist_orientation_update.h:9:#ifdef SNS_WEARABLES_TARGET_BG
sensors-hal-2.0/sensors/ppg.cpp:39:#ifdef SNS_WEARABLES_TARGET
test/hal_tests/sns_espplus_testapp.c:281:#ifdef SNS_WEARABLES_TARGET
wrist-ssr/wrist_trigger_ssr.cpp:9:#ifdef SNS_WEARABLES_TARGET_BG
vendorqcomproprietarysensors-seeAndroid.bp
soong_config_module_type {
name: "sns_cc_defaults",
module_type: "cc_defaults",
config_namespace: "snsconfig",
bool_variables: [
//bool变量需要用到
"isWearableTarget", //搜索此变量看一下此变量合适能够编译进来
"isPNC560",
],
properties: ["shared_libs", "cflags"],
}
sns_cc_defaults {
name: "sns_wearable_target
", //最初忘记了这个名称是如何使能的,这里是根据名称匹配最终的bp 文件
soong_config_variables: {
isWearableTarget
: {
cflags: [
"-DSNS_WEARABLES_TARGET
", // 终于找到了!参考案例做一个即可。
],
},
},
}
sns_cc_defaults {
name: "pnc560_sar_target",
soong_config_variables: {
isPNC560: {
cflags: [
"-DPNC560_SAR",
],
},
},
}
vendorqcomproprietarysensors-seesensors-hal-2.0Android.bp
cc_library_shared {
name: "sensors.ssc",
defaults: [
"sns_wearable_target
", //根据名字匹配
"pnc560_sar_target", // 咱们也写一个
],
}
PNC560_SAR 生效了吗?还没有,哪些需要编译进来,在如下部分要置为true.
vendorqcomproprietarysensors-seebuild_configsns_vendor_board.mk
ifeq ($(call is-board-platform-in-list,msm8937), true)
$(call add_soong_config_var_value,snsconfig,
isWearableTarget,true)
endif
ifeq ($(TARGET_PRODUCT
), pnc560)
$(warning pxs_pnc560 sar debug!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) //依旧需要打印调试log
$(call add_soong_config_var_value,snsconfig,isPNC560
,true
)
endif
这样一来,高通hal 部分编译宏控就搞定了,TARGET_PRODUCT 在编译中可以看到是项目名称。
五:参考如下第三种案例,用 property_get 也可以做。
vendorqcomproprietarysensors-seesensors-hal-2.0sensorsaccelerometer.cpp
static bool accelerometer_module_init()
{
sensor_factory::register_sensor(SENSOR_TYPE_ACCELEROMETER,
get_available_accel_calibrated);
sensor_factory::register_sensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED,
get_available_accel_uncalibrated);
sensor_factory::request_datatype(SSC_DATATYPE_ACCEL, false);
char debug_prop[PROPERTY_VALUE_MAX];
int enable_accel_cal = 0;
int len;
len = property_get("persist.vendor.sensors.accel_cal", debug_prop, "0");
if (len > 0) {
enable_accel_cal = atoi(debug_prop);
}
if (enable_accel_cal)
{
sensor_factory::request_datatype(SSC_DATATYPE_ACCELCAL, false);
}
return true;
}
六:最后回顾一下。
#if、#ifdef、#if defined之间的区别
#if的使用说明
#if的后面接的是表达式
#if (MAX==10)||(MAX==20)
code...
#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)
#if defined的使用
#if后面接的是一个宏。
#if defined (x)
...code...
#endif
这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。
另外 #if defined(x)也可以取反,也就用 #if !defined(x)
#ifdef的使用
#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。
最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif