老化测试Gsensor失败分析

article/2025/10/6 2:53:07
在log中搜Gsensor可以看到如下:
在Y:\1\18045c1老化\bug127302c1_slog\last_log\2015-01-01-06-19-23\android\0-events-06-19-24.log中搜到如下:
行号 500 - 01-01 06:36:08.996   664  2050 I am_create_activity: [0,509924699,15,com.wingtech.runintest/.<Gsensor>Activity,NULL,NULL,NULL,268435456]
行号 504 - 01-01 06:36:09.016   664  2050 I am_focused_activity: [0,com.wingtech.runintest/.<Gsensor>Activity]
行号 505 - 01-01 06:36:09.016   664  2050 I am_focused_activity: [0,com.wingtech.runintest/.<Gsensor>Activity]
行号 506 - 01-01 06:36:09.016   664  1184 I am_restart_activity: [0,509924699,15,com.wingtech.runintest/.<Gsensor>Activity]
行号 507 - 01-01 06:36:09.026   664  1184 I am_focused_activity: [0,com.wingtech.runintest/.<Gsensor>Activity]
行号 508 - 01-01 06:36:09.086  2158  2158 I am_on_performance: [0,com.wingtech.runintest.<Gsensor>Activity, onCreate cost 56ms]
行号 509 - 01-01 06:36:09.116  2158  2158 I am_on_resume_called: [0,com.wingtech.runintest.<Gsensor>Activity]
行号 510 - 01-01 06:36:09.116  2158  2158 I am_on_performance: [0,com.wingtech.runintest.<Gsensor>Activity, onResume cost 16ms]
行号 511 - 01-01 06:36:09.307   664   690 I am_activity_launch_time: [0,509924699,com.wingtech.runintest/.<Gsensor>Activity,303,303]
行号 513 - 01-01 06:36:19.016   664  1116 I am_finish_activity: [0,509924699,15,com.wingtech.runintest/.<Gsensor>Activity,app-request]
行号 516 - 01-01 06:36:19.026   664  1116 I am_pause_activity: [0,509924699,com.wingtech.runintest/.<Gsensor>Activity]
行号 517 - 01-01 06:36:19.036  2158  2158 I am_on_paused_called: [0,com.wingtech.runintest.<Gsensor>Activity]
行号 532 - 01-01 06:36:19.687   664   685 I am_destroy_activity: [0,509924699,15,com.wingtech.runintest/.<Gsensor>Activity,finish-imm]

看到onResume到onDestroy的时间间隔
06:36:09.016 
06:36:19.016
上层代码确实做了10S的延时,只需要看这期间的代码即可查找问题

在Y:\1\18045c1老化\bug127302c1_slog\last_log\2015-01-01-06-19-23\android\0-main-06-19-24.log中搜到

行号 27003 - 01-01 06:36:09.116  2158  2158 D SensorManager: registerListenerImpl add first sensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} to listener:com.wingtech.runintest.<Gsensor>Activity@30c581a2 result false
这里有minDelay=10000好怀疑,刚好是上层测试循环的10S,还是比较危险的


再搜索SensorManager如下:
01-01 06:36:09.106  2158  2158 D SensorManager: enableSensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} enableSensorOk: -1
01-01 06:36:09.106  2158  2158 D SensorManager: addSensor enableSensor{Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} delayUs:200000 reservedFlags:0 maxBatchReportLatencyUs:0 enableSenorOk:-1
01-01 06:36:09.106  2158  2158 D SensorManager: removeSensor sensor:{Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} disable:false
01-01 06:36:09.116  2158  2158 D SensorManager: registerListenerImpl add first sensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} to listener:com.wingtech.runintest.GsensorActivity@30c581a2 result false

可以看出在enableSensor的时候返回-1
而打印正确情况下是如下的:
D/SensorManager( 2861): enableSensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} enableSensorOk: 0

D/SensorManager( 2861): addSensor enableSensor{Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} delayUs:20000 reservedFlags:0 maxBatchReportLatencyUs:0 enableSenorOk:0

D/SensorManager( 2861): registerListenerImpl add first sensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} to listener:com.sprd.validationtools.itemstest.GsensorTestActivity$2@2364efb9 result true

D/SensorManager( 2861): registerListenerImpl bind queue and listener com.sprd.validationtools.itemstest.GsensorTestActivity$2@2364efb9

可以看出在SensorManager这步就错了

