MTK 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 通道配置

MTK Sensor 移植及调试2_第1张图片

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

 

3.2 驱动参数配置 

Accelerometer  参数配置:

MTK Sensor 移植及调试2_第2张图片

注意传感器的方向

MTK Sensor 移植及调试2_第3张图片

 

Gyroscope 参数配置:

MTK Sensor 移植及调试2_第4张图片

Magnetometer参数配置

MTK Sensor 移植及调试2_第5张图片

Alps 参数配置:

MTK Sensor 移植及调试2_第6张图片

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

MTK Sensor 移植及调试2_第7张图片

5 实例

 
  1.  
  2.  
  3. 一、新增驱动(示例: msensor st480)

  4. 1.添加kernel-3.18\drivers\misc\mediatek\magnetometer\st480文件夹(包含st480.c、st480.h、Kconfig、Makefile四个文件)

  5. st480.c

  6. st480.h

  7. Kconfig 建宏--MTK_ST480

  8. Makefile

  9.  
  10. 2.kernel-3.18\drivers\misc\mediatek\magnetometer\Kconfig 添加:

  11. + source "drivers/misc/mediatek/magnetometer/st480/Kconfig"

  12.  
  13. 3.kernel-3.18\drivers\misc\mediatek\magnetometer\Makefile 添加:

  14. + obj-$(CONFIG_MTK_ST480) += st480/

  15.  
  16. 4.kernel-3.18\arch\arm\boot\dts\len6797_6m_n.dts 添加:

  17. 注:这一段没有的话(或名字不对应),会导致开机重启

  18. cust_mag@0 {

  19. compatible = "mediatek,st480";

  20. i2c_num = <2>; // i2c控制器2(即i2c总线2),sensor都接在控制器2上--即i2c总线2

  21. i2c_addr = <0x0C 0 0 0>; // dws也写了一个i2c地址,到底用哪个看驱动,通常写在dws

  22. direction = <1>; // 方向 –> 唯一用到的

  23. power_id = <0xffff>;

  24. power_vol = <0>;

  25. is_batch_supported = <0>;

  26. };

  27. 4.1 修改dws: i2c总线数与i2c地址,驱动中会用到

  28. I2C:

  29. MSENSOR I2C_CHANNEL_2 0x30

  30.  
  31. 5.kernel-3.18\arch\arm\configs\len6797_6m_n_debug_defconfig、len6797_6m_n_defconfig 修改

  32. - #CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y

  33. + CONFIG_CUSTOM_KERNEL_MAGNETOMETER=y

  34. + CONFIG_MTK_ST480=y

  35. 6.添加vendor\lentek\libs\mt6797\st480文件夹(包含st480、Android.mk、README、NOTICE)

  36. st480 是一个可执行文件---init.xxx.rc中运行的daemon进程

  37. Android.mk

  38. README 解释信息

  39. NOTICE 解释信息

  40.  
  41. 7.device\lentek\len6797_6m_n\ProjectConfig.mk 修改:

  42. - CUSTOM_KERNEL_MAGNETOMETER = no

  43. + CUSTOM_KERNEL_MAGNETOMETER = yes

  44.  
  45. 8.device\mediatek\mt6797\init.mt6797.rc 添加:

  46. service st480 /system/bin/st480 // 这是一个服务,服务的路径

  47. disabled

  48. user system

  49. group system

  50. class main // 归属于main这个service,main启动时启动st480

  51.  
  52. 9.device\lentek\len6797_6m_n\factory_init.project.rc 添加:

  53. service st480 /system/bin/st480 // 这是一个服务,服务的路径--应该是工厂模式用到的

  54. disabled

  55. user system

  56. group system

  57.  
  58. 10.device\mediatek\common\sepolicy\file_contexts 添加:

  59. + /system/bin/st480 u:object_r:st480_exec:s0 // 当我们添加跑一个服务的时候就需要对其添加(开放)权限?哪些进程可以访问它

  60.  
  61. 11.添加device\mediatek\common\sepolicy\st480.te文件

  62.  
  63. 12.device\mediatek\mt6797\device.mk 添加:

  64. + PRODUCT_PACKAGES += st480 // 复制st480,从…到/system/bin/

  65.  
  66. 二、查看log:

  67. 1.查看上报数据

  68. cat /proc/kmsg | grep "***"

  69. 2.查看开机串口log

  70. 从串口测试点(TXD)接线出来,用usb转串口线,配合xshell抓串口log(波特率:912600)

  71. 3.查看sensor型号:

  72. eng 版可以通过 命令查看: cat /sys/bus/platform/drivers/gsensor/chipinfo

  73. user版可以通过 命令查看: dmesg | grep "gsensor" -i // 按power键灭屏or亮屏时,会打开or关闭sensor,会有内核缓冲器会有log打出

  74. [ 1099.329303] (0)[934:android.ui]qma6981_enable_nodata 1964 : Gsensor not in suspend gsensor_SetPowerMode!, enable_status = 1

  75. [ 1102.168146] (0)[946:PowerManagerSer]qma6981_enable_nodata 1964 : Gsensor not in suspend gsensor_SetPowerMode!, enable_status = 0

  76.  
  77. user版可以通过 命令查看: dmesg | grep "als" -i

  78. user版可以通过 命令查看: dmesg | grep "msensor" -i

  79. user版可以通过 命令查看: dmesg | grep "gyro" -i

  80.  
  81. 三、根据input子系统的调试方法:

  82. getevent -i 查看所有的input设备

  83. getevent -t /dev/input/event4 获取gsensor往上层上报的包(封装过,加入time等信息,以16进制方式打印)

  84.  
  85. 1. ps

  86. 靠近:

  87. [ 2208.288534] 0002 0002 00000001

  88. [ 2208.288534] 0002 0001 00000003

  89. [ 2208.288534] 0000 0000 00000000

  90. 远离:

 
  1. [ 2212.838044] 0002 0002 00000002

  2. [ 2212.838044] 0002 0001 00000003

  3. [ 2212.838044] 0000 0000 00000000

  4.  
  5. 2. cat /proc/kmsg | grep "dgsensor"

  6. <4>[ 564.973691]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa

  7. <4>[ 564.973725]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8

  8. <4>[ 565.168562]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa

  9. <4>[ 565.168588]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status epl_sensor.ps.compare_low = 0x8

  10. <4>[ 565.368485]<0> (0)[2935:kworker/0:3]dgsensor epl_sensor_read_ps_status gRawData.raw_bytes[0] = 0xa

  11.  
  12.  
  13. 四、跟读代码可知:以gsensor(mc3xxx_auto)为例

  14. 通过sys文件系统接口调试

  15. 1.架构实现 - 两个路径的节点是一样的,cat出来也是相同的,hal层走class

  16. /sys/class/misc/m_acc_misc/*** 有若干属性,可以读写操作

  17.  
  18. cat /sys/.../accenablenodata -- 不支持 echo 0/1 > 无作用

  19. cat /sys/.../accactive -- 1(使能) echo 0 > /sys/.../accactive -- disable

  20. cat /sys/.../accdelay(不常用)

  21. cat /sys/.../accbatch(不常用)

  22. cat /sys/.../accflush(不常用)

  23. cat /sys/.../accdevnum -- 4(/dev/input/event4)

  24.  
  25. 2.驱动实现

  26. /sys/bus/platform/drivers/gsensor/*** 有若干属性,可以读写操作

  27.  
  28. * cat /sys/.../chipinfo -- MC3XXX Chip -- 直接打印MC3XXX Chip

  29. * cat /sys/.../sensordata -- 1758 0695 1b88 -- 读地址0x00

  30. cat /sys/.../cali -- 三组校准数据 -- 第二组为校准系数,上层未下发就为0

  31. cat /sys/.../selftest -- 空(未设置)

  32. cat /sys/.../firlen -- 0 -- 滤波长度 - 从dts获得 - 全部为0

  33. cat /sys/.../trace -- 0x0000 -- mc3xxx_i2c_probe()把它设置为0

  34. cat /sys/.../status -- CUST: 2 7 <-1 0> -- i2c_num direction - 从dts获取

  35. cat /sys/.../power -- 亮屏0x0041,灭屏0x0043 -- 读地址0x07

  36. cat /sys/.../version -- 2.1.6 -- 打印驱动的宏

  37. * cat /sys/.../chipid -- 7C-5F-5E-46 -- 读地址0x3C

  38. cat /sys/.../virtualz -- 不支持

  39. * cat /sys/.../regmap -- 打印所有寄存器的值

  40. * cat /sys/.../orientation -- 7 -- 从dts获取 echo 7 > /sys/.../orientation

  41. cat /sys/.../accuracy -- 2(精度 - 宏设置)

  42. cat /sys/.../selfcheck -- 乱码

  43. cat /sys/.../validate -- 0(验证成功) -- 从0x3b读出pcode - 匹配mc3***系列芯片 - 验证成功返回0

  44. cat /sys/.../pdoc -- 0(不支持 - 宏未开)

  45.  
  46. 五、sensor兼容:以gsensor为例:

  47. Mtk的架构已经做了兼容,最多只能兼容5个(gsensor_init_list[5])(tpd_driver_list[20])

  48.  
  49.  
  50.  
  51. 六、ps的阈值如何设定

  52. 1. androidL/M/N:

  53. kernel-3.10/drivers/misc/mediatek/alsps/epl259x/epl259x.c

  54. dynk_low_offset = 2000; //500; //100 - qk

  55. dynk_high_offset = 2300; //800; //300 - qk

  56. 将(500,800)改为(2000,2300),距离约降低三分一,写死在驱动不用dts

  57.  
  58. 七、sensor数据上报有三种接口

  59. 1. 轮询上报 --最终使用

  60. 2. sys文件系统 -- 调试使用

  61. 3. ioctl接口 -- ATA (工厂模式: 同时按住音量减和电源键开机)

  62.  
  63. mtk原生:

  64. 关闭轮询 - 无功能

  65. 关闭ioctl - 工厂模式无数据(音量减与电源键同时按住开机)

  66. 关闭sysfs - 有功能

  67.  
  68. bose修改hal层框架后: - 由一个进程主动读取

  69. 关闭轮询 - 有功能

  70. 关闭ioctl - 工厂模式无数据(音量减与电源键同时按住开机)

  71. 关闭sysfs - 无功能

  72.  
  73.  
  74. 八、调试查看log

  75.  
  76. hal层enable与disable时候会打印:[logcat | grep "..."]

  77. vendor/mediatek/proprietary/hardware/sensor/nusensors.cpp

  78. int sensors_poll_context_t::activate(int handle, int enabled)

  79. {

  80. ALOGD( "activate handle =%d, enable = %d",handle, enabled );

  81.  
  82. sensor编号:(kernel/.../hwmsensor.h中定义减1)

  83. accelerometer 0

  84. magnetometer 1

  85. orientation 2

  86. gyroscope 3

  87. ambient light sensor 4

  88. proximity sensor 7

  89.  
  90.  
  91.  

 

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