触控屏驱动测试——linux下的 GSL1680驱动开发

192 阅读2分钟

在6818的linux下,编写GSL1680的i2c驱动,加载进内核后能够通过应用测试程序获取到触控点p(x,y)坐标点数据,并实时通过界面显示出来。

进度一

原有驱动应用测试

在现有的linux下已经有一个默认的驱动,那就用C编程,在ubuntu上交叉编译,打开设备点(/dev/input/event0),定义x-y结构体,用read方法将px,py获取坐标数据,使用printf打印出来。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <linux/input.h>

int main(int argc, char* argv[])
{
    // 检查命令行参数是否正确,需要传入一个输入设备文件名
    if(argc != 2)
    {
        printf("Usage: %s <input dev>
", argv[0]);
        return -1;
    }

    // 打开输入设备文件,以只读方式
    int fd = open(argv[1], O_RDONLY);
    if(fd < 0)
    {
        printf("failed to open %s
", argv[1]);
        return -1;
    }

    // 定义一个结构体变量,用于存储输入事件的信息
    struct input_event event;
    // 定义两个变量,用于存储触摸点的x和y坐标
    int x = 0, y = 0;
    // 无限循环,不断读取输入设备的事件
    while(1)
    {        
        // 清空结构体变量的值
        memset(&event, 0, sizeof(event));
        // 从输入设备文件中读取一个事件
        read(fd, &event, sizeof(event));
        // 如果事件类型是同步事件,则跳过本次循环
        if(event.type == EV_SYN)
            continue;

        // 如果事件类型是绝对值事件
        if(event.type == EV_ABS)
        {
            // 如果事件的代码是X轴坐标
            if(event.code == ABS_X)
                x = event.value; // 更新X轴坐标的值
            else if(event.code == ABS_Y) // 如果事件的代码是Y轴坐标
                y = event.value; // 更新Y轴坐标的值
        }
        // 如果事件类型是按键事件
        else if(event.type == EV_KEY)
        {
            // 如果事件的值是1,表示按下了触摸点
            if(event.value == 1)
            {
                printf("touch press (%d,%d)
", x, y); // 输出触摸点的坐标
            }
            // 如果事件的值是0,表示释放了触摸点
            else if(event.value == 0)
            {
                printf("touch release (%d,%d)
", x, y); // 输出触摸点的坐标
                x = 0; // 重置X轴坐标
                y = 0; // 重置Y轴坐标
            }
        }
        else // 如果事件类型不是以上三种,则跳过本次循环
            continue;
    }

    // 关闭输入设备文件
    close(fd);
    return 0;
}

2cf3be679ca607db305036449d719f6.png