mtk 平台 TP 驱动框架对复位和中断的封装_mtk tp gpio-程序员宅基地

技术标签: c语言  Linux 设备驱动  linux  

mtk 平台 TP 驱动框架对触摸 IC 的复位和中断进行了封装,并提供了统一的操作方式。下面以 MT8788 为例介绍有关的知识点。

1、内核 dts 文件中 TP 复位和中断的配置:

(1)平台 dts 文件中 touch 节点用于和 TP 框架的绑定

kernel-4.14/arch/arm64/boot/dts/mediatek/mt6771.dts:

    touch: touch {
		compatible = "mediatek,touch";
	};

(2)项目 dts 文件中复位和中断的配置

kernel-4.14/arch/arm64/boot/dts/mediatek/tb8788p1_64_bsp.dts:

&touch {
    ... // 省略部分代码
	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 {
			pinmux = <PINMUX_GPIO11__FUNC_GPIO11>;
			slew-rate = <0>;
			bias-disable;
		};
	};
	ctp_pins_eint_output0: eintoutput0 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO11__FUNC_GPIO11>;
			slew-rate = <1>;
			output-low;
		};
	};
	ctp_pins_eint_output1: eintoutput1 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO11__FUNC_GPIO11>;
			slew-rate = <1>;
			output-high;
		};
	};
	ctp_pins_rst_output0: rstoutput0 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO12__FUNC_GPIO12>;
			slew-rate = <1>;
			output-low;
		};
	};
	ctp_pins_rst_output1: rstoutput1 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO12__FUNC_GPIO12>;
			slew-rate = <1>;
			output-high;
		};
	};
    ... // 省略部分代码
};

2、TP 驱动框架对复位和中断的封装

(1)定义 of_device_id 数组 touch_of_match,用于和设备的绑定

kernel-4.14/drivers/input/touchscreen/mediatek/mtk_tpd.c:

const struct of_device_id touch_of_match[] = {
	{ .compatible = "mediatek,touch", },
};

(2) 获取复位和中断的 pinctrl 和 pinctrl_state

kernel-4.14/drivers/input/touchscreen/mediatek/mtk_tpd.c:

struct pinctrl *pinctrl1;
struct pinctrl_state *pins_default;
struct pinctrl_state *eint_as_int, *eint_output0, *eint_output1, *rst_output0, *rst_output1;

int tpd_get_gpio_info(struct platform_device *pdev)
{
	int ret;

	pinctrl1 = devm_pinctrl_get(&pdev->dev);
	if (IS_ERR(pinctrl1)) {
		ret = PTR_ERR(pinctrl1);
		dev_info(&pdev->dev, "fwq Cannot find pinctrl1!\n");
		return ret;
	}
	pins_default = pinctrl_lookup_state(pinctrl1, "default");
	if (IS_ERR(pins_default)) {
		ret = PTR_ERR(pins_default);
		TPD_DMESG("Cannot find pinctrl default %d!\n", ret);
	}
	eint_as_int = pinctrl_lookup_state(pinctrl1, "state_eint_as_int");
	if (IS_ERR(eint_as_int)) {
		ret = PTR_ERR(eint_as_int);
		TPD_DMESG("Cannot find pinctrl state_eint_as_int!\n");
		return ret;
	}
	eint_output0 = pinctrl_lookup_state(pinctrl1, "state_eint_output0");
	if (IS_ERR(eint_output0)) {
		ret = PTR_ERR(eint_output0);
		TPD_DMESG("Cannot find pinctrl state_eint_output0!\n");
		return ret;
	}
	eint_output1 = pinctrl_lookup_state(pinctrl1, "state_eint_output1");
	if (IS_ERR(eint_output1)) {
		ret = PTR_ERR(eint_output1);
		TPD_DMESG("Cannot find pinctrl state_eint_output1!\n");
		return ret;
	}
    ... // 省略部分代码
}

(3)定义两个接口函数,参数 pin 为 0 时对复位进行操作,为 1 时对中断进行操作

kernel-4.14/drivers/input/touchscreen/mediatek/mtk_tpd.c:

void tpd_gpio_as_int(int pin)
{
	mutex_lock(&tpd_set_gpio_mutex);
	if (pin == 1)
		pinctrl_select_state(pinctrl1, eint_as_int);
	mutex_unlock(&tpd_set_gpio_mutex);
}

