MTK 驱动开发(32)---Sensor 移植及调试(2)

3. Sensor Driver 的客制化
主要涉及三个方面:

1)配置 codegen.dws

---I2C 地址、eint、gpio

2)配置驱动参数

3)选择sensor P/N

3.1 配置 codegen.dws
vendor\mediatek\proprietary\scripts\dct\drvgen.exe
vendor\mediatek\proprietary\bootable\bootloader\lk\target\ivvi6797_6m_n\dct\dct\codegen.dws

vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\ivvi6797_6m_n\dct\dct\codegen.dws
vendor\mediatek\proprietary\custom\ivvi6797_6m_n\kernel\dct\dct\codegen.dws

sensor 通道配置

如果需要用到eint, 需要进行sensor eint 和GPIO 配置

3.2 驱动参数配置 

Accelerometer  参数配置:

注意传感器的方向

Gyroscope 参数配置:

Magnetometer参数配置:

Alps 参数配置:

如果用到GPIO,还需要对GPIO 进行对应的设置。

5 实例

一、新增驱动(示例: msensor st480)  
    1.添加kernel-3.18\drivers\misc\mediatek\magnetometer\st480文件夹(包含st480.c、st480.h、Kconfig、Makefile四个文件)  
        st480.c  
        st480.h  
        Kconfig     建宏--MTK_ST480  
        Makefile      
          
    2.kernel-3.18\drivers\misc\mediatek\magnetometer\Kconfig 添加:  
        + source "drivers/misc/mediatek/magnetometer/st480/Kconfig"  
      
    3.kernel-3.18\drivers\misc\mediatek\magnetometer\Makefile 添加:  
        + obj-$(CONFIG_MTK_ST480)   +=  st480/  
      
    4.kernel-3.18\arch\arm\boot\dts\len6797_6m_n.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.18\arch\arm\configs\len6797_6m_n_debug_defconfig、len6797_6m_n_defconfig 修改  
        - #CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y  
        + CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y  
        + CONFIG_MTK_ST480=y  
    6.添加vendor\lentek\libs\mt6797\st480文件夹(包含st480、Android.mk、README、NOTICE)  
        st480       是一个可执行文件---init.xxx.rc中运行的daemon进程  
        Android.mk    
        README      解释信息  
        NOTICE      解释信息  
  
    7.device\lentek\len6797_6m_n\ProjectConfig.mk 修改:  
        - CUSTOM_KERNEL_MAGNETOMETER = no  
        + CUSTOM_KERNEL_MAGNETOMETER = yes  
          
    8.device\mediatek\mt6797\init.mt6797.rc 添加:  
        service st480 /system/bin/st480                     // 这是一个服务,服务的路径  
            disabled  
            user system  
            group system  
            class main                  // 归属于main这个service,main启动时启动st480        
              
    9.device\lentek\len6797_6m_n\factory_init.project.rc 添加:  
        service st480 /system/bin/st480                     // 这是一个服务,服务的路径--应该是工厂模式用到的  
            disabled  
            user system  
            group system  
          
    10.device\mediatek\common\sepolicy\file_contexts 添加:  
            + /system/bin/st480 u:object_r:st480_exec:s0    // 当我们添加跑一个服务的时候就需要对其添加(开放)权限?哪些进程可以访问它  
          
    11.添加device\mediatek\common\sepolicy\st480.te文件   
          
    12.device\mediatek\mt6797\device.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 "dgsensor"  
        <4>[  564.973691]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa  
        <4>[  564.973725]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status epl_sensor.ps.compare_low =  0x8  
        <4>[  565.168562]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa  
        <4>[  565.168588]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status epl_sensor.ps.compare_low =  0x8  
        <4>[  565.368485]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa  
        
      
四、跟读代码可知:以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 -  从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])  
      
         
  
六、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  
  
    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  
  

 

你可能感兴趣的:(MTK,驱动)