MTK Sensor 分为AP和SCP两大部分,AP是主芯片,SCP是协处理器,都可以负责处理sensor数据。所以在MTK在驱动调试时经常会说sensor是挂AP侧还是挂scp侧。
在AP侧的sensor的调试不是很复杂,一般的步骤是找器件原厂对应的驱动,描述清楚是MTK的哪颗芯片,内核时什么版本。我之前调试的时kernel-4.19版本,sensor 1.0的,后面都是以sensor 1.0的进行说明。
在拿到器件的驱动后,一般的步骤如下:
(1)根据原理图编辑对应的dts;
(2)将拿到的代码合入到kernel-4.19/drivers/misc/mediatek/sensors-1.0对应的器件子目录,在新增的子目录中增加Makefile跟Kconfig文件,Kconfig中就配置下当前器件模块名称,Makefile指定编译的文件与文件目标;
(3)在 kernel-4.19/arch/arm64/configs对应的config配置文件enable对应的sensor,例如我调的时light sensor 跟p sensor器件,配置CONFIG_CUSTOM_KERNEL_ALSPS=y,因为只有这个选项配置了,kernel-4.19/drivers/misc/mediatek/sensors-1.0/Makefile才配置对应的模块进行编译;增加步骤一的某块名称如CONFIG_MTK_XXX=y;
(4)编辑device/custom/custom_project/ProjectConfig.mk文件,enable对应的sensor模块,例如我的时L/P sensor挂载在AP侧,那就编辑CUSTOM_KERNEL_ALSPS = yes;
(5)开始编译内核,解决对应的编译问题;
(6)更新boot.img,scp.img文件,抓内核的开机日志,看是否有正常跑到module_init。
(7)安装应用查看应用层是否能获取到对用的sensor。之前就有遇到过,从日志看都已经跑到probe了,但是应用层sensor list中就是没有获取到。这里需要关注下驱动的probe代码中是否有调用sensorlist_register_deviceinfo进行sensor注册,如果没有sensorlist中是获取不到新增的sensor的。
到这里AP 侧sensor 驱动就算合入了。这个过程中需要关注几个
(1)dts一定要配置对,如果对应的GPIO没有上拉,也是在sensor列表中获取不到sensor的;
(2)在probe中一定要调用sensorlist_register_deviceinfo进行注册sensor;
这里编译整理会是比较耗时,运气好也许一个上午就点亮了,运气不好也许三天了还在里面找原因。
sensor 点亮后,像L/P sensor,g sensor、sar sensor都还需要校准,这个工作量会比前期简单的点亮多的多。另外sar sensor 数据正常上抛后,还需要同系统、同天线联调,在什么场景下进行降功耗,而且要确定sar sensor是否可以稳定触发,之前就遇到过sar sensor灭屏一会儿就不触发了,因为进入待机了,没有进行中断唤醒查了好久,还有就是原厂给的不是final的参数,导致出现各种问题。
SCP(Tinysys)协处理器,负责sensor,audio相关的feature,以及可以扩展客户私有的功能。MTK SCP的系统选用的是FreeRTOS。如果器件是挂在scp侧的,修改的代码会稍微多些,原厂在给这部分的驱动时提供的资料会稍微详细些,我这里以g sensor为例。
(1)在vendor/mediatek/proprietary/tinysys/freertos/source/middleware/contexthub/MEMS_Driver/accGyro目录下添加器件原厂提供的驱动文件;
(2)修改vendor/mediatek/proprietary/tinysys/freertos/source/project/CM4_A/project/CustomerProject/ProjectConfig.mk文件,定义支持新增的sensor如:CFG_XXXX_SUPORT = yes;
(3)修改vendor/mediatek/proprietary/tinsys/freertos/source/project/CM4_A/project/platform/feature_config/chre.mk,根据步骤2中的定义控制驱动代码参与编译
(4)修改vendor/mediatek/proprietary/tinsys/freetos/source/project/CM4_A/project/customerporject/inc/overlay_sensor.h,看是什么sensor,例如我添加的是gsensor,则修改
#define OVERLAY_SECTION_ACCGYRO, 添加新的器件
(5)修改vendor/mediatek/proprietary/tinsys/freetos/source/project/CM4_A/project/customerproject/cust/overlay/overlay.c,修改accGyroOverlayRemap,添加新的器件;
(6)修改vendor/mediatek/proprietary/tinsys/freertos/source/project/CM4_A/project/customerproject/cust/accGyro/cust_accGyro.c,根据原理图添加器件的对应的i2c引脚
(7)然后就开始编译,如果编译中提示超出memory,那就需要修改下 vendor/mediatek/proprietary/tinysys/freertos/source/project/CM4_A/project/platform/Setting.ini根据对应的编译错误修改对应的size。文章来源:https://www.toymoban.com/news/detail-427234.html
(8)更新scp.img,重启抓scp日志,查看日志是否有正常加载器件。我有遇到过不能加载的,是加载上一个同类型器件,加载失败对应index没有示范,导致加载失败的,这样就需要修改对应的器件加载失败,是否对应index;也有遇到过需要写的i2c数据比较大,在写I2C块数据时失败了,这时候就看看是否需要开启DMC对应的配置时CFG_I2C_CH0_DMA_SUPPORT、CFG_I2C_CH1_DMA_SUPPORT。文章来源地址https://www.toymoban.com/news/detail-427234.html
到了这里,关于mtk sensor 驱动调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!