void tpd_gpio_output(int pin, int level)
{
	mutex_lock(&tpd_set_gpio_mutex);
	if (pin == 1) {
		if (level)
			pinctrl_select_state(pinctrl1, eint_output1);
		else
			pinctrl_select_state(pinctrl1, eint_output0);
	} else {
		if (level)
			pinctrl_select_state(pinctrl1, rst_output1);
		else
			pinctrl_select_state(pinctrl1, rst_output0);
	}
	mutex_unlock(&tpd_set_gpio_mutex);
}

3、使用 TP 框架编写 TP 驱动,以 focaltech IC 为例

(1)根据 TP 框架的要求,驱动对 reset_gpio 和 irq_gpio 进行赋值

static void fts_platform_data_init(struct fts_ts_data *ts_data)
{
    ... // 省略部分代码
    pdata->reset_gpio = 0;
    pdata->irq_gpio = 1;
    ... // 省略部分代码
}

(2)中断注册函数调用 tpd_gpio_as_int 函数

static int fts_irq_registration(struct fts_ts_data *ts_data)
{
    int ret = 0;
    struct device_node *node = NULL;

	// 通过 TP 框架的 touch_of_match 来查找指定的节点
    node = of_find_matching_node(node, touch_of_match);
    if (NULL == node) {
        return -ENODATA;
    }
    ts_data->thread_tpd = kthread_run(touch_event_handler, 0, TPD_DEVICE);
    if (IS_ERR_OR_NULL(ts_data->thread_tpd)) {
        ret = PTR_ERR(ts_data->thread_tpd);
        ts_data->thread_tpd = NULL;
        return ret;
    }
	// 将中断 pin 设置为中断状态
    tpd_gpio_as_int(ts_data->pdata->irq_gpio);
    ts_data->irq = irq_of_parse_and_map(node, 0);
    ts_data->pdata->irq_gpio_flags = IRQF_TRIGGER_FALLING;
    ret = request_irq(ts_data->irq, fts_irq_handler, 
				ts_data->pdata->irq_gpio_flags, FTS_DRIVER_NAME, ts_data);
    fts_irq_enable();
	
    return ret;
}

(3)复位函数调用 tpd_gpio_output 函数

int fts_reset_proc(void)
{
	// 复位 pin 输出低电平
    tpd_gpio_output(fts_data->pdata->reset_gpio, 0);
    msleep(1);
	// 复位 pin 输出高电平
    tpd_gpio_output(fts_data->pdata->reset_gpio, 1);
    msleep(200);
    return 0;
}

以上介绍了 mtk 平台 TP 驱动框架对触摸 IC 复位和中断的封装,并以 focaltech IC 为例介绍了其在 TP 驱动中的使用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_79950866/article/details/133395723

智能推荐

小白上路_小白成功上路-程序员宅基地

文章浏览阅读220次。这是我算是正式进入这个行业的第一份工作,这篇博客也算是我作为程序员的第一篇博客。心里很激动,用很多话想说,但是又不知道该从何说起。从开始因为自己的一点兴趣,和家里商量之后学习了一个可以说是和我大学专业没什么关系的java开始,因为不是计算机专业的科班出身,所以当一开始的兴趣被各种专业名词、属于、逻辑消耗殆尽时,真的怀疑过自己是不是干这个的材料,怀疑自己是不是做了一个错误的决定,走了一条根本不属于我..._小白成功上路

使用python对微博评论进行分词、文本聚类_微博评论分词-程序员宅基地

文章浏览阅读1.6w次,点赞37次,收藏342次。分词、文本聚类前言一、事前准备二、分词、聚类1.读取文本内容2.jieba分词3.去停用词4.生成tfidf矩阵5.K-means聚类6.得出各分类文本的主题前言爬取了微博博文和发文时间后,进行简单的文本分析。总体思路:jieba分词、去停用词、K-means聚类、选出各类的主题词(附上我前面写的爬取微博内容的方法:python+selenium 爬取微博(网页版)并解决账号密码登录、短信验证 )这里简单起见,选择了104条文本。每行是微博博文、发文时间。一、事前准备python3.7、py_微博评论分词

nRF52832无协议栈下软件定时器的使用_nrf52832 sdk_config.h 无nrf_ble_scan_filter_enable-程序员宅基地

文章浏览阅读810次,点赞4次,收藏4次。nRF52832无协议栈下软件定时器的使用编译器及例程说明sdk_config.h配置说明一、日志初始化二、空闲状态处理三、LED GPIO配置四、定时器1超时处理五、定时器2超时处理六、定时器初始化七、启动定时器八、低频时钟配置(LFCLK)九、主函数十、例程结果编译器及例程说明1. nRF支持包 : NordicSemiconductor.nRF_DeviceFamilyPack.8.17.0.pack2. ARM支持包 : ARM.CMSIS.4.5.0.pack3. Toolchain _nrf52832 sdk_config.h 无nrf_ble_scan_filter_enable

