• 沒有找到結果。

第 6 章 字符设备驱动程序

6.2 字符设备驱动开发实例

6.2.8 触摸屏的校准

TS_RET data;

if((ts_fd=open(TS_DEV,O_RDONLY))<0) {

printf("Error opening %s device!\n",TS_DEV);

return -1;

}

while(1) {

read(ts_fd,&data,sizeof(data));

printf("x=%d,y=%d,pressure=%d\n",data.x,data.y,data.pressure);

}

return 0;

}

通过阅读上面的测试程序,不难看出驱动程序提供给应用程序的正是那些实现的文件操 作,例如本测试程序类似应用程序,其调用了 open 和 read 方法,而这两个方法的具体实现 是由底层驱动程序实现。通过对触摸屏设备驱动程序的分析,相信读者对字符设备驱动程序 的编写有了更进一步的理解,相信读者通过自身的努力一定能够编写出自己的字符设备驱动 程序。

6.2.8 触摸屏的校准

在实际应用中,触摸屏和显示屏配合作为输入设备,为了能使从触摸屏采样得到的坐标 与屏幕的显示坐标对应,需要一个映射过程,该映射的过程就是触摸屏的校准。函数 TS_Coordinate_Conversion 完成触摸屏采样值转换成显示坐标,根据不同的硬件有不同的转 换方法。理想的触摸屏映射示意图如 6.5 所示,本触摸屏采样坐标及显示坐标与图 6.5 类似。

其中 TS_MAX_X 和 TS_MIN_X 是触摸屏 X 坐标采样值的最大和最小值。这里使用的是 320×240 的 TFT 屏,所以 TFT_X 值为 320,TFT_Y 值为 240。假使触摸屏的最左上角坐标 为(X1,Y1),最右下角坐标为(X2,Y2),显示屏的最左上角坐标为(x1,y1),最右下角坐标 为(x2,y2),由于这里使用的分辨率是 320×240,所以,x2 与 x1的差值是 320,y2与 y1的差 值是 240,假定以左上角坐标为(x1,y1)为原点(0,0)。那么在触摸屏上任意一点(x,y)

的坐标影射到显示屏上坐标(X,Y)的转换公式为:

X=320-[320*(x- X2)/( X1 - X2)];

Y=240-[240*(y- Y2)/( Y1- Y2)];

图 6.5 触摸屏与显示屏的坐标映射 下面是触摸屏中任意一点 x 坐标映射到显示屏的处理程序:

int TS_Coordinate_Conversion(int*x) {

int tempX;

tempX-=X2;

*x=(tempX*TFT_X)/(X1-X2);

*x=TFT_X-*x;

return *x;

}

利用类似的方法可以计算 Y 值坐标的映射,读者可以自己完成。这里使用的触摸屏校 准方法是实际应用中最简单的,因为这里使用的是简单的线形算法,而实际中可能是非线形 的,所以计算方法上要复杂许多,不过由于我们这里并不是学习数学算法,所以只给出了简 单情况下的例子。

6.3 本章小节

本章作为嵌入式 Linux 驱动开发中应用最广泛的字符设备驱动程序进行了详细的讲解,

首先讲述了字符设备驱动中最重要的三个数据结构(file_operations、file 和 inode),然后讲 述主、次设备号的使用,最后重点讲述一个字符设备驱动的典型实例——触摸屏设备驱动,

不仅讲述该设备驱动程序的硬件原理,而且重点讲述了其驱动程序的实现过程。总之,通过 学习本章知识,使读者真正了解字符设备驱动程序的实现过程,从而使读者熟悉了字符设备 驱动程序的实际开发。下一章讲述与字符设备驱动实现方法不同的块设备驱动程序。

(x1,y1) 触摸屏

(x2,y2

(X1,Y1

(X2,Y2) 显示屏

6.4 常见问题

1.结构 file_operations, file 和 inode 在字符设备驱动程序中的作用?

参考答案:file_operations 结构用来定义驱动程序的文件操作,也就是定义驱动程序中底层 实现的方法,如 open, read, write 等。而 file 结构代表一个打开的文件,它由内核在 open 时 创建,并传递给在该文件上进行操作的所有函数,直到最后的 close 函数来释放这个数据结 构。inode 结构表示内部文件,与 file 结构不同,file 表示打开的文件描述符,对单个文件,

可能会有许多打开的文件描述符的 file 结构,但它们都指向单个 inode 结构。

2.在设备驱动程序中,open 方法通常完成哪些工作?

参考答案:在设备驱动程序中,open 方法通常完成以下工作:

ü 检查设备相关错误(诸如设备未就绪或相似的硬件问题)。 ü 如果是首次打开,初始化设备。

ü 标识次设备号,如有必要更新 f_op 指针。

ü 分配和填写要放在 filp->private_data 里的数据结构。

3.根据 6.2.6 节中计算 X 坐标的方法,写出计算 Y 坐标的实现代码?

参考答案:Y 坐标的实现代码如下:

int TS_Coordinate_Conversion(int*y) {

int tempY;

tempY -=Y2;

*y=( tempY *TFT_Y)/ ( Y1- Y2);

*y =TFT_Y-*y;

return *y;

}