新素材网站,房建设计网站,百度推广引流,滨州做网站1#xff0c; 整合软陀螺和地磁驱动之前提供的驱动软陀螺驱动接口是和地磁驱动接口分开#xff0c;相当于地磁和驱动完全是独立的。HUB的驱动路径下创建一个virtual_gyro 的驱动#xff0c;分别又virtual_common.c 和 mag_acc_common.c 和.h 文件构成#xff0c; mag_acc_c…1 整合软陀螺和地磁驱动之前提供的驱动软陀螺驱动接口是和地磁驱动接口分开相当于地磁和驱动完全是独立的。HUB的驱动路径下创建一个virtual_gyro 的驱动分别又virtual_common.c 和 mag_acc_common.c 和.h 文件构成 mag_acc_common.c实现地磁和加速度enable,disable,get_data 接口然后在virtual_gyro_common.c中的实现软陀螺接口。下面是软陀螺接口一些实现例如virtual_gyro_enable()会调用enable_mag,enable_acc接口virtual_gyro_disable)会调用disable_mag,disable_acc接口同理virtual_gyro_get_data接口会调用get_mag_data()和get_acc_data() 接口。这种方式不仅浪费了sensorhub 空间还会造成接口冗余。static int virtual_gyro_sensor_enable() { if (!acc_lsm6dsl_enable() !mag_enable()) { SENSORHUB_TRACE(virtual gyro enable); enable_state[DRV_GYROSCOPE] 1; return NO_ERROR; } else SENSORHUB_TRACE(virtual gyro enable fail); } static int virtual_gyro_sensor_disable() { if (!enable_state[DRV_ACCELEROMETER]) // acc_lsm6dsl_disable(); if (!enable_state[DRV_MAGNETIC_FIELD]) mag_disable(); enable_state[DRV_GYROSCOPE] 0; SENSORHUB_TRACE(virtual gyro disable sensor successed!\n); return NO_ERROR; } static int virtual_gyro_sensor_get_data(struct sensor_data *sensor_data, uint64_t timestamp) { struct sensor_data acc_sensor_data; struct sensor_data mag_sensor_data; static struct sensor_event sensor_event_data; acc_lsm6dsl_read_data(acc_sensor_data); memcpy(sensor_event_data.data[0], acc_sensor_data.data[0], sizeof(float) * 3); mag_read_data(mag_sensor_data); memcpy(sensor_event_data.data[3], mag_sensor_data.uncali_data[0], sizeof(float) * 3); SENSORHUB_TRACE(virtual gyro raw data %f, %f, %f, %f, %f, %f, sensor_event_data.data[0], sensor_event_data.data[1], sensor_event_data.data[2], sensor_event_data.data[3], sensor_event_data.data[4], sensor_event_data.data[5]); sensor_event_data.sensor_handle GYROSCOPE; sensor_event_data.timestamp timestamp; sensor_process_base_sensor_data(sensor_event_data); return NO_ERROR; }ums9620e 平台对接口进行升级平台给virtual_gyro定义了一个公共的结构体,这个结构体的内容是mag 和acc 的接口和flag, vendor 开发商直接在mag驱动mag_init 和 acc驱动acc_init 分别给mag和acc 接口赋值即可而在virtual_gyro_common.c 分别回调初始化的接口。struct virtual_gyro_driver_func { void *mag_enable(), void *mag_disable(), void *mag_read_data(struct sensor_data *sensor_data, uint64_t timestamp), uint8_t mag_init_flag, void *acc_enable(), void *acc_disable(), void *acc_read_data(struct sensor_data *sensor_data, uint64_t timestamp), };升级后的virtual_gyro_common.c 接口实现tatic int virtual_gyro_sensor_enable() { if((!virtual_gyro_driver_func.acc_enable) || (!virtual_gyro_driver_func.mag_enable)) { SENSORHUB_TRACE(acc or mag enable is NULL); return FAIL; } virtual_gyro_driver_func.acc_enable(); virtual_gyro_driver_func.mag_enable(); enable_state[DRV_GYROSCOPE] 1; SENSORHUB_TRACE(virtual gyro enable); return NO_ERROR; } static int virtual_gyro_sensor_disable() { if((!virtual_gyro_driver_func.acc_disable) || (!virtual_gyro_driver_func.mag_disable)) { SENSORHUB_TRACE(acc or mag disable is NULL); return FAIL; } if (!enable_state[DRV_ACCELEROMETER]) virtual_gyro_driver_func.acc_disable(); if (!enable_state[DRV_MAGNETIC_FIELD]) virtual_gyro_driver_func.mag_disable(); enable_state[DRV_GYROSCOPE] 0; SENSORHUB_TRACE(virtual gyro disable sensor successed!\n); return NO_ERROR; } static int virtual_gyro_sensor_get_data(struct sensor_data *sensor_data, uint64_t timestamp) { struct sensor_data acc_sensor_data; struct sensor_data mag_sensor_data; static struct sensor_event sensor_event_data; if ((!virtual_gyro_driver_func.acc_read_data) || (!virtual_gyro_driver_func.mag_read_data)) { SENSORHUB_TRACE(acc or mag read data is NULL); return FAIL; } virtual_gyro_driver_func.acc_read_data(acc_sensor_data, timestamp); memcpy(sensor_event_data.data[0], acc_sensor_data.data[0], sizeof(float) * 3); mag_af6133e_read_data( mag_sensor_data, timestamp); memcpy(sensor_event_data.data[3], mag_gyro_data_af6133e, sizeof(float) * 3); if (mag_vendor_och_flag) { mag_och_read_data( mag_sensor_data, timestamp); memcpy(sensor_event_data.data[3], mag_gyro_data_och sizeof(float) * 3); } SENSORHUB_TRACE(ja virtual gyro raw data %f, %f, %f, %f, %f, %f\n, sensor_event_data.data[0], sensor_event_data.data[1], sensor_event_data.data[2], sensor_event_data.data[3], sensor_event_data.data[4], sensor_event_data.data[5]); sensor_event_data.sensor_handle GYROSCOPE; sensor_event_data.timestamp timestamp; sensor_process_base_sensor_data(sensor_event_data); return NO_ERROR; }2, 算法库移植主要是软陀螺算法包包括算法库计算软陀螺数据vendor/sprd/modules/sensors/libsensorhub/路径下主要是定义一软陀螺算法接口还有lib 算法库编译相关的andriod.bp 文件。3 调试过程遇到的问题算法库编译完成后刷机到手机手机会死机抓dmesg log 一直报下面的错误根据error log 大概意思sensors.unisoc.so 这个库会关联到libOcsAlgo.so 但是在odm/lib64 下面没有找到这个库。后面通过在代码路径out 下面搜索libOcsAlgo .so 是可以搜到路径是vendor/lib64 下面而其他家的mag 库路径是odm/lib64 下面这个是出问题的地方后面通过对比库编译的Andriod.bp 文件发现友商的是左边有问题的是右边进一步查找这个属性看到这个是一个定义分区的宏所以这个是问题的rootcause。