news 2026/4/16 10:45:54

展锐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/4/16 1:45:26

Windows系统苹果设备连接优化方案

Windows系统苹果设备连接优化方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirrors/ap/Apple-Mobile-Drivers-I…

作者头像 李华
网站建设 2026/4/10 21:51:49

EdgeRemover 2025:3步彻底告别微软Edge的终极方案

EdgeRemover 2025:3步彻底告别微软Edge的终极方案 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 还在为Windows系统自带的Edge浏览器无法卸…

作者头像 李华
网站建设 2026/4/15 14:55:59

终极窗口调整工具:简单三步实现强制窗口尺寸自由

终极窗口调整工具:简单三步实现强制窗口尺寸自由 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在日常使用电脑的过程中,你是否遇到过某些软件窗口无法按需…

作者头像 李华
网站建设 2026/4/15 11:58:42

pvetools实战指南:解锁ProxMox VE隐藏潜能

pvetools实战指南:解锁ProxMox VE隐藏潜能 【免费下载链接】pvetools pvetools - 为 Proxmox VE 设计的脚本工具集,用于简化邮件、Samba、NFS、ZFS 等配置,以及嵌套虚拟化、Docker 和硬件直通等高级功能,适合系统管理员和虚拟化技…

作者头像 李华
网站建设 2026/4/16 4:25:52

抖音视频批量下载终极指南:免费高效获取喜爱内容

抖音视频批量下载终极指南:免费高效获取喜爱内容 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 抖音批量下载助手是一款专为抖音用户设计的免费视频下载工具,能够轻松批量下载用户主…

作者头像 李华
网站建设 2026/4/10 18:02:23

PowerToys Awake终极指南:3种唤醒模式完全掌控系统睡眠

PowerToys Awake终极指南:3种唤醒模式完全掌控系统睡眠 【免费下载链接】PowerToys Windows 系统实用工具,用于最大化生产力。 项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys PowerToys Awake是Windows系统下一款革命性的电源管理…

作者头像 李华