MTK Touch 驱动的组成
Mtk Touch driver 驱动包括:Mtkplatform 虚拟平台设备驱动、Module touch IC
驱动、Inputsubsystem。Mtk platform 设备驱动是mtk为了兼容多个touch
IC驱动而设计出来的虚拟驱动,它会去遍历每一个touch IC驱动,直到其中一个初始化成功。Linux
input_subsystem是linux的输入子系统,我们的输入设备都要通过这个子系统进行上报事件以及设置事件的类型。
一:TP驱动加载流程()
在LINUX启动过程中,先注册kernel-4.4/drivers/input/touchscreen/mediatek/目录下的具体驱动(如msg2238_ilitek),在驱动tpd_driver_init函数里调用tpd_driver_add(&tpd_device_driver)把该tp驱动加入到一个静态数组tpd_driver_list[i]中,在kernel-4.4/drivers/input/touchscreen/mediatek/mtk_tpd.c中moduel_init首先加载的函数tpd_device_init
函数中调用tpd_init_work_callback -->
然后platform_driver_register(&tpd_driver)注册一个mtk_touch_driver平台驱动driver
--> mtk_touch_driver函数的.of_match_table =
touch_of_match的compatible =
"mediatek,mt6739-touch"与在mt6739.dts注册的设备device touch: touch
compatible = "mediatek,mt6739-touch";相同,就执行tpd_probe函数。根据platform
bus match的规则:driver_name 和device_name相同就会调用platform_driver
的probe函数。(这里牵扯到Linux的设备模型知识,需要了解的人可以看下Linux platform
bus。)在tpd_probe函数中,调用tpd_get_gpio_info(pdev)函数解析dts参数,调用input_allocate_device()分配一个输入设备,设置input
设备事件类型,执行if(tpd_driver_list[i].tpd_device_name !=
NULL)//这里是在遍历mtk的tpd_driver_list里面的所有的驱动,判断名字是否为NULL,每一个module
touch IC 驱动都会添加到这个静态数组里面。tpd_driver_list[i].tpd_local_init();
if(tpd_load_status ==1) {//这里我们会判断我们所遍历的每一个module IC
驱动的初始化函数tpd_local_init()。probe成功的话就会将tpd_load_status变量置1,所以我们就是通过这个值tpd_load_status判断使用哪一个驱动的