我是靠谱客的博主 知性帆布鞋,这篇文章主要介绍6. sensor调试日志,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
注 epl259x的驱动可以用于 epl2590 MN66213 MN26233TKDN - id = 0x91 MN25713EKDN - id = 0x81 8975 // 4个手势方向 - 4颗sensor排列 2219 // 4个手势方向 als 室内光照下应该为700左右 ps 底噪值应该为700左右 - *#*#3646633#*#* *#*#889988#*#* -> Hardware Testing ->Sensor ->Light/Proximity Sensor ->Ps Calibration ->Ps Calibration -> Calibration 阈值如果是(500,800),底噪700 靠近1500 远离1200 epl_sensor.ps.integration_time = EPL_PS_INTT_144; // 272 - qk dynk_low_offset = 500; // 100 - qk dynk_high_offset = 800; // 300 - qk 一、新增驱动方法一_适用androidO(示例: msensor mmc5603x) 1.添加kernel-4.4driversmiscmediateksensors-1.0magnetometermmc5603x文件夹(mmc5603x.c、mmc5603x.h、Kconfig、Makefile四个文件) st480.c st480.h Kconfig 建宏--MTK_MMC5603X Makefile 2.kernel-4.4driversmiscmediateksensors-1.0magnetometerKconfig 添加: + source "drivers/misc/mediatek/sensors-1.0/magnetometer/mmc5603x/Kconfig" 3.kernel-4.4driversmiscmediateksensors-1.0magnetometerMakefile 添加: + obj-$(CONFIG_MTK_MMC5603X) += mmc5603x/ 4.kernel-4.4archarmconfigsk39tv1_bsp_1g_debug_defconfig、k39tv1_bsp_1g_defconfig 修改 + CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y + CONFIG_MTK_MMC5603X=y 5.添加vendormicrohandmsensormmc5603x_32bit文件夹(libmemsicd5603x.so一个文件,供应商提供) 6.devicemediateksamplek39tv1_bsp_1gdevice.mk 添加,将算法库拷贝到指定目录 + #add by msensor mmc5603x + PRODUCT_COPY_FILES += vendor/microhand/msensor/mmc5603x_32bit/libmemsicd5603x.so:vendor/lib/libmemsicd5603x.so 7.devicemediateksamplek39tv1_bsp_1gProjectConfig.mk + CUSTOM_KERNEL_MAGNETOMETER=yes 二、新增驱动方法二_适用androidM/N(示例: msensor st480) 1.添加kernel-3.18driversmiscmediatekmagnetometerst480文件夹(包含st480.c、st480.h、Kconfig、Makefile四个文件) st480.c st480.h Kconfig 建宏--MTK_ST480 Makefile 2.kernel-3.18driversmiscmediatekmagnetometerKconfig 添加: + source "drivers/misc/mediatek/magnetometer/st480/Kconfig" 3.kernel-3.18driversmiscmediatekmagnetometerMakefile 添加: + obj-$(CONFIG_MTK_ST480) += st480/ 4.kernel-3.18archarmbootdtslen6737m_35_m0.dts 添加: 注:这一段没有的话(或名字不对应),会导致开机重启 cust_mag@0 { compatible = "mediatek,st480"; i2c_num = <2>; // i2c控制器2(即i2c总线2),sensor都接在控制器2上--即i2c总线2 i2c_addr = <0x0C 0 0 0>; // dws也写了一个i2c地址,到底用哪个看驱动,通常写在dws direction = <1>; // 方向 –> 唯一用到的 power_id = <0xffff>; power_vol = <0>; is_batch_supported = <0>; }; 4.1 修改dws: i2c总线数与i2c地址,驱动中会用到 I2C: MSENSOR I2C_CHANNEL_2 0x30 5.kernel-3.18archarmconfigslen6737m_35_m0_debug_defconfig、len6737m_35_m0_defconfig 修改 - #CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y + CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y + CONFIG_MTK_ST480=y 6.添加vendorlenteklibsmt6737mst480文件夹(包含st480、Android.mk、README、NOTICE) st480 是一个可执行文件---init.xxx.rc中运行的daemon进程 Android.mk 是干嘛的? README 解释信息 NOTICE 解释信息 7.devicelenteklen6737m_35_m0ProjectConfig.mk 修改: - CUSTOM_KERNEL_MAGNETOMETER = no + CUSTOM_KERNEL_MAGNETOMETER = yes 8.devicemediatekmt6735init.mt6735.rc 添加: service st480 /system/bin/st480 // 这是一个服务,服务的路径 disabled user system group system class main // 归属于main这个service,main启动时启动st480 9.devicelenteklen6737m_35_m0factory_init.project.rc 添加: service st480 /system/bin/st480 // 这是一个服务,服务的路径--应该是工厂模式用到的 disabled user system group system 10.devicemediatekcommonsepolicyfile_contexts 添加: + /system/bin/st480 u:object_r:st480_exec:s0 // 当我们添加跑一个服务的时候就需要对其添加(开放)权限?哪些进程可以访问它 11.添加devicemediatekcommonsepolicyst480.te文件 12.devicemediatekmt6735device.mk 添加: + PRODUCT_PACKAGES += st480 // 复制st480,从…到/system/bin/ 三、查看log: 1.查看上报数据 cat /proc/kmsg | grep "***" 2.查看开机串口log 从串口测试点(TXD)接线出来,用usb转串口线,配合xshell抓串口log(波特率:912600) 3.查看sensor型号: eng 版可以通过 命令查看: cat /sys/bus/platform/drivers/gsensor/chipinfo user版可以通过 命令查看: dmesg | grep "gsensor" -i // 按power键灭屏or亮屏时,会打开or关闭sensor,会有内核缓冲器会有log打出 [ 1099.329303] (0)[934:android.ui]qma6981_enable_nodata 1964 : Gsensor not in suspend gsensor_SetPowerMode!, enable_status = 1 [ 1102.168146] (0)[946:PowerManagerSer]qma6981_enable_nodata 1964 : Gsensor not in suspend gsensor_SetPowerMode!, enable_status = 0 user版可以通过 命令查看: dmesg | grep "als" -i user版可以通过 命令查看: dmesg | grep "msensor" -i user版可以通过 命令查看: dmesg | grep "gyro" -i 四、根据input子系统的调试方法: getevent -i 查看所有的input设备 getevent -t /dev/input/event4 获取gsensor往上层上报的包(封装过,加入time等信息,以16进制方式打印) 1. ps 靠近: [ 2208.288534] 0002 0002 00000001 [ 2208.288534] 0002 0001 00000003 [ 2208.288534] 0000 0000 00000000 远离: [ 2212.838044] 0002 0002 00000002 [ 2212.838044] 0002 0001 00000003 [ 2212.838044] 0000 0000 00000000 2. cat /proc/kmsg | grep "liuzhigou" <4>[ 564.973691]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa <4>[ 564.973725]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.168562]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa <4>[ 565.168588]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.368485]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa <4>[ 565.368527]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.568808]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa <4>[ 565.568851]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.599273]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0x17 <4>[ 565.599314]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x0 <4>[ 565.599982]<0> (0)[2935:kworker/0:3]liuzhigou [epl_sensor_report_ps_status]: epl_sensor.ps.data.data=18642, ps_status=0 // 靠近 <4>[ 565.630511]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xf <4>[ 565.630547]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.631129]<0> (0)[2935:kworker/0:3]liuzhigou [epl_sensor_report_ps_status]: epl_sensor.ps.data.data=17031, ps_status=1 // 远离 <4>[ 565.735292]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0x17 <4>[ 565.735316]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x0 <4>[ 565.735765]<0> (0)[2935:kworker/0:3]liuzhigou [epl_sensor_report_ps_status]: epl_sensor.ps.data.data=17468, ps_status=0 // 靠近 <4>[ 565.757034]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xf <4>[ 565.757054]<0> (0)[2935:kworker/0:3]liuzhigou epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8 <4>[ 565.757495]<0> (0)[2935:kworker/0:3]liuzhigou [epl_sensor_report_ps_status]: epl_sensor.ps.data.data=16792, ps_status=1 // 远离 五、跟读代码可知:以gsensor(mc3xxx_auto)为例 通过sys文件系统接口调试 1.架构实现 - 两个路径的节点是一样的,cat出来也是相同的,hal层走class /sys/class/misc/m_acc_misc/*** 有若干属性,可以读写操作 cat /sys/.../accenablenodata -- 不支持 echo 0/1 > 无作用 cat /sys/.../accactive -- 1(使能) echo 0 > /sys/.../accactive -- disable cat /sys/.../accdelay(不常用) cat /sys/.../accbatch(不常用) cat /sys/.../accflush(不常用) cat /sys/.../accdevnum -- 4(/dev/input/event4) 2.驱动实现 /sys/bus/platform/drivers/gsensor/*** 有若干属性,可以读写操作 * cat /sys/.../chipinfo -- MC3XXX Chip -- 直接打印MC3XXX Chip * cat /sys/.../sensordata -- 1758 0695 1b88 -- 读地址0x00 cat /sys/.../cali -- 三组校准数据 -- 第二组为校准系数,上层未下发就为0 cat /sys/.../selftest -- 空(未设置) cat /sys/.../firlen -- 0 -- 滤波长度 - 从dts获得 - 全部为0 cat /sys/.../trace -- 0x0000 -- mc3xxx_i2c_probe()把它设置为0 cat /sys/.../status -- CUST: 2 7 <-1 0> -- i2c_num direction <power_id power_vol> - 从dts获取 cat /sys/.../power -- 亮屏0x0041,灭屏0x0043 -- 读地址0x07 cat /sys/.../version -- 2.1.6 -- 打印驱动的宏 * cat /sys/.../chipid -- 7C-5F-5E-46 -- 读地址0x3C cat /sys/.../virtualz -- 不支持 * cat /sys/.../regmap -- 打印所有寄存器的值 * cat /sys/.../orientation -- 7 -- 从dts获取 echo 7 > /sys/.../orientation cat /sys/.../accuracy -- 2(精度 - 宏设置) cat /sys/.../selfcheck -- 乱码 cat /sys/.../validate -- 0(验证成功) -- 从0x3b读出pcode - 匹配mc3***系列芯片 - 验证成功返回0 cat /sys/.../pdoc -- 0(不支持 - 宏未开) 六、sensor兼容:以gsensor为例: Mtk的架构已经做了兼容,最多只能兼容5个(gsensor_init_list[5])(tpd_driver_list[20]) android5.1: 七、ps的阈值如何设定 1. androidL/M/N: kernel-3.10/drivers/misc/mediatek/alsps/epl259x/epl259x.c dynk_low_offset = 2000; //500; //100 - qk dynk_high_offset = 2300; //800; //300 - qk 将(500,800)改为(2000,2300),距离约降低三分一,写死在驱动不用dts 八、sensor数据上报有三种接口 1. 轮询上报 --最终使用 2. sys文件系统 -- 调试使用 3. ioctl接口 -- ATA (工厂模式: 同时按住音量减和电源键开机) mtk原生: 关闭轮询 - 无功能 关闭ioctl - 工厂模式无数据(音量减与电源键同时按住开机) 关闭sysfs - 有功能 bose修改hal层框架后: - 由一个进程主动读取 关闭轮询 - 有功能 关闭ioctl - 工厂模式无数据(音量减与电源键同时按住开机) 关闭sysfs - 无功能 九、调试查看log 1. hal层enable与disable时候会打印:[logcat | grep "..."] vendor/mediatek/proprietary/hardware/sensor/nusensors.cpp int sensors_poll_context_t::activate(int handle, int enabled) { ALOGD( "activate handle =%d, enable = %d",handle, enabled ); sensor编号:(kernel/.../hwmsensor.h中定义减1) accelerometer 0 magnetometer 1 orientation 2 gyroscope 3 ambient light sensor 4 proximity sensor 7 十、*#0*#测试模式调用接口: codec_37_n_baseupdatealpskstpackagesappsKSTFactoryTestsrccomkingsentimefactorytestTestSensor.java accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); lightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); distanceSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 十一、msensor异常调试步骤: 1. 安装打开APK : zhinanzhen.apk。划八校准后查看是否正常: 不管手机如何转动指针始终指北 ==>指南针转动,但并不始终指北 -->修改DTS中msensor的方向 ==>指南针不动 -->安装sensorlist.apk 查看指南针msensor是否有数据变化 ==>无数据变化 -->查看开机log,查看是否有I2C通讯报错, ==> 如i2c报错 -->用万用表检查: 芯片供电电压、连线(遇到过贴片没贴好,重贴就ok)和i2c地址 2. 如果msensor方向调整对了,当指南针方向还是不对 ==>检查gsensor是否正常工作,因为指南针会用到gsensor的数据 3. adb shell ps 查看指南针的daemon是否正常运行,如未正常运行,可adb push ;cd 到所在目录; daemon名; 手动把daemon跑起来 注: 1.eng版才有运行权限 2.cd /system/bin/; /daemon名; 运行, kill daemon; 停止 3.alps/out/target/product/magc6737m_65_n/system/bin/ 4. 如指南针方向大致正确,但上下抖动(正负3度以外),检查msensor摆件位置, 由于msensor检测磁场,旁边不能有: 带磁元件(如马达、camera)【遇到过带磁螺丝导致方向不准,换螺丝】 大电流(cpu/flash/wifi芯片/百毫安的供电电流、需距离5mm以上)【遇到过两次有大电流,改版】 如果有,需要硬件改版,将msensor挪到旁边去 十二、gsensor、msensor、gyroscope的方向调试 1. 由于这些sensor都是三轴sensor,故均有0~7 八个方向。通常写在dts,少数不规范的写死在驱动 2. 先找到小原点即芯片原点坐标(在芯片丝印上有) gsensor(3433/6981/bmc156) y __|__ | o| | |-->x |__ __| gyroscope(bmg160) x __|__ | o| y<--| | |__ __| 然后根据sensor的摆件位置,计算出sensor的方向,先把手机平方在桌面 2.1 如sensor贴在top层 y轴指向听筒位置(小圆点在右上角),方向为0 y轴指向左侧位置(小圆点在左上角),方向为1 y轴指向home位置(小圆点在左下角),方向为2 y轴指向右侧位置(小圆点在右下角),方向为3 (逆时针旋转90度,方向+1) 2.2 如sensor贴在bottom层,相应的方向:4/5/6/7 3. 由于芯片常在屏蔽罩里面,不便查看,可以由原理图与layout 查看其小原点位置: pin脚1的位置 4. 何种现象显示方向正确: gsensor : 手机界面会翻转 msensor : 安装打开指南针apk,划八校准后,不管手机如何转动指针始终指北 gyroscope: 安装需要陀螺仪的游戏apk(如打僵尸),运行游戏看是否打得准 5. 何种现象显示方向正确: 用sensorlist查看 5.1 gsensor 手机平放,z轴应为9.8,xy为0 手机竖立,y轴应为9.8,zx为0 手机侧立,x轴应为9.8,yz为0 - 正面朝左 5.2 msensor,先用正常手机如iphone找到北边 x轴指北时,x轴数据达到最大;x轴反方向指北时,x轴数据达到负的最大 y轴指北时,y轴数据达到最大;y轴反方向指北时,y轴数据达到负的最大 z轴指北时,z轴数据达到最大;z轴反方向指北时,z轴数据达到负的最大 5.3 gyroscope,假设手机有长宽高三轴 沿着手机宽轴摆动手机,x轴数据变化比另两轴大(先正后负) 沿着手机长轴摆动手机,y轴数据变化比另两轴大 沿着手机高轴摆动手机,z轴数据变化比另两轴大 6. 还可以通过sensorlist看到的xyz轴数据计算,与原本的方向计算出正确的方向 value swap X with Y reverse sign X reverse sign Y reverse sign Z 0 0 0 0 0 1 0 1 0 1 2 0 1 1 0 3 0 0 1 1 4 1 1 0 0 5 1 0 1 0 6 1 0 0 1 7 1 1 1 1 sensor调试案例: 案例一 : 兼容gsensor(mxc400x与mxc6225) 现象 : 平台 : androidL,MTK6580 步骤 : 1. 2. !!!试验这样是不是i2c地址相同的就可以再次i2c_probe epl_sensor_i2c_probe() epl_sensor_i2c_client = client; exit: epl_sensor_i2c_client = NULL; alsps_init_flag = -1; 3. 总结 : 案例二 : gsensor(qma6981)由mtk老架构改mtk新架构 现象 : 平台 : androidL,MTK6580 步骤 : 1. 思路:老的架构在模块入口platform_driver_register()注册一个平台设备,probe中注册i2c设备 新的架构在模块入口acc_driver_add()将结构题注册到list中,local_init中注册i2c设备 2.#include <accel.h> static int __init qma6981_init(void) { - platform_driver_register(&qma6981_gsensor_driver) + acc_driver_add(&qma6981_init_info); return 0; } 3. static struct sensor_init_info qma6981_init_info = { .name = QMA6981_ACC_DEV_NAME, .init = qma6981_local_init, .uninit = qma6981_local_uninit, }; 4.static int qma6981_local_init(void) { i2c_add_driver(&qma6981_i2c_driver) if(-1 == qma6981_init_flag) return -1; return 0; } 5.static int qma6981_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { - if((err = qma6981_create_attr(&qma6981_gsensor_driver.driver))) + if((err = qma6981_create_attr(&(qma6981_init_info.platform_diver_addr->driver)))) exit: + qma6981_init_flag = -1; return err; } 总结 : 案例三 : 计步器的实现 - gsensor硬件中断 现象 : 平台 : androidL,MTK6737 步骤 : 1. 2. 3. 总结 : 案例四 : 调试新msensor(mmc3630x),bin文件没有拷贝到out目录 - 修改device.mk 现象 : msensor无功能 平台 : androidN,MTK6737 排查过程: 1.在alpsvendormagcommlibsmt6737m目录创建文件夹: memsicd3630x ,内部有bin文件 : memsicd3630x 修改alpsdevicemediatekmt6735device.mk添加: PRODUCT_PACKAGES += memsicd3416x + PRODUCT_PACKAGES += memsicd3630x 2.out目录没有生成对应的bin文件:memsicd3630x android009@mht-09:~/liuzhigou/code2_37_m_base_v663_xiaoxing_k29d1_user$ find alps/out/ -name memsicd3* alps/out/target/product/magc6737m_65_c_m0/system/bin/memsicd3416x 3.修改alpsdevicemediatekmt6735device.mk添加: (注意要精确到具体文件,而不是文件夹) + PRODUCT_COPY_FILES += vendor/magcomm/libs/mt6737m/memsicd3630x/memsicd3630x:system/bin/memsicd3630x 4.out目录成功生成对应的bin文件:memsicd3630x android009@mht-09:~/liuzhigou/code2_37_m_base_v663_xiaoxing_k29d1_user$ find alps/out/ -name memsicd3* alps/out/target/product/magc6737m_65_c_m0/system/bin/memsicd3416x alps/out/target/product/magc6737m_65_c_m0/system/bin/memsicd3630x // 我们要的bin文件 处理方案: 修改device.mk 总结 : 上层的问题,及时请教上层的同事 案例三 : gsensor(qma6981) I2C不通 - 贴片没有贴好 现象 : I2C不通 平台 : androidN,MTK6737 步骤 : 1. gsensor无功能,打log,在串口log中发现 [ 13.465281] .(3)[1:swapper/0][name:qma6981&][QMA-Gsensor] I2C_TxData 271 : I2C_TxData delay! [ 13.476575] .(3)[1:swapper/0][name:i2c&]ERROR,510: id=2,addr: 12, transfer error [ 13.477594] .(3)[1:swapper/0][name:i2c&]ERROR,516: I2C_ACKERR 2. 分析:由于sensor电源为常供,无需上电,i2c不通的可能: (1)i2c地址不对 (2)硬件有问题 3. 询问FAE,确认i2c地址正确,排查硬件问题:将芯片取下,外接小板(小板上有芯片) 结果芯片工作正常 处理方案: -->把芯片重新贴好 总结 : 只有camera在i2c通讯之前要上电,其他都可以直接通讯,i2c不通只有两种可能: (1)i2c地址不对 (2)硬件有问题 案例四 : 现象 : 平台 : androidN,MTK6737 步骤 : 1. 2. 案例五 : gsensor兼容(3433 & 6981)导致功耗大(70ma) 现象 : 平台 : androidN,MTK6737 步骤 : 1. 休眠时候打log: adb shell dmesg > e:gsensor_3433_6981.log log显示由于设备(2-004c - mc3433)休眠失败,导致系统休眠失败,重新唤醒, 系统一直处于: 休眠->休眠失败->唤醒 ->休眠的循环中 [ 207.629520] (1)[1066:system_server]qma6981_suspend 2894 : liuzhigou 20171018 qma6981_suspend start [ 207.635164] (1)[1066:system_server]qma6981_suspend 2914 : liuzhigou 20171018 qma6981_suspend end [ 207.635254] (1)[1066:system_server]liuzhigou 20171018 mc3xxx_suspend start [ 207.635291] (1)[1066:system_server]dpm_run_callback(): i2c_device_pm_suspend+0x0/0x38 returns -22 [ 207.635324] (1)[1066:system_server]PM: Device 2-004c failed to suspend: error -22 [ 207.635352] (1)[1066:system_server][name:suspend&]PM: Some devices failed to suspend, or early wake event detected 2. 在mc3433的休眠函数中,添加打印log: static int mc3xxx_suspend(struct i2c_client *client, pm_message_t msg) { struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); int err = 0; if(msg.event == PM_EVENT_SUSPEND) { if(obj == NULL) { + GSE_ERR("liuzhigou 20171025 %s obj == NULLn",__FUNCTION__); return -EINVAL; } [ 116.917907] (0)[1150:system_server]liuzhigou 20171018 mc3xxx_suspend start [ 116.917926] (0)[1150:system_server]liuzhigou 20171018 mc3xxx_suspend msg.event == PM_EVENT_SUSPEND [ 116.917943] (0)[1150:system_server]liuzhigou 20171018 mc3xxx_suspend obj == NULL [ 116.917974] (0)[1150:system_server]dpm_run_callback(): i2c_device_pm_suspend+0x0/0x38 returns -22 [ 116.917996] (0)[1150:system_server]PM: Device 2-004c failed to suspend: error -22 [ 116.918016] (0)[1150:system_server]PM: Some devices failed to suspend, or early wake event detected 根据log,obj为空指针,出错判断后返回错误值 3. 根据标志位添加出错判断,如果没加载3433就直接return 0(成功),终止3433的休眠函数 static int mc3xxx_suspend(struct i2c_client *client, pm_message_t msg) { struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); int err = 0; if(msg.event == PM_EVENT_SUSPEND) { if(obj == NULL) { + if (MC3XXX_INIT_FAIL == s_nInitFlag){ + GSE_ERR("liuzhigou 20171025 %s obj == NULL MC3XXX_INIT_FAIL == s_nInitFlag n",__FUNCTION__); + return 0; + } + else{ + GSE_ERR("liuzhigou 20171025 %s obj == NULL MC3XXX_INIT_FAIL != s_nInitFlag n",__FUNCTION__); return -EINVAL; } } 总结 : 此log为正常状态: 0x4000为pmu中断 [ 147.732936] -(0)[1066:system_server][name:mt_spm_internal&][SPM] wake up byEINT, timer_out = 18724959, r13 = 0x10001000, debug_flag = 0x9f [ 147.732936] -(0)[1066:system_server][name:mt_spm_internal&][SPM] r12 = 0x20, raw_sta = 0x20, idle_sta = 0x9fa, event_reg = 0x90100000, isr = 0x0 [ 147.732936] -(0)[1066:system_server][name:mt_spm_sleep&][SPM] suspend dormant state = 0, md32_flag = 0x0, md32_flag2 = 0 [ 147.732936] -(0)[1066:system_server][name:mt_spm_sleep&][SPM] log_wakesta_index = 5 [ 147.732936] -(0)[1066:system_server][name:irq_mt_eic&]EINT_STA: [ 147.732936] -(0)[1066:system_server][name:irq_mt_eic&]EINT Module - index:192,EINT_STA = 0x4000 [ 147.732936] -(0)[1066:system_server][name:irq_mt_eic&]EINT 206 is pending [ 147.732936] -(0)[1066:system_server][name:irq_mt_eic&] [ 147.732988] -(0)[1066:system_server][name:ccci&][ccci1/mcd]Resume cldma pdn register ...11 [ 147.733070] -(0)[1066:system_server][name:irq_mt_eic&]EINT Module - expires:4294952066, jiffies:4294952065, deb_in_jiffies:1, [ 147.733091] -(0)[1066:system_server][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event [ 147.733270] (0)[1066:system_server][name:cpu&]Enabling non-boot CPUs ... [ 147.733571] -(1)[0:swapper/1]CPU1: Booted secondary processor 案例六 : ATA测试中gsensor(qma6981)无数据 - 添加init() - 原因:i2c_probe的时候没有跑init(),而正常开机在别处有init() 现象 : 正常开机有数据,ATA无数据 平台 : androidM,MTK6580 步骤 : 1. 由于ATA 是通过ioctl接口获取数据,在ioctl函数中添加log,显示读到的数据为0 2. 在qma6981_unlocked_ioctl()中获取数据之前进行初始化 switch (cmd) { case GSENSOR_IOCTL_READ_SENSORDATA: + qma6981_initialize(client); ==> ok 案例七 : CTS测试报错- 磁力传感器 - 板子上内贴 - 从配置中移除 此法不通!!!案例八 : 打开自动背光,通话贴脸灭屏后,移开无法亮屏 - 没找到死锁的地方,直接更换一份版本较新的驱动 平台 : androidN,MTK6737 步骤 : 1. 对比其他项目667,无此现象,查BOM 663 MN26233TKDN(问题项目) 667 MN25713EKDN 2. 进入"*#0*#"测试模式,交替打开als与ps,出现概率性的als无功能(数值不动) 分析怀疑是als与ps enable或disable的时候出问题 3. FAE现场支持,提供了一份最新的驱动,问题不再出现 FAE说旧驱动中有死锁,但是找不到 4. 尝试注释掉alpskernel-3.18driversmiscmediatekalspsepl259xepl259x.c static int als_enable_nodata(int en) { if(enable_als != en) { + //epl_sensor_update_mode(obj->client); } } ==>功能正常 案例九 : als概率性无功能 - 有死锁 - 没找到死锁的地方,直接更换一份版本较新的驱动 案例十 : 强光下,自动背光的亮度变化不明显,弱光下,自动背光的亮度是正常的 平台 : androidN,MTK6737 步骤 : 1. 修改als积分时间: alps/kernel-3.18/drivers/misc/mediatek/alsps/epl259x/epl259x.c - epl_sensor.als.integration_time = EPL_ALS_INTT_1024; + epl_sensor.als.integration_time = EPL_ALS_INTT_64; 案例十一 : 打开自动背光,遮挡光感,屏幕亮度无变化 - tp油墨遮挡 平台 : androidN,MTK6737 步骤 : 1. 打开"*#0*#"测试模式,查看光感上报值,值偏小 对比亮度能够自动调节的其他项目 v618_p300 : 1969 lux v663_k38 : 328 lux(问题机) 怀疑是结构遮挡,导致进光量偏少 2. 结构同事分析:是tp开孔处油墨有问题,刮开tp油墨亮度2900 lux 案例十二 : gsensor(mxc4005)ATA中z轴数据为0 - 需要factory_init.rc启动一个daemon 平台 : androidM,MTK6580 步骤 : 1. 正常开机三轴均有数据,ATA(音量减+电源键开机)中z轴数据为0 2. 新建文件夹alps/vendor/magcomm/libs/mt6580/memsicp_f_32/ 里面新增4个文件: memsicp_f_32、Android.mk、NOTICE、README 其中memsicp_f_32需要供应商提供 3. alps/device/mediatek/mt6580/device.mk + PRODUCT_PACKAGES += memsicp_f_32 4. alps/device/mediatek/mt6580/factory_init.rc + service memsicp_f_32 /system/bin/memsicp_f_32 + user system + group system + class main 总结 : 案例十三 : android8.1 sensor无法获取dts数据 -- 写死在驱动 现象 : 获取不到dts数据 平台 : androidO,MTK6737&MTK6739 步骤 : 1. 由于获取不到dts、dws的数据,无法设置i2c地址、方向,可以写死在驱动 alpskernel-4.4driversmiscmediateksensors-1.0accelerometermpu6050gmpu6050.c mpu6050_i2c_probe(struct i2c_client *client) + client->addr = 0x69; + obj->hw.direction = 0; 2. 由于获取不到dts的数据,无法设置中断脚,可以写死在驱动: alpskernel-3.18driversmiscmediateksensors-1.0alspsepl259xepl259x.c obj->irq = irq_of_parse_and_map(obj->irq_node, 0); // 通过打印log可以看出GPIO65对应irq 为353 // 通过打印log可以看出GPIO3 对应irq 为291 // 可知GPIO口的中断号是线性的 printk("obj->irq = %dn", obj->irq); + obj->irq = 291; // GPIO3 - liuzhigou add for v662 request_irq(obj->irq, epl_sensor_eint_func, IRQF_TRIGGER_NONE, "ALS-eint", NULL) 3. 后面有空再好好分析一下如何才能获取到dts数据 总结 : 案例十四 : android8.1 msensor(akm09918)无法打开算法库(libakl.so) 现象 : 指南针不转,打开sensorlist,指南针数据始终为0 平台 : androidO,MTK6739 步骤 : 1. 打印kernel log(导出mtklog或cat /dev/kmsg | grep "liuzhigou")看驱动是否有上报数据 kernel-4.4driversmiscmediateksensors-1.0magnetometermag.c int mag_data_report(struct mag_data *data) { struct sensor_event event; int err = 0; + printk("liuzhigou update!valus: %d, %d, %d, %dn" , data->x, data->y, data->z, data->status); log: -- 当打开sensorlist时,地磁数据上报正常 Line 1233: <4>[ 113.500580] (3)[67:kworker/3:1]liuzhigou update!valus: 1500, -30400, 6000, 68 Line 1241: <4>[ 113.699990] (3)[67:kworker/3:1]liuzhigou update!valus: 2400, -30000, 7100, 4 Line 1246: <4>[ 113.902548] (3)[67:kworker/3:1]liuzhigou update!valus: 300, -28000, 6000, 116 Line 1248: <4>[ 114.104571] (3)[67:kworker/3:1]liuzhigou update!valus: 1600, -29500, 8100, 100 Line 1249: <4>[ 114.300017] (3)[67:kworker/3:1]liuzhigou update!valus: 200, -28600, 5400, 4 Line 1257: <4>[ 114.500118] (3)[67:kworker/3:1]liuzhigou update!valus: 800, -30600, 7000, 100 Line 1260: <4>[ 114.700351] (3)[67:kworker/3:1]liuzhigou update!valus: 1200, -29800, 4500, 36 Line 1270: <4>[ 114.903466] (3)[67:kworker/3:1]liuzhigou update!valus: 1200, -29100, 6200, 116 Line 1272: <4>[ 115.100006] (3)[67:kworker/3:1]liuzhigou update!valus: 1900, -29100, 6200, 36 Line 1278: <4>[ 115.303492] (3)[67:kworker/3:1]liuzhigou update!valus: 1500, -29200, 4400, 4 Line 1284: <4>[ 115.500014] (3)[67:kworker/3:1]liuzhigou update!valus: 400, -29300, 5200, 68 Line 1298: <4>[ 115.700524] (3)[67:kworker/3:1]liuzhigou update!valus: 600, -29400, 4600, 52 Line 1317: <4>[ 115.899930] (3)[67:kworker/3:1]liuzhigou update!valus: 800, -28700, 5100, 52 2. 查看算法库加载: vendormediatekproprietaryhardwaresensorsensors-1.0VendorInterface.cpp VendorInterface::VendorInterface() { ... strlcpy(buf, "lib", sizeof(buf)); strlcat(buf, libinfo.libname, sizeof(buf)); strlcat(buf, ".so", sizeof(buf)); lib_handle = dlopen(buf, RTLD_NOW); + ALOGE("VendorInterface() buf = %sn", buf); if (!lib_handle) { ALOGE("get lib_interface fail dlopen operation.n"); // 报此错误 lib_handle = NULL; return; } 供应商提供的算法库打开失败 -> 找供应商重新提供 3. 如果算法库加载没报错,可以查看校准前后数据 int VendorInterface::magCalibration(struct sensorData *inputData,struct sensorData *outputData) { struct magCaliDataInPut magInputData; struct magCaliDataOutPut magOutputData; int ret = 0; memset(&magInputData, 0, sizeof(struct magCaliDataInPut)); memset(&magOutputData, 0, sizeof(struct magCaliDataOutPut)); if (!lib_interface) return -1; if (!lib_interface->doCaliApi) return -1; magInputData.timeStamp = inputData->timeStamp; magInputData.x = inputData->data[0]; magInputData.y = inputData->data[1]; magInputData.z = inputData->data[2]; magInputData.status = inputData->status; + ALOGE("magCalibration() before Calibration : magInputData.x = %fn", magInputData.x); + ALOGE("magCalibration() before Calibration : magInputData.y = %fn", magInputData.y); + ALOGE("magCalibration() before Calibration : magInputData.z = %fn", magInputData.z); ret = lib_interface->doCaliApi(&magInputData, &magOutputData); + ALOGE("magCalibration() after Calibration : magInputData.x = %fn", magInputData.x); + ALOGE("magCalibration() after Calibration : magInputData.y = %fn", magInputData.y); + ALOGE("magCalibration() after Calibration : magInputData.z = %fn", magInputData.z); outputData->timeStamp = magOutputData.timeStamp; outputData->data[0] = magOutputData.x; outputData->data[1] = magOutputData.y; outputData->data[2] = magOutputData.z; outputData->data[3] = magOutputData.x_bias; outputData->data[4] = magOutputData.y_bias; outputData->data[5] = magOutputData.z_bias; outputData->status = magOutputData.status; return ret; } 总结 : 最后因为供应商无法提交现场支持,更换物料为mmc5603x,合入一次成功 案例十五 : android8.1 msensor(mmc5603x)算法库(libmemsicd5603x.so)有问题 现象 : 指南针不转,打开sensorlist,指南针数据始终为0 平台 : androidO,MTK6580 步骤 : 1. 打印kernel log(导出mtklog或cat /dev/kmsg | grep "liuzhigou")看驱动是否有上报数据 kernel-3.18driversmiscmediateksensors-1.0magnetometermag.c int mag_data_report(struct mag_data *data) { struct sensor_event event; int err = 0; + printk("liuzhigou update!valus: %d, %d, %d, %dn" , data->x, data->y, data->z, data->status); log: -- 当打开sensorlist时,地磁数据上报正常 4,69949,1451351242,-; (0)[154:kworker/0:1]liuzhigou update!valus: -90, 126, -878, 3 4,69977,1451551292,-; (0)[154:kworker/0:1]liuzhigou update!valus: -88, 129, -879, 3 4,70042,1451751525,-; (0)[154:kworker/0:1]liuzhigou update!valus: -90, 125, -872, 3 4,70052,1451951410,-; (0)[154:kworker/0:1]liuzhigou update!valus: -87, 126, -878, 3 4,70065,1452151250,-; (0)[154:kworker/0:1]liuzhigou update!valus: -90, 120, -859, 3 4,70075,1452351395,-; (0)[154:kworker/0:1]liuzhigou update!valus: -89, 129, -878, 3 4,70083,1452551445,-; (0)[154:kworker/0:1]liuzhigou update!valus: -88, 133, -882, 3 2. 查看算法库加载: vendormediatekproprietaryhardwaresensorsensors-1.0Magnetic.cpp MagneticSensor::MagneticSensor(){ ... TEMP_FAILURE_RETRY(open("/sys/class/sensor/m_mag_misc/maglibinfo", O_RDWR)); TEMP_FAILURE_RETRY(read(fd, &libinfo, sizeof(struct mag_libinfo_t))); // lib算法库的名字是驱动指定的,从节点maglibinfo获取 /* 驱动中指定定算法库的名字 kernel-4.4/drivers/misc/mediatek/sensors-1.0/magnetometer/mag.c DEVICE_ATTR(maglibinfo, S_IWUSR | S_IRUGO, mag_show_libinfo, NULL); static ssize_t mag_show_libinfo(struct device *dev, struct device_attribute *attr, char *buf) { struct mag_context *cxt = mag_context_obj; memcpy(buf, &cxt->mag_ctl.libinfo, sizeof(struct mag_libinfo_t)); return sizeof(struct mag_libinfo_t); } kernel-4.4/drivers/misc/mediatek/sensors-1.0/magnetometer/mmc5603x/mmc5603x.c static int mmc5603x_i2c_probe() strlcpy(ctl.libinfo.libname, "memsicd5603x", sizeof(ctl.libinfo.libname)); // 库的名字:libmemsicd5603x.so kernel-4.4/drivers/misc/mediatek/sensors-1.0/magnetometer/akm09911/akm09911.c static int akm09911_i2c_probe() strlcpy(ctl.libinfo.libname, "akl", sizeof(ctl.libinfo.libname)); // 库的名字:libakl.so */ strlcpy(buf, "lib", sizeof(buf)); strlcat(buf, libinfo.libname, sizeof(buf)); strlcat(buf, ".so", sizeof(buf)); + ALOGE("liuzhigou MagneticSensor() buf = %sn", buf); // 添加的log lib_handle = dlopen(buf, RTLD_NOW); if (!lib_handle) { ALOGE("dlopen failn"); return; } + ALOGE("liuzhigou dlopen okn"); // 添加的log 查看log(mtklog中的main_log.boot): 01-01 07:03:28.286359 337 337 E Magnetic: liuzhigou MagneticSensor() buf = libmemsicd5603x.so 01-01 07:03:28.419057 337 337 E Magnetic: liuzhigou dlopen ok 3. 如果算法库加载没报错,可以查看校准前后数据 void MagneticSensor::processEvent(struct sensor_event const *event) { float magBias[3] = {0}; struct magCaliDataInPut inputData; struct magCaliDataOutPut outputData; static int32_t lastStatus = 0; memset(&inputData, 0, sizeof(struct magCaliDataInPut)); memset(&outputData, 0, sizeof(struct magCaliDataOutPut)); if (event->flush_action == DATA_ACTION) { mPendingEvent.version = sizeof(sensors_event_t); mPendingEvent.sensor = ID_MAGNETIC; mPendingEvent.type = SENSOR_TYPE_MAGNETIC_FIELD; mPendingEvent.timestamp = event->time_stamp; mPendingEvent.magnetic.status = event->status; mPendingEvent.magnetic.x = (float)event->word[0] / (float)mDataDiv; mPendingEvent.magnetic.y = (float)event->word[1] / (float)mDataDiv; mPendingEvent.magnetic.z = (float)event->word[2] / (float)mDataDiv; inputData.x = mPendingEvent.magnetic.x ; inputData.y = mPendingEvent.magnetic.y ; inputData.z = mPendingEvent.magnetic.z ; + ALOGE("processEvent() before Calibration : inputData.x = %fn", inputData.x); + ALOGE("processEvent() before Calibration : inputData.y = %fn", inputData.y); + ALOGE("processEvent() before Calibration : inputData.z = %fn", inputData.z); inputData.status = mPendingEvent.magnetic.status; inputData.timeStamp = mPendingEvent.timestamp; if (lib_interface != NULL) { lib_interface->doCaliApi(&inputData,&outputData); } + ALOGE("processEvent() after Calibration : outputData.x = %fn", outputData.x); + ALOGE("processEvent() after Calibration : outputData.y = %fn", outputData.y); + ALOGE("processEvent() after Calibration : outputData.z = %fn", outputData.z); mPendingEvent.magnetic.x = outputData.x; mPendingEvent.magnetic.y = outputData.y; mPendingEvent.magnetic.z = outputData.z; mPendingEvent.magnetic.status = outputData.status; magBias[0] = outputData.x_bias; magBias[1] = outputData.y_bias; magBias[2] = outputData.z_bias; if (mPendingEvent.magnetic.status != lastStatus) { mSensorCali.saveCalibrationFloat(MAG_BIAS_SAVED_DIR, MAG_TAG_BIAS, magBias, 3); ALOGE("write bias: [%f, %f, %f]n", magBias[0], magBias[1], magBias[2]); } lastStatus = mPendingEvent.magnetic.status; } else ALOGE("unknow actionn"); } 查看log(mtklog中的main_log): Line 9864: 01-01 07:27:42.910853 339 339 E Magnetic: processEvent() before Calibration : inputData.x = -0.437500 Line 9865: 01-01 07:27:42.911000 339 339 E Magnetic: processEvent() before Calibration : inputData.y = -0.211914 Line 9866: 01-01 07:27:42.911080 339 339 E Magnetic: processEvent() before Calibration : inputData.z = -0.598633 Line 9867: 01-01 07:27:42.911156 339 339 E Magnetic: processEvent() after Calibration : outputData.x = 0.000000 Line 9868: 01-01 07:27:42.911228 339 339 E Magnetic: processEvent() after Calibration : outputData.y = 0.000000 Line 9869: 01-01 07:27:42.911300 339 339 E Magnetic: processEvent() after Calibration : outputData.z = 0.000000 Line 9887: 01-01 07:27:43.108972 339 731 E Magnetic: processEvent() before Calibration : inputData.x = -0.444336 Line 9888: 01-01 07:27:43.109108 339 731 E Magnetic: processEvent() before Calibration : inputData.y = -0.207031 Line 9889: 01-01 07:27:43.109195 339 731 E Magnetic: processEvent() before Calibration : inputData.z = -0.601562 Line 9890: 01-01 07:27:43.109374 339 731 E Magnetic: processEvent() after Calibration : outputData.x = 0.000000 Line 9891: 01-01 07:27:43.109454 339 731 E Magnetic: processEvent() after Calibration : outputData.y = 0.000000 Line 9892: 01-01 07:27:43.109532 339 731 E Magnetic: processEvent() after Calibration : outputData.z = 0.000000 由log可知,so校准算法库有问题 4. 查看是否没有修改outputData的值 void MagneticSensor::processEvent(struct sensor_event const *event) { ... + ALOGE("processEvent() before Calibration : inputData.x = %fn", inputData.x); + ALOGE("processEvent() before Calibration : inputData.y = %fn", inputData.y); + ALOGE("processEvent() before Calibration : inputData.z = %fn", inputData.z); inputData.status = mPendingEvent.magnetic.status; inputData.timeStamp = mPendingEvent.timestamp; if (lib_interface != NULL) { + outputData.x = (float)1.23; + outputData.y = (float)1.23; + outputData.z = (float)1.23; lib_interface->doCaliApi(&inputData,&outputData); } + ALOGE("processEvent() after Calibration : outputData.x = %fn", outputData.x); + ALOGE("processEvent() after Calibration : outputData.y = %fn", outputData.y); + ALOGE("processEvent() after Calibration : outputData.z = %fn", outputData.z); ... 查看log(mtklog中的main_log): 01-02 23:23:39.754 326 738 E Magnetic: processEvent() before Calibration : inputData.x = 25.878906 01-02 23:23:39.754 326 738 E Magnetic: processEvent() before Calibration : inputData.y = 12.109375 01-02 23:23:39.754 326 738 E Magnetic: processEvent() before Calibration : inputData.z = -40.136719 01-02 23:23:39.755 326 738 E Magnetic: processEvent() after Calibration : outputData.x = 1.230000 01-02 23:23:39.755 326 738 E Magnetic: processEvent() after Calibration : outputData.y = 1.230000 01-02 23:23:39.755 326 738 E Magnetic: processEvent() after Calibration : outputData.z = 1.230000 01-02 23:23:39.954 326 326 E Magnetic: processEvent() before Calibration : inputData.x = 25.683594 01-02 23:23:39.954 326 326 E Magnetic: processEvent() before Calibration : inputData.y = 12.109375 01-02 23:23:39.954 326 326 E Magnetic: processEvent() before Calibration : inputData.z = -39.746094 01-02 23:23:39.955 326 326 E Magnetic: processEvent() after Calibration : outputData.x = 1.230000 01-02 23:23:39.955 326 326 E Magnetic: processEvent() after Calibration : outputData.y = 1.230000 01-02 23:23:39.955 326 326 E Magnetic: processEvent() after Calibration : outputData.z = 1.230000 由log可知,outputData的值根本没被修改 5.对比mt6737的hal层sensor架构,发现mt6580名为sensor1.0,实际内容是sensor0.1 提eservice给mtk 总结 : 案例十六 : 现象 : 平台 : 步骤 : 1. 2. 3. 总结 : 案例十七 : 现象 : 平台 : 步骤 : 1. 2. 3. 总结 : 案例十八 : 现象 : 平台 : 步骤 : 1. 2. 3. 总结 :


最后

以上就是知性帆布鞋最近收集整理的关于6. sensor调试日志的全部内容,更多相关6.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(105)

评论列表共有 0 条评论

立即
投稿
返回
顶部