news 2026/5/1 9:29:18

展锐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/5/1 7:36:38

终极指南:如何用zsxq-spider轻松导出知识星球PDF电子书

终极指南:如何用zsxq-spider轻松导出知识星球PDF电子书 【免费下载链接】zsxq-spider 爬取知识星球内容,并制作 PDF 电子书。 项目地址: https://gitcode.com/gh_mirrors/zs/zsxq-spider 想要将知识星球上的精彩内容永久保存下来吗?zs…

作者头像 李华
网站建设 2026/5/1 8:55:24

高校图书馆服务升级:嵌入anything-llm提供文献帮助

高校图书馆服务升级:嵌入 AnythingLLM 提供文献帮助 在高校科研节奏日益加快的今天,一个常见的场景是:研究生面对几十篇PDF格式的前沿论文,却不知从何读起;本科生想了解某个专业概念,却发现检索结果堆满术语…

作者头像 李华
网站建设 2026/4/30 4:07:32

抖音无水印视频下载终极攻略:3种专业方案深度解析

还在为抖音视频保存烦恼吗?录屏画质差、平台水印影响观感、操作繁琐耗时,这些问题困扰着无数内容创作者。今天为您带来抖音无水印下载的完整解决方案,彻底告别传统保存方式的种种局限。 【免费下载链接】douyin_downloader 抖音短视频无水印下…

作者头像 李华
网站建设 2026/5/1 6:26:37

DeepPCB完整指南:快速掌握PCB缺陷检测开源数据集

还在为PCB缺陷检测缺乏高质量训练数据而烦恼吗?DeepPCB开源数据集为你提供工业级的解决方案!这个专为印刷电路板缺陷检测设计的开源数据集,包含1500对精心标注的图像样本,覆盖六种常见缺陷类型,帮你快速构建高精度检测…

作者头像 李华
网站建设 2026/5/1 6:26:22

image2cpp:嵌入式图像转换工具的快速入门指南

image2cpp:嵌入式图像转换工具的快速入门指南 【免费下载链接】image2cpp 项目地址: https://gitcode.com/gh_mirrors/im/image2cpp image2cpp是一款专为嵌入式开发者设计的在线图像转换工具,能够快速将任意图像转换为适用于微控制器的字节数组格…

作者头像 李华
网站建设 2026/5/1 6:27:20

智能安卓投屏革命:解锁手机与电脑无缝协同新体验

智能安卓投屏革命:解锁手机与电脑无缝协同新体验 【免费下载链接】escrcpy 📱 Graphical Scrcpy to display and control Android, devices powered by Electron. | 使用图形化的 Scrcpy 显示和控制您的 Android 设备,由 Electron 驱动。 项…

作者头像 李华