• 【全志T113-S3_100ask】16-1 linux系统驱动四线电阻屏(tpadc、tslib)


    (一)背景

    上一小节,使用了内核驱动了 ili9341 ,但是上面的电阻屏并还没有驱动,查阅芯片数据手册,该芯片支持驱动四线触摸屏
    在这里插入图片描述
    buildroot已经支持,官方设备树已经配置好。

    	rtp:rtp@2009c00 {
    		compatible = "allwinner,sun8i-ts";
    		reg = <0x0 0x02009c00 0x0 0x400>;
    		clocks = <&ccu CLK_TPADC>, <&ccu CLK_BUS_TPADC>;
    		clock-names = "mod", "bus";
    		clock-frequency = <1000000>;
    		resets = <&ccu RST_BUS_TPADC>;
    		interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
    	};
    	
    	
    	&rtp {
    		allwinner,tp-sensitive-adjust = <0xf>;
    		allwinner,filter-type = <0x1>;
    		allwinner,ts-attached;
    		status = "okay";
    	};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    触摸屏设备就在 /dev/input/event1
    hexdump测试一下
    在这里插入图片描述

    触摸屏没接当然没数据啦

    (二)焊接鬼才

    那就手动把触摸屏的四根线焊上去吧(别接错了)
    1、先把芯片拆下来把,这么小的引脚好像不好焊接。。。。。。(能画pcb的老老实实画,我这是贪玩)

    在这里插入图片描述
    然后把杜邦线焊上去
    在这里插入图片描述
    嗯,看起来没短路,然后接到核心板的对应引脚上
    在这里插入图片描述

    hexdump测试一下
    在这里插入图片描述此此时按下触摸屏就会有数据,但是这些数据似乎看不懂

    (三)解析input上报事件

    以下图片来源于100ask
    在这里插入图片描述
    其中,如果type为0001,则为x轴,0003则为y轴,value为对应的值

    (四)C语言解析input上报事件

    #include "stdio.h"
    #include "unistd.h"
    #include "sys/types.h"
    #include "sys/stat.h"
    #include "fcntl.h"
    #include "stdlib.h"
    #include "string.h"
    #include 
    
    /* 定义按键值 */
    #define KEY0VALUE 0XF0
    #define INVAKEY 0X00
    
    typedef struct posi
    {
        int x;
        int y;
    };
    
    int main(int argc, char *argv[])
    {
        struct input_event in_ev = {0};
        int fd, ret;
        int keyvalue;
        struct posi xxyy = {0};
    
        /* 打开key驱动 */
        fd = open("/dev/input/event1", O_RDWR);
        if (fd < 0)
        {
            perror("open /dev/input/event1");
            return -1;
        }
    
        while (1) /* 循环读取数据 */
        {
    
            if (sizeof(struct input_event) != read(fd, &in_ev, sizeof(struct input_event)))
            {
                perror("read error");
                exit(-1);
            }
    
            if (EV_ABS == in_ev.type) // 触摸屏事件
            {
    
                if (in_ev.code == 1)
                    xxyy.x = in_ev.value;
                if (in_ev.code == 0)
                    xxyy.y = in_ev.value;
            }
            if (xxyy.x != 0 && xxyy.y != 0)
            {
                printf("x: %d  y: %d\n", xxyy.x, xxyy.y);
                xxyy.x = 0;
                xxyy.y = 0;
            }
        }
    
        ret = close(fd); /* 关闭文件 */
        if (ret < 0)
        {
            printf("file %s close failed!\r\n", argv[1]);
            return -1;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • makefile 记得链接 lts
      下面点击屏幕的四个点进行坐标获取
      在这里插入图片描述
      但是实际上这个是我们采集的adc的值,原则上我们需要将其转化为我们的坐标值
      以下内容是参考借鉴的思路
      在这里插入图片描述
      其实实际上并没有这么简单,如果用过电阻触摸屏手机的都知道,有时候点击屏幕并不准了,需要进行校准操作什么的。
      为简单了解过程,下面直接使用tslib进行实验

    (五)tslib的使用

    1、tslib框架

    参考100ask
    tslib的主要代码如图所示
    在这里插入图片描述

    • 核心在于“plugins”目录里的“插件”,或称为“module”。这个目录下的每个文件都是一个module,每个module都提供2个函数:read、read_mt,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。
    • 要分析tslib的框架,先看看示例程序怎么使用,我们参考ts_test.c和ts_test_mt.c,前者用于一般触摸屏(比如电阻屏、单点电容屏),后者用于多点触摸屏。
    • 一个图就可以弄清楚tslib的框架:
      在这里插入图片描述
      好吧,我没看懂。。。直接实操测试吧

    2、tslib命令行测试

    记得在buildroot开启tslib

    Target packages  --->
    	Libraries  --->
    		Hardware handling  --->
    			[*] tslib
    
    • 1
    • 2
    • 3
    • 4

    先配置环境

    export TSLIB_TSDEVICE=/dev/input/event1
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中:

    • export TSLIB_TSDEVICE=/dev/input/event1 # 触摸屏设备文件
    • export TSLIB_CALIBFILE=/etc/pointercal # 指定触摸屏校准文件pintercal的存放位置
    • export TSLIB_CONFFILE=/etc/ts.conf # tslib模块配置文件
    • export TSLIB_PLUGINDIR=/usr/lib/ts/ # tslib插件库目录
    • export TSLIB_CONSOLEDEVICE=none # 控制台设置
    • export TSLIB_FBDEVICE=/dev/fb0 # framebuffer设备文件

    1)ts_calibrate 触摸屏校准

    在这里插入图片描述

    2)ts_print 坐标打印

    从一个角落滑到另一个角落,与[0,0]—>[240,320]非常接近!
    在这里插入图片描述

    3)ts_test 涂鸦

    在这里插入图片描述

    (六)后记

    1、感觉触摸屏input上报的时间很久,感觉很久才触发一次坐标值,是tpadc的配置有问题吗?
    2、下次使用xpt2046或者ns2009/ns2016测试一下是否会流畅很多(可惜我的芯片拆掉不知道扔哪去了)
    3、多动手折腾一下【狗头】
    4、如何手写坐标校准呢?如何存储呢?

  • 相关阅读:
    <git>如何快速上手并高效协同
    Vuex 组件间通讯
    数据结构:LinkedList类和链表
    聚类算法学习笔记(一)
    零基础自学SQL课程 | 子查询
    MySQL常见配置参数及命令
    HTTP服务器
    关于javaFx tableView组件绑定Map数据
    Steam游戏怎么选服务器
    【JAVA基础】JDK8 HashMap 源码深度解析
  • 原文地址:https://blog.csdn.net/qq_46079439/article/details/128098423