查看SensorManager上面的log如下:
01-01 06:36:09.106   664   681 D Sensors : activate handle=0; drv=0
01-01 06:36:09.106   664   681 E Sensors : SensorBase: write_attr failed to open /sys/class/input/input-1/enable (No such file or directory)
01-01 06:36:09.106   664   681 E Sensors : BmaSensor: write sysfs failed (No such file or directory)
01-01 06:36:09.106   664   681 E SensorService: Error activating sensor 0 (Operation not permitted)

这里可以看到是Sensors错误

查找kernel层搜索fail
01-01 06:19:24.388 <6>[    4.353179] c0 input: input_alsps as /devices/virtual/input/input2
01-01 06:19:24.388 <3>[    4.669799] c0 IicWriteData() error -1
01-01 06:19:24.388 <3>[    4.669830] c0 IicWriteData() nSlaveId= 0x59  
01-01 06:19:24.388 <3>[    4.669830] c0 IicWriteData() pBuf[0]= 0x45
01-01 06:19:24.388 <6>[    4.874114] c0 kionix_accel 2-000e: <kionix_accel_probe> start L2459.
01-01 06:19:24.388 <3>[    4.874572] c0 kionix_accel 2-000e: kionix_accel_probe: unsupported device, who am i = 15. Abort.
01-01 06:19:24.388 <3>[    4.874633] c0 kionix_accel 2-000e: <kionix_accel_probe> probe fail L2748.
01-01 06:19:24.388 <4>[    4.874725] c0 kionix_accel: probe of 2-000e failed with error 15

可以看到kionix_accel_probe: unsupported device, who am i = 15. Abort.

查看代码W:\18045c1\wingcust\wt18045hd\t18045c1\wt_driver\kernel\drivers\input\misc\kionix_accel_alpha.c
对应代码如下:
static int kionix_accel_probe(struct i2c_client *client,
                 const struct i2c_device_id *id)
{
    ...
    err = kionix_verify(acceld);
    ...
    g_chip_id=err;
    ...
    switch (err) {
        case KIONIX_ACCEL_WHO_AM_I_KXTE9:
            ...
            break;
        case KIONIX_ACCEL_WHO_AM_I_KXTF9:
        case KIONIX_ACCEL_WHO_AM_I_KXTI9_1001:
        case KIONIX_ACCEL_WHO_AM_I_KXTIK_1004:
        case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1005:
            ...
            break;
        case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1007:
        case KIONIX_ACCEL_WHO_AM_I_KXCJ9_1008:
        case KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009:
        case KIONIX_ACCEL_WHO_AM_I_KXCJK_1013:
            ...
            break;
        case KIONIX_ACCEL_WHO_AM_I_KX023:
            ...
            break;
        default:
            KMSGERR(&acceld->client->dev, \
                    "%s: unsupported device, who am i = %d. Abort.\n", __func__, err);
            goto err_accel_pdata_exit;
    }
    ...
}

#define ACCEL_WHO_AM_I        0x0F

static int kionix_verify(struct kionix_accel_driver *acceld)
{
    int retval = i2c_smbus_read_byte_data(acceld->client, ACCEL_WHO_AM_I);
    ...
    return retval;
}

原因分析:
由以上可以明确:通过I2C读取到的芯片ID号为unsupported device,考虑问题为偶现,
可以确定,该芯片存在获取ID号不稳定的问题。

结论与建议:
问题出在获取芯片的ID号错误,走了出错流程。请找厂家解决该问题,谢谢!
1)请厂家更新gsensor的固件并做压力测试验证确保读取芯片ID号一致。

2)如果确定使用具体ID的芯片,也可以不读取ID识别,直接走后面流程代码(前提是保证没有其他问题)。 



补充一部分Sensor到底层的问题确定:

查看SensorManager上面的log如下:
01-01 06:36:09.106   664   681 D Sensors : activate handle=0; drv=0
01-01 06:36:09.106   664   681 E Sensors : SensorBase: write_attr failed to open /sys/class/input/input-1/enable (No such file or directory)
01-01 06:36:09.106   664   681 E Sensors : BmaSensor: write sysfs failed (No such file or directory)
01-01 06:36:09.106   664   681 E SensorService: Error activating sensor 0 (Operation not permitted)