php挂载webdav,phpweb服务器开启了WebDAV的关闭方法-程序员宅基地

文章浏览阅读450次。Microsoftwindows2000/XP及IE,Office还有Adobe/MacroMedia的DW等都支持Webdav,这又大大增强了Web应用的价值,以及效能。对于需要大量发布内容的用户而言,应用WebDav可以降低对CMS系统的依赖,而且能够更自由的进行创作。上传、下载变得轻松自如。Web 分布式创作和版本管理 (WebDAV) 扩展了 HTTP/1.1 协议,允许客户端发布、锁定和..._php访问webdav

IDEA左侧project模式下,不显示项目工程目录,只有几个配置文件_idea左侧为什么没有显示项目文件框架-程序员宅基地

文章浏览阅读6k次。I、问题原因一般为配置文件*.iml 出错了II、解决办法 方法1:找到 出错位置,修复 方法2:清除配置,重新导入 1)关闭IDEA, 2)删除项目文件夹下的.idea文件夹 3)重新用IDEA工具打开项目I、问题原因一般为配置文件*.iml 出错了..._idea左侧为什么没有显示项目文件框架

嵌入式系统网络socket套接字经常使用的网络通信协议?_socket 嵌入式c-程序员宅基地

文章浏览阅读471次。它提供可靠的、面向连接的通信,并确保数据按照正确的顺序和不丢失地传输。TCP/IP协议适用于对数据传输的可靠性和顺序有要求的场景,例如网页浏览、文件传输等。HTTP协议:HTTP(Hypertext Transfer Protocol)是一种基于TCP/IP的应用层协议,用于传输超文本数据,即网页数据。它适用于资源有限的嵌入式设备和传感器之间的通信,并具有低功耗和带宽效率高的特点。TCP/IP和UDP协议是最常见和通用的选择,HTTP协议适用于Web数据交互,而MQTT协议则适合物联网领域的通信需求。_socket 嵌入式c

随便推点

斐讯 N1 降级、刷机及 Armbian 安装 [2019.7.23]_斐讯n1官方降级工具-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏19次。最前最近捡垃圾不断,之前购买了斐讯遗产 K2P(真香,最近刷了 OpenWrt)、T1(刷了电视盒子)和蜗牛星际(刷了黑群晖),最近又捡了台斐讯 N1,主要用于做一些简单的爬虫和 Adguard Home 服务。其实原先有过一台树莓派 3B,但是 emmmm 吃灰了一年,然后二手卖了。虽然近期树莓派 4 发布了,性能有较大提升,但由于价格的原因,还是 N1 香。刷机过程由于已有的几篇文章有些内容..._斐讯n1官方降级工具

Linux服务器移动文件命令_linux移动文件命令-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏7次。Linux服务器移动文件命令_linux移动文件命令

123-程序员宅基地

文章浏览阅读163次。阵容:4冰川(狂战士4、背叛者1、绝命巫师2、占卜师3) 占4人口3战士(船长4+随便一个战士,有钱就买末日审判官4) 占2人口2术士甚至4术士(灵魂收割4、暗之灵5、不免预言家5) 占1\3人口2刺客(光羽刺客4、幽影刺客3)刺客是有冰川加攻速也很厉害 占2人口阵容核心就是狂战士,2星是基本,3星就无敌。配合暗之灵可以融化对面。曾经的骑士的抗性持续3秒,6骑3龙+暗之灵...

OpenCV Learning: IplImage三个单通道与单个通道的转换_iplimage 通道转换-程序员宅基地

文章浏览阅读1.1k次。#include "stdafx.h" #include #include using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { //从文件中读入图像 clock_t start,finish; start=clock_iplimage 通道转换

最优化方法:拉格朗日乘数法-程序员宅基地

文章浏览阅读344次。http://blog.csdn.net/pipisorry/article/details/52135854 解决约束优化问题——拉格朗日乘数法 拉格朗日乘数法(Lagrange Multiplier Method)应用广泛,可以学习麻省理工学院的在线数学课程。 拉格朗日乘数法的基本思..._优化问题的数学模型 拉格朗日 标准型

三维高斯积分点坐标及权系数表_高斯积分法 权系数表-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏6次。Point x y z Weight 1 0 0 0 8 Point x y z Weight 1 -0.5773502692 -0.5773502692 0.5773502692 1.0000000000 2 0.5773502692 -0.5773502692 0.5773502692 1.0000000000 3 0.5773502692 0.5773_高斯积分法 权系数表

推荐文章

热门文章

相关标签