在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;
}