这里可以看到是Sensors错误
正确的log是如下:
01-01 10:26:17.122   671   692 D Sensors : activate handle=0; drv=0
01-01 10:26:17.122   671   692 D Sensors : BmaSensor: Enable set 1
01-01 10:26:17.122   671   692 D Sensors : AccSensor: set EVIOCSCLOCKID = 1
01-01 10:26:17.122   671   692 D Sensors : BmaSensor: mEnabled = 1
01-01 10:26:17.122  1198  1257 W art     : Suspending all threads took: 118.682ms
01-01 10:26:17.132   671   692 D SensorManager: enableSensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} enableSensorOk: 0
01-01 10:26:17.142   671   692 D SensorManager: addSensor enableSensor{Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} delayUs:66667 reservedFlags:0 maxBatchReportLatencyUs:0 enableSenorOk:0
01-01 10:26:17.152   671   692 D SensorManager: registerListenerImpl add first sensor {Sensor name="Devices 3-axis Accelerometer", vendor="Spreadtrum Accelerometer", version=1, type=1, maxRange=19.6133, resolution=0.009576807, power=0.7, minDelay=10000} to listener:com.android.internal.policy.impl.WindowOrientationListener$SensorEventListenerImpl@5a62006 result true
01-01 10:26:17.152   671   692 D SensorManager: registerListenerImpl bind queue and listener com.android.internal.policy.impl.WindowOrientationListener$SensorEventListenerImpl@5a62006
继续搜索BmaSensor查看代码,位于Acc_Sensor.cpp下
路径如W:\18045c3\wingcust\wt18045\base\driver_base\vendor\sprd\open-source\libs\libsensors_sprd\Acc_Sensor.cpp

int AccSensor::GetDevName(const char *path,char *devname)
{
        int fd, amt;

        fd = open(path, O_RDWR/*O_RDONLY*/);
        if (fd < 0) {
                ALOGE("SensorBase: write_attr failed to open %s (%s)",
                      path, strerror(errno));
                return -1;
        }
        amt = read(fd, devname, 8);
        amt = ((amt == -1) ? -errno : 0);
        ALOGE_IF(amt < 0, "SensorBase: read failed to write %s (%s)",
                 path, strerror(errno));
        close(fd);
        return amt;
}
再往上看,看到最初出现失败的地方如下:
01-01 06:19:32.864   664   664 E Sensors : couldn't find 'accelerometer' input device
01-01 06:19:32.864   664   664 I Sensors : err[11] i[0] ev_name[sci-keypad] InputName[accelerometer].
01-01 06:19:32.864   664   664 I Sensors : err[9] i[1] ev_name[input_tp] InputName[accelerometer].
01-01 06:19:32.864   664   664 I Sensors : err[12] i[2] ev_name[input_alsps] InputName[accelerometer].
01-01 06:19:32.864   664   664 I Sensors : err[17] i[3] ev_name[headset-keyboard] InputName[accelerometer].
01-01 06:19:32.905   664   664 E Sensors : SensorBase: write_attr failed to open /sys/class/input/input-1/vendor_name (No such file or directory)
01-01 06:19:32.905   664   664 E Sensors : Acc Sensor: GetDevName Failed

搜索couldn't find在vendor/sprd/open-source/libs/libSensors/SensorBase.cpp
int SensorBase:penInput(const char *inputName)
{
        int fd = -1;
        const char *dirname = "/dev/input";
        char devname[PATH_MAX];
        char *filename;
        DIR *dir;
        struct dirent *de;
        dir = opendir(dirname);
        if (dir == NULL)
                return -1;
        strcpy(devname, dirname);
        filename = devname + strlen(devname);
        *filename++ = '/';
        while ((de = readdir(dir))) {
                if (de->d_name[0] == '.' &&
                    (de->d_name[1] == '\0' ||
                     (de->d_name[1] == '.' && de->d_name[2] == '\0')))
                        continue;
                strcpy(filename, de->d_name);
                fd = open(devname, O_RDONLY);
                if (fd >= 0) {
                        char name[80];
                        if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
                                name[0] = '\0';
                        }
                        if (!strcmp(name, inputName)) {
                                strcpy(input_name, filename);
                                break;
                        } else {
                                close(fd);
                                fd = -1;
                        }
                }
        }
        closedir(dir);
        ALOGE_IF(fd < 0, "couldn't find '%s' input device", inputName);
        return fd;
}
从上面可以看出fd = open(devname, O_RDONLY);打开设备节点失败

adb shell打开设备查看dev/input/下ll全是event

使用getevent获取
root@Q327:/ # getevent
getevent
add device 1: /dev/input/event0
  name:     "sci-keypad"
