在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"
如此可以判断出设备没有注册挂载上了,需要驱动底层进行分析