14.sensor调试日志

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值