news 2026/4/3 4:25:19

展锐ums9620e 平台软陀螺调试总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
展锐ums9620e 平台软陀螺调试总结

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。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 1:16:02

WarcraftHelper:魔兽争霸III现代化兼容解决方案

WarcraftHelper:魔兽争霸III现代化兼容解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在新系统上的兼容性…

作者头像 李华
网站建设 2026/3/22 3:06:17

Navicat Premium无限试用重置:5步轻松突破14天限制

对于数据库开发者和运维人员来说,Navicat Premium无疑是提升工作效率的利器。这款专业工具支持MySQL、PostgreSQL、MongoDB等主流数据库,其直观的图形界面和强大的功能特性深受用户青睐。然而14天的试用期限制往往让人意犹未尽,这正是我们提供…

作者头像 李华
网站建设 2026/4/3 3:56:37

Windows 11 LTSC系统应用商店恢复完整指南:企业版用户必备解决方案

Windows 11 LTSC作为专为企业环境设计的长期服务版本,默认移除了Microsoft Store等消费级功能。这虽然符合企业安全需求,但在实际使用中却带来了诸多不便。本文将为您提供一套简单高效的解决方案,让您在保留LTSC系统稳定性的同时,…

作者头像 李华
网站建设 2026/3/20 11:21:35

MZmine 3质谱数据分析从入门到精通:完整工作流指南

MZmine 3质谱数据分析从入门到精通:完整工作流指南 【免费下载链接】mzmine3 MZmine 3 source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 MZmine 3是一款功能强大的开源质谱数据分析软件,专门为代谢组学、蛋白质组学…

作者头像 李华
网站建设 2026/4/1 19:48:55

超详细版ARM汇编伪指令使用说明

ARM汇编伪指令实战精讲:从启动代码到系统优化的底层利器你有没有遇到过这样的问题——写了一段看似正确的ARM汇编代码,结果链接时报错“undefined reference”,或者程序一运行就触发总线异常?又或者在调试Cortex-M的中断向量表时&…

作者头像 李华
网站建设 2026/3/17 16:59:01

37、服务器备份与管理:Windows Server 相关工具全解析

服务器备份与管理:Windows Server 相关工具全解析 在服务器管理的工作中,备份与管理是至关重要的环节。合理的备份策略可以确保数据的安全性和可恢复性,而有效的管理工具则能提高服务器的运行效率和稳定性。本文将详细介绍 Windows Server 中的备份配置、Windows Storage S…

作者头像 李华