news 2026/1/14 9:28:12

展锐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/1/7 1:55:13

手把手教你挑选适合的COB封装LED灯珠品牌方案

如何科学挑选COB封装LED灯珠?从技术本质到品牌实战选型全解析为什么越来越多的高端照明项目都在用COB?如果你最近参与过商业空间、工业厂房或博物馆级别的照明设计,可能已经注意到一个趋势:传统的SMD LED正在被一种更紧凑、更高亮…

作者头像 李华
网站建设 2025/12/24 4:03:08

轻松解锁WeMod Pro:完全免费获取游戏会员功能的替代方案 [特殊字符]

想要体验WeMod Pro的全部高级功能吗?WeMod修改工具让你无需付费即可畅享游戏辅助工具的所有特权。无论你是新手玩家还是资深游戏爱好者,这款开源解决方案都能帮助你安全高效地实现游戏功能增强。 【免费下载链接】Wemod-Patcher WeMod patcher allows yo…

作者头像 李华
网站建设 2025/12/30 6:04:56

抖音批量下载实用技巧:零基础小白也能掌握的下载方法

还在为手动保存抖音视频而烦恼吗?想要一键批量下载喜欢的创作者所有作品?今天我要为你介绍一款抖音批量下载工具的详细使用指南!无论你是内容创作者、研究者还是普通用户,这款工具都能让你的视频收集工作变得轻松高效。 【免费下载…

作者头像 李华
网站建设 2026/1/12 11:19:36

终极网易云音乐美化插件:打造沉浸式播放体验

终极网易云音乐美化插件:打造沉浸式播放体验 【免费下载链接】refined-now-playing-netease 🎵 网易云音乐沉浸式播放界面、歌词动画 - BetterNCM 插件 项目地址: https://gitcode.com/gh_mirrors/re/refined-now-playing-netease 想要让你的网易…

作者头像 李华
网站建设 2026/1/8 13:34:42

全平台标签打印难题终结者:LPrint开源工具深度解析

全平台标签打印难题终结者:LPrint开源工具深度解析 【免费下载链接】lprint A Label Printer Application 项目地址: https://gitcode.com/gh_mirrors/lp/lprint 还在为不同操作系统下的标签打印兼容性问题烦恼吗?LPrint作为一款革命性的开源标签…

作者头像 李华
网站建设 2025/12/24 4:01:46

鸣潮智能自动化工具技术解析:从原理到实战的效率提升指南

鸣潮智能自动化工具技术解析:从原理到实战的效率提升指南 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves ok-w…

作者头像 李华