转自: https://blog.csdn.net/MrDongShiYi/article/details/100709633?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

TP 相关引脚DTS中的定义 我们这个项目TP复位引脚是GPIO158,中断引脚是GPIO1,由下图原理图知道我们的TP挂载在I2c0上,3.3v的供电电压是有PMIC 2.8V供电电压通过i2c电平转换过来的,所以供电电压需要配置pmic 2.8v

/* TOUCH start */
&touch {
    tpd-resolution = <800 1280>;//分辨率
    use-tpd-button = <0>;//如果TP有待按键。则定义值为1
    tpd-key-num = <3>;//按键的数量
    tpd-key-local= <139 172 158 0>;//按键的编码,一般为KEY_MENU,KEY_HOMEPAGE,KEY_BACK的键值
    tpd-key-dim-local = <90 883 100 40 230 883 100 40 370 883 100 40 0 0 0 0>;//按键的布局信息,包含按键的宽度,高度,中心点的坐标
    tpd-max-touch-num = <5>;//支持的最大触摸点数
    tpd-filter-enable = <0>; //fae suggest this change to improve effect
    tpd-filter-pixel-density = <146>;
    tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 0 0>;
    tpd-filter-custom-speed = <0 0 0>;
    pinctrl-names = "default", "state_eint_as_int", "state_eint_output0", "state_eint_output1",
        "state_rst_output0", "state_rst_output1";
    pinctrl-0 = <&ctp_pins_default>;
    pinctrl-1 = <&ctp_pins_eint_as_int>;
    pinctrl-2 = <&ctp_pins_eint_output0>;
    pinctrl-3 = <&ctp_pins_eint_output1>;
    pinctrl-4 = <&ctp_pins_rst_output0>;
    pinctrl-5 = <&ctp_pins_rst_output1>;
    status = "okay";
};
&pio {
    ctp_pins_default: eint0default {
    };
    ctp_pins_eint_as_int: eint@0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO1__FUNC_GPIO1>;
            slew-rate = <0>;
            bias-disable;
        };
    };
    ctp_pins_eint_output0: eintoutput0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO1__FUNC_GPIO1>;
            slew-rate = <1>;
            output-low;
        };
    };
    ctp_pins_eint_output1: eintoutput1 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO1__FUNC_GPIO1>;
            slew-rate = <1>;
            output-high;
        };
    };
    ctp_pins_rst_output0: rstoutput0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO158__FUNC_GPIO158>;
            slew-rate = <1>;
            output-low;
        };
    };
    ctp_pins_rst_output1: rstoutput1 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO158__FUNC_GPIO158>;
            slew-rate = <1>;
            output-high;
        };
    };
};
/* TOUCH end */
&i2c0 {
        status = "okay";

        goodix_touch@5e {
                compatible = "mediatek,goodix_touch"; //用于匹配GT9xx这个TP驱动

                reg = <0x5e>;//GT9xx I2c的地址
                interrupt-parent = <&pio>; //中断脚
                interrupts = <1 IRQ_TYPE_EDGE_RISING 1 0>;//中断模式是上升沿触发
                //vtouch-supply = <&mt_pmic_vldo28_ldo_reg>; //原生MTK节点TP 2.8V PMIC供电
                reg-tp-supply = <&mt_pmic_vldo28_ldo_reg>; //由于我们代码上修改了TP 2.8V PMIC供电节点获取是以reg-tp-supply这个字符获取的原生的是由vtouch-supply这个获取的
                rst-gpio = <&pio 158 0>;//TP的复位引脚
                int-gpio = <&pio 1 0>;//TP的中断引脚

                status = "okay";
            };
    }

驱动流程表:

TP驱动的注册 :mtk_tpd.c

注册成功后调用probe探测方法

probe方法里实现的动作,注册TP设备,获取TP dts相关信息,为TP设备申请内核内存空间,分配一个输入设备

特定TP的注册

创建一个TP回调函数,用于TP 在LCD亮屏和灭屏时调用

如果是cap TP驱动则进行初始化

最后实现input设备注册,把设备加入input设备链表,生成“dev/input/eventx”节点,和进行虚拟按键初始化以及一些TP属性的创建

int tpd_get_gpio_info 这个函数是获取Tp dts节点信息就是获取中断和复位引脚的状态

touch_resume_workqueue_callback该函数主要是用于判断LCD是亮屏还是灭屏通过调用回调函数 tpd_fb_notifier_callback通知TP是否工作

回调函数tpd_fb_notifier_callback接受到通知后,通知TP是否工作

tpd_create_attributes这个函数是创建TP的一些系统属性

特定TP驱动的初始化:我这里用汇顶GT9xx驱动为例: gt9xx_driver.c 首先获取i2c0上的gt9xx驱动设备节点的dts信息,然后注册 i2c0上的 gt9xx 汇顶TP驱动到TP驱动链表中

void tpd_get_dts_info(void)该函数是获取touch tp节点的信息

void tpd_get_dts_info(void)该函数从touch tp节点的信息获取dts信息

int tpd_driver_add该函数会添加新的TP驱动到TP驱动链表中,即会把GT9xx添加到TP驱动链表中

当新TP驱动tpd_device_driver添加成功会调用tpd_local_init这个本地方法

TP本地方法里实现了esd防静电检测队列的创建,TP相关电压检测队列的创建,分配DMA i2c对象,我们封装的TP2.8V供电接口还是就是原生的2.8v供电接口

接下来本地方法里会注册I2c从设备驱动,如果注册失败tpd_load_status 值会为0,同时进行按键和虚拟按键的初始化,以及记录TP供应商的一些信息

注册gt9xx tp驱动,调用probe探测方法

tpd_i2c_probe探测方法里实现了获取平台数据,获取int中断和rst复位引脚的状态以及I2c上电通信,我们添加的初始化接口,通过I2c通信的读接口读取TP固件信息

接下来会初始化TP固件参数,增加了我们自定义的TP方向的接口,以及创建TP节点信息,初始化写进去的参数,创建一条内核线程,如果有虚拟按键,就初始化虚拟按键

最后,探测方法里还实现按键初始化,TP中断的使能,esd防静电开启,创建一条用于更新TP固件的线程,实现远离和靠近屏幕是TP的唤醒功能

最终如果探测方法里的动作都实现了,会记录tpd_load_status = 1,表示gt9xx TP驱动成功注册

of_get_gt9xx_platform_data这个函数获取int中断和rst复位引脚信息

static int gtp_get_gpio_res(void)该函数是配置int中断和rst复位引脚

tpd_power_on函数是上电,下载TP固件

tpd_power_on函数接下来上电并下载TP固件成功,同时测试i2c是否上电通信成功

gtp_read_version这个函数是通过i2c读取TP固件版本信息

gtp_init_panel初始化TP厂商给的TP参数

TP参数

gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0660, NULL, &gt_upgrade_proc_fops);这个在创建节点时会使用到两个操作方法进行

gt_upgrade_proc_fops里面定义了读和写方法

创建了中断核心线程thread = kthread_run(touch_event_handler, 0, TPD_DEVICE);

touch_event_handler中断核心线程主要是实现抬手和按压事件的上报

标签: aosp

添加新评论