一、前言
本文以ltr599光距感在MT8183平台驱动移植为例进行分析;
1、涉及文件和目录:
设备树: kernel-4.4/arch/arm64/boot/dts/mediatek/k71v1_64_bsp.dts
光距感框架:kernel-4.4/drivers/misc/mediatek/sensors-1.0/alsps/alsps.c
光距感驱动:kernel-4.4/drivers/misc/mediatek/sensors-1.0/alsps/LTR559/ltr559.c
2、在进行移植前的准备工作:
1、从光距感供应商中获取ltr599芯片数据手册和光距感驱动实例代码(优先mtk平台);
2、从硬件工程师手中获取MT8183工程项目的原理图(带光距感小板硬件接口的)和GPIO对应表格;
3、在移植前确保该项目的系统代码能完整编译,刷机后可以正常开机和打印串口log;
二、查看原理图
1、 ltr559小板原理图:
2、光距感引脚与主控端对应接线:
供电引脚:vcc-T —> VLDO28(MT6358)
距感红外灯供电引脚:VCC-R —> GPIO_VCC5V_RLED_EN --> AB23(MT8788)
I2C协议线:SDA1 —> SDA1(MT8788), SCL1 —> SCL1(MT8788);
光距感中断脚:EINT_ALPS —> EINT6(MT8788);
备注: MT6358为pmu,MT8788是cpu处理器;
3、供电引脚说明
3.1 光距感供电引脚需要2.8V,所以选择pmu来供电;
3.2 因为距感红外灯供电引脚需要5V电压,但cpu引脚只能输出1.8v,所以中间需要一个升压设置;当GPIO_VCC5V_RLED_EN为高电平时,VCC5V_RLED引脚电压为5V;当GPIO_VCC5V_RLED_EN为低电平时,GPIO_VCC5V_RLED_EN电压与vsys引脚一致,vsys电压与vbat电池电压
3.3 光距感的中断引脚在该项目中暂时没用到,不分析;
三、GPIO配置
因为中断引脚不考虑,供电VCC是有pmu控制,i2c引脚由mtk默认配置好了,所以gpio只需要配置距感红外灯供电使能引脚:GPIO_VCC5V_RLED_EN
查看GPIO对应表格:
可知原理图中的AB23对应GPIO18脚;
1、dws配置
打开DCT工具:vendor/mediatek/proprietary/scripts/dct/DrvGen.exe
选择DWS配置文件:vendor/mediatek/proprietary/custom/tb8788p1_64_bsp/kernel/dct/dct/codegen.dws
preloader阶段的dws:
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/tb8788p1_64_bsp/dct/dct/codegen.dws
lk阶段的dws:
vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8788p1_64_bsp/dct/dct/codegen.dws
kernel阶段的dws
:kernel-4.4\drivers\misc\mediatek\dws\tb8788p1_64_bsp\codegen.dws
配置GPIO18引脚为普通GPIO模式、默认输出、低电平
四、ltr559光距感移植
1、将ltr559驱动代码编译进内核
在调试驱动功能前需要将驱动代码编译进内核,让代码能正常的运行;
1.1、添加驱动代码
在kernel-4.4/drivers/misc/mediatek/sensors-1.0/alsps/目录下创建LTR559目录,将供应商提供的mtk平台实例代码拷贝到LTR559目录下;
1.2、修改Makefile和Kconfig配置文件
在kernel-4.4/drivers/misc/mediatek/sensors-1.0/alsps/Makefile中添加:obj-$(CONFIG_MTK_LTR559) += LTR559/
注:可以使用obj-y += LTR559/
临时调试
在kernel-4.4/drivers/misc/mediatek/sensors-1.0/alsps/Kconfig中添加:source "drivers/misc/mediatek/sensors-1.0/alsps/LTR559/Kconfig"
1. 3、修改defconfig配置文件
在kernel-4.4/arch/arm64/configs/tb8788p1_64_bsp_defconfig和kernel-4.4/arch/arm64/configs/tb8788p1_64_bsp_debug_defconfig文件中加入CONFIG_MTK_LTR559=y
(注:=
附近不能有间隔)
提示:make bootimage编译内核,可以查看out/targer/product/tb8788p1_64_bsp/obj/KERNEL_OBJ/.config文件的配置与defconfig是否一致;
1.4、检查驱动代码是否编译进内核
在ltr559.c的入口函数ltr559_init中添加打印信息,编译内核ok后烧录固件,在开机过程中查看串口日志中是否有添加的打印信息,若有则说明成功编译进内核;
2、ltr559驱动的调试
终于到了移植ltr559驱动的重点部分,前期所有的工作都是为这一步做的准备,同样也是最关键的;ltr559驱动调试可以分成三步:1、调通ltr559驱动,确保主控端通过i2c通讯能获取到数据;2、增加sysfs用户接口,在驱动程序中增加sysfs设备节点供应用层调用,增加工厂测试中的光距感功能;3、调试ltr559驱动效果,确保主控端获取的数据范围、精度、使用场景等因素符合产品需求;
2.1 调通ltr559驱动功能
调通ltr559功能的标志是主控端能获取到光距感数据的变化;结合代码具体分析步骤:
2.1.1 dts设置
按照以下格式配置ltr559芯片在dts中的硬件信息:
//k71v1_64_bsp.dts
//GPIOI8为距感红外灯供电引脚配置
alsps: als_ps@0 {
compatible = "mediatek,als_ps";
//gpio的配置采用mtk封装好的GPIO子系统来设置
psled-gpio = <&pio 18 0>; //GPIO18
status = "okay";
};
//i2c总线1下的ltr559设备信息配置
&i2c1 {
alsps@3b{
compatible = "mediatek,alsps";
reg = <0x3b>; //i2c设备地址,在规格书中可以查到
status = "okay";
};
注意:红外灯供电引脚和i2c设备信息分成两个节点的目的是保证光距感的兼容性,通过alsps.c架构文件获取红外灯GPIOI8的配置信息;
2.1.2 驱动程序获取dts信息
配置好dts后,驱动程序怎么获取到设备硬件信息呢?
获取GPIOI8信息的方式:
//alsps.c
static int als_ps_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
int psled_en;
psled_en =