add device 2: /dev/input/event3
  name:     "headset-keyboard"
add device 3: /dev/input/event2
  name:     "input_alsps"
add device 4: /dev/input/event1
  name:     "input_tp"
没有accelerometer的节点

正常情况下的是
root@Q327:/ # getevent
getevent
add device 1: /dev/input/event0
  name:     "sci-keypad"
add device 2: /dev/input/event4
  name:     "headset-keyboard"
add device 3: /dev/input/event2
  name:     "input_alsps"
add device 4: /dev/input/event3
  name:     "accelerometer"
add device 5: /dev/input/event1
  name:     "input_tp"

如此可以判断出设备没有注册挂载上了,需要驱动底层进行分析


http://chatgpt.dhexx.cn/article/MrpuPSUU.shtml

相关文章

MTK 9.0平台调试gsensor

MTK 9.0平台调试gsensor ----型号为&#xff1a;stk8baxx 1 查看原理图可以知道stk8baxx重力传感器 使用i2c1通道进行通讯&#xff0c;由于该重力传感器是不使用中断模式的进行触发的&#xff0c;所以不需要配置中断引脚。由此可以配置stk8baxx重力传感器的dts dts文件配置如…

APK无法识别gsensor问题剖析

APK无法识别gsensor问题的原因有很多&#xff0c;这里只是提供一条思路&#xff0c;解决现有项目遇到的问题。 1、确保驱动层可以工作。 2、打印LOGCAT数据&#xff0c;分析sensorservice流程 1、移植流程&#xff1a; 步骤&#xff1a;移植gsensor驱动&#xff0c;mc3413&am…

mtk平台gsensor,msensor方向确定方法

在gsensor和msensor驱动调试中&#xff0c;一个很重要的参数就是direction。 direction与芯片、layout和结构三者结合&#xff0c;才能最终确定该参数值。 mtk平台中该参数的示意图 在mtk10.0的kernel中提供了一个简单的调试接口&#xff0c;用于确认该参数值。 内核节点 /…

Gsensor驱动概述

本文以Bma250驱动为例子&#xff0c;详细介绍Gsensor设计的一个模板。 gsensor驱动在系统中的层次如下图所示&#xff1a; 图中包含三个部分&#xff1a;hardware,driver, input&#xff1a; n Hardware&#xff1a;其实我们可以认为Gsensor也是一个I2C设备。整个Gsens…

MTK平台Android Gsensor数据校准与数据获取

http://blog.csdn.net/morixinguan/article/details/76850600 上节,写WIFI MAC地址的时候我们已经知道,MTKAndroid系统的Gsensor校准的数据其实也是存储在NVRAM中的,Gsensor隶属于传感器系统架构。 接下来我们来看下Gsensor校准的基准图像: 那么如何来校准Gsensor的X,Y,Z三…

android g sensor,android gsensor 休眠震动唤醒功能怎么实现

一、唤醒源 设备休眠后&#xff0c;通过触发唤醒源使设备恢复正常工作模式。设备唤醒源有多种&#xff0c;对于Android设备常见的就有PowerKey、来电唤醒、Alarm唤醒等。 唤醒源的实现处于内核空间&#xff0c;本文重点讨论下PowerKey作为唤醒源的具体实现。 二、PowerKey唤醒源…

G-sensor 介绍

转自&#xff1a;http://blog.chinaunix.net/uid-29595319-id-4200772.html G-sensor G-sensor是加速度传感器&#xff0c;可以通过其来获得分别来自三个不同轴向上的加速度用以通知上层应用做出相应处理。 由于地球的引力作用&#xff0c;gsensor平放时&#xff0c;Z轴方向能…

G-sensor概述及常用概念整理【转】

本文转载自:http://www.jianshu.com/p/d471958189a0?nomobile=yesG 本文对G-sensor进行整理,先介绍G-sensor的一些基本概念,再具体讲解BOSCH、ST、ADI三家的G-sensor,其中BOSCH的G-sensor重点讲BMA222E,ST的G-sensor重点讲LIS2DH12,ADI的G-sensor具体讲ADXL362。 一、G-…

初次使用Fleck+redis订阅发布实现学习小demo

https://www.cnblogs.com/SupPilot/p/10396333.html 首先安装Fleck的程序包添加引用下面是客户端代码&#xff1a; 客户端代码&#xff1a; 运行效果&#xff1a; 遇到的问题&#xff1a; Q:通常每个套接字地址(协议/网络地址/端口)只允许使用一次 A:是因为本萌新把WebSocke…

