目录
[一、BP 层移植说明](#一、BP 层移植说明)
[三、Device 目录移植](#三、Device 目录移植)
一、BP 层移植说明
(1)、添加一个虚拟陀螺仪驱动
bsp/sensorhub/public/sensor_hub_sprd/public/system/sensor_driver/gyro_drivers 路径增加一个虚拟陀螺仪驱动文件夹virtual_gyro/
(2)、虚拟陀螺仪编译配置
bsp/sensorhub/public/sensor_hub_sprd/public/system/sensor_driver/gyro_drivers 路径中gyro_drivers.cmake
if(CONFIG_VIRTUAL_GYRO_LSM6DSL_AKM99018_SUPPORT)
list(APPEND SRCS
"system/sensor_driver/gyro_drivers/virtual_gyro/sensor_driver_virtual_gyro_akm99018_lsm6dsl_common.c"
"system/sensor_driver/gyro_drivers/virtual_gyro/sensor_driver_gyroscope_virtual_gyro.c"
)
endif()
Kconfig中添加宏定义
config VIRTUAL_GYRO_LSM6DSL_AKM99018_SUPPORT
bool "VIRTUAL_GYRO_LSM6DSL_AKM99018_SUPPORT"
depends on SPRD_SENSOR_HUB_SUPPORT
help
gyro virtual_gyro_lsm6dsl_akm99018 support status
bsp/sensorhub/public/project/QogirN6Pro_CH/ums9620_2h10 设置宏打开
CONFIG_VIRTUAL_GYRO_LSM6DSL_AKM99018_SUPPORT=y
(3)、虚拟陀螺仪info添加
bsp/sensorhub/public/project/QogirN6Pro_CH/ums9620_2h10/sensor_config.h
cpp
struct sensor_hw_info gyro_virtual_hw_info = {
.position = 2,
.i2c_info = {
.interface_freq = 400,
.interface_num = 0,
.slave_addr = 0x00,
.reg_addr_len = 1,
},
};
struct sensor_property_info {
char *sensor_name;
struct sensor_hw_info *info;
} sensor_property_list[]={
{"acc_lsm6dsl", &acc_qmi8658_hw_info},
{"virtual_gyro", &gyro_virtual_hw_info},
二、HAL层移植说明
(1)、虚拟陀螺仪算法库移植
vendor/sprd/modules/sensors/libsensorhub/Virtual_gyro_lib/添加虚拟陀螺仪算法库
(2)、虚拟陀螺仪算法库编译配置
vendor/sprd/modules/sensors/libsensorhub/Android.bp 中定义CPP 中用到的宏
cpp
sonng_config_module_type {
name: "libsensorhub_cc_defaults",
module_type: "cc_defaults",
config_namespace: "sensorhubcfg",
bool_variables: [
"virtual_gyro",
"akm_virtual_gyro",
],
properties: [
"cflags",
"shared_libs",
"srcs",
"local_include_dirs",
],
}
libsensorhub_cc_defaults {
name: "libsensorhub_defaults",
soong_config_variables: {
virtual_gyro: {
srcs: ["Virtual_gyro_lib/virtual_gyro_interface.cpp"],
local_include_dirs: ["Virtual_gyro_lib"],
cflags: ["-DSENSORHUB_WITH_VIRTUAL_GYROSCOPE"],
},
akm_virtual_gyro: {
shared_libs: ["libcompasshub"],
srcs: ["Virtual_gyro_lib/AKMAlgo/akm_vgyro_algo.cpp"],
cflags: ["-DSENSORHUB_SUPPORT_akm_virtual_gyro"],
},
}
}
(3)、平台端获取虚拟陀螺仪数据调用
vendor/sprd/modules/sensors/libsensorhub/Virtual_gyro_lib/virtual_gyro_interface.cpp 调用获取虚拟陀螺仪数据接口
cpp
void initVirtualGyroLib(void) {
struct magChipInfo magChipInfo = {0x00, 0x0c, 0x00};
float offset_value[3] = {0};
float fMagSP[9] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
float fmagCaPara[4] = {0.0, 0.0, 0.0, 0.5};
float pa[8] = {18.0, 25.0, 35.0, 0.025, 0.08, 0.85, 1.15, 1.4};
float pb[4] = {0.1, 0.00002, 0.0002, 0.0001};
int pc[4] = {20, 15, 10, 2};
char mag_sensor_str[MAX_MAG_STRING_SIZE];
int ret;
SH_ERR("initVirtualGyroLib ::parse mag name paramagname");
ret = parseMagSensorinfo(mag_sensor_str);
if(ret < 0) {
SH_ERR("parse mag name failed");
return;
}
#ifdef SENSORHUB_SUPPORT_akm_virtual_gyro
#if 1
if(!strcmp(mag_sensor_str, "mag_akm09918")) {
mag_type = AKM;
akm_wrapper_lib_init(&magChipInfo);
akm_wrapper_set_offset(offset_value);
return;
}
#endif
}
三、Device 目录移植
(1)、虚拟陀螺相关宏定义
device/sprd/mpool/module/vendor/sensor/main.mk
cpp
ifeq (akm_virtual_gyro, $(findstring akm_virtual_gyro, $(SENSOR_HUB_VIRTUAL_GYROSCOPE)))
SOONG_CONFIG_sensorhubcfg += akm_virtual_gyro
SOONG_CONFIG_sensorhubcfg_akm_virtual_gyro := true
endif
device/sprd/qogirn6pro/ums9620_2h10/module/sensor/md.mk
cpp
SENSOR_HUB_VIRTUAL_GYROSCOPE := akm_virtual_gyro