本节主要是说一下触摸屏驱动的编写. 触摸屏输入输入设备,所以我们本次通过输入子系统的方式来实现,输入子系统的框架图如下:
然后,我们看一线电路图的触摸屏部分:
可以看到触摸屏是通过I2C接口进行数据和命令的传输,接在了i2c1上面,然后,同时接了一个中断引脚,这个中断引脚主要是在初始化和有数据时使用,比如当用户按下触摸屏产生信息后,首先会产生一个中断,告诉soc有数据来了,这个我们就可以把相关驱动设置为中断响应方式,而不必用轮询的方式来做,这样可以大大提高代码质量和为CPU减负,当然,其实还有一种途径就是直接通过i2c产生中断,这种方式在STM32用的是比较平常的,这里则没有这么用,接下来,我们需要在mach-tiny4412.c里配置i2c1数组,实际上,友善之臂已经移植好了,然后,我们重点关注驱动本身的实现,通过查看友善之臂提供的文档,发现,其实相关的触摸屏驱动已经给我们写好了,我用的是X710的屏幕,此屏幕友善之臂没有资料,所以,还是按照老套路来,直接查看源代码,来猜测相关信息是什么.
通过查看tiny4412-lcds.c发现如下数组:
static struct {
char *name;
struct s3cfb_lcd *lcd;
int ctp;
} tiny4412_lcd_config[] = {
{ "HD700", &wxga_hd700, 1 },
{ "HD701", &wxga_hd700, 1 },
{ "S70", &wvga_s70, 1 },
{ "S702", &wvga_s70, 1 },
{ "S70D", &wvga_s70d, 1 },
{ "W50", &wvga_w50, 0 },
{ "W101", &wsvga_w101, 1 },
{ "X710", &wsvga_x710, CTP_ITE7260 },
{ "A97", &xga_a97, 0 },
{ "LQ150", &xga_lq150, 1 },
{ "L80", &vga_l80, 1 },
{ "HD101", &wxga_hd101, 1 },
{ "BP101", &wxga_bp101, 1 },
{ "HDM", &hdmi_def, 0 }, /* Pls keep it at last */
};
我们用的是X710,所以,数组中的第7项的第3个成员是CTP_ITE7260,那对应的触摸屏驱动应该是和CTP_ITE7260有关的驱动了,通过查看源代码的驱动目录:\drivers\input\touchscreen在这个目录下发现了it7260_mts.c这个文件,这个就是X710对应的触摸屏的驱动程序了,我们make menuconfig,然后在Device Drivers --->Input device support --->Touchscreens --->选中里面的ITE it7260 TouchScreen driver.
之后,为了尽快看到演示效果,本此不写测试程序了,直接让触摸屏驱动打印log,直接查看log对不对就好了,所以,我们需要修改it7260_mts.c这个程序,主要是如下两个地方,如下:
it7260_ts_poscheck() @ it7260_mts.c
(1)
printk(KERN_DEBUG "it7260: key number %d\n", buf[1]);
改为:
printk("it7260: key number %d\n", buf[1]);
(2)
#if 0
printk("finger %d > (%4d, %4d), event = %d\n",
i, ypos[i], xpos[i], event[i]);
#endif
改为:
if 1
...
#endif
之后再把tiny4412-lcds.c文件里做如下修改:
unsigned int tiny4412_get_ctp(void)
{
+++ lcd_idx = 7;
if (tiny4412_lcd_config[lcd_idx].ctp)
return ctp_type;
else
return CTP_NONE;
}
然后make -j4重新编译新的内核,然后把内核放入T卡启动它,就可以看到如下效果:
当然,如果这么简单,就不用写这篇博客了,接下来,让我们自己去实现触摸屏的驱动,因为没有资料,有一些关于寄存器的操作都是参考原来的it7260_mts.c中的内容.相关驱动程序如下(关键地方都给出了注释,所以程序就不讲了):
/**
* 本例程是it7260触摸屏驱动程序
* 物理器件这边引出的是i2c