core+Fleck+redis

1.新建core版控制台程序引用 2.初始化websocket class Program { //客户端url以及其对应的Socket对象字典 static IDictionary<string, IWebSocketConnection> dic_Sockets new Dictionary<string, IWebSocketConnection>(); static …

[c#]使用Fleck实现简单的WebSocket含兼容低版本IE

WebSocket是html5的一种协议,那么就表示要使用websocket客户端的浏览器就要支持html5。 对于不支持的使用flash去解决。 Fleck源码地址 服务端采用的是Fleck,Fleck的好处就是简单方便,作者已经进行了完整的封装,可以根据自己情况进行修改 兼容低版本IE 使用flash实现兼容低…

C#实现WebSocket(基于Fleck-服务端和WebSocketSharp-客户端)

C#实现WebSocket(基于Fleck-服务端和WebSocketSharp-客户端) 官网&#xff1a;https://github.com/sta/websocket-sharp 客户端 private void btn_Connect_Click_1(object sender, EventArgs e){Console.WriteLine("Websocket Demo");WebSocket web new WebSocket(…

C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)

前言 最近想做一个Web版的即时聊天为后面开发的各项功能做辅助&#xff0c;就需要浏览器与服务器能够实时通讯。而WebSocket这种双向通信协议&#xff0c;就很合适用来实现这种需求。 本篇文章主要解决C#如何实现WebSocket服务端和Javascript客户端基于wss协议的安全通信问题。…

Asp.Net Mvc基于Fleck开发的多人网页版即时聊天室

一、项目的核心说明 1、Fleck这个是实现websocket一个比较简单第三方组件&#xff0c;它不需要安装额外的容器。本身也就几个接口可供调用。 2、项目是基于.net framework 4.7.2 &#xff0c;在vs2019上开发的&#xff0c;没试过在低版本上运行。但是代码上没怎么用到新特性&…

winfrom+Fleck 上传文件

最近这个项目要做一个Winfrom上传Execl到服务器。 就想到之前用Fleck做的一个小功能&#xff0c;但是客户端Web端的。百度吧&#xff0c;看有没有办法&#xff0c;开始找到fw4 &#xff0c;但是要引用它的dll&#xff0c;是可以&#xff0c;继续找了会结果找到ClientWebSocket…

C#工作总结(一):Fleck的WebSocket使用

一.引子&#xff08;Foreword&#xff09; 最近公司里面要做窗体和网页交互的功能。网上找了一下资料&#xff0c;这里做一个简单的扩充和整理&#xff0c;部分内容可能是摘自其他博客&#xff0c;这里会注明出处和原文地址供大家和自己日后查阅。 二.基础知识&#xff08;Foun…

Fleck说明文档翻译

CSDN ZslLoveMiwa的博客 Fleck Fleck是一个在C#中的WebSocket服务器端的一个实现.。分支自Nugget项目, Fleck不需要任何的继承、容器亦或是需要增加的引用就可以使用。 实例 下面是一个把客户端网页发来的消息回发到客户端的服务器程序。 var server new WebSocketServer(&q…

fleck 客户端_C#中使用Fleck实现WebSocket通信简例

Fleck是一个开源的使用C#封装的WebSocket服务端工具库。 一、服务端搭建 这里选择在.net core 2.1框架下新建了一个控制台程序 在项目里使用NuGet引入Fleck包 NuGet引入Fleck包 其它方式也可以,最终引入项目里都是Fleck.dll Fleck.dll 二、服务端实例 Github上的简单例子: 简…

Fleck WebSocket使用

作为笔记存储. 最近公司有这方面的使用需求。在网上查了一些资料后。得到了想要的结果。以下记录摘抄至网上资料 1.首先,服务端。项目NuGet直接引用Fleck类库。 code: 1 //客户端url以及其对应的Socket对象字典2 IDictionary<string, IWebSocket…

车牌识别技术原理

车牌识别技术原理 车牌识别技术原理都是一样的&#xff0c;具体流程如下&#xff1a;图像捕捉与获取、车牌定位、字符分割字符识别、输出结果。不一样的是在上述环节中采用不同的技术&#xff0c;比如作为核心技术的车牌定位&#xff0c;就可能用到(1)自适应边界搜索法、(2)区…