分类: LINUX
2009-07-23 17:25:51
移植 JXARM9-2410触摸屏驱动
之前参考网上有关S
工作环境:
Host Linux:
arm-linux-gcc version
Target Linux:
Target Board: JXARM9-2410
主要参考以下内容:
S
蓝色字是我加上去的。
在linux
linux
首先:我们需要修改linux2.6.14/drivers/input/touchscreen目录下的makefile文件,在文件的最后添加:
obj-$(CONFIG_TOUCHSCREEN_S
第二:我们需要修改linux2.6.14/drivers/input/touchscreen/Kconfig中添加:
config TOUCHSCREEN_S
tristate "Samsung S
depends on ARCH_SMDK2410 && INPUT && INPUT_TOUCHSCREEN
select SERIO
help
Say Y here if you have the s
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called s
config TOUCHSCREEN_S
boolean "Samsung S
depends on TOUCHSCREEN_S
help
Select this if you want debug messages
修改完成以后,在我们配置内核的时候,就会增加关系s
Device drivers –>
Input device support –>
<*> Touchscreen interface
(480) Horizontal screen resolution
(640) Vertical screen resolution
<*> Event interface
<*> Event debugging
如果不加几项的话会的一些让人很难以理解的问题出现:(见最后)
Touchscreens –>
<*>Samsung S
[]Samsung s
第三:在/linux-
static struct s
.delay = 10000,
.presc = 49,
.oversampling_shift = 2,
};
在smdk2410_devices结构中添加:
&s
在smdk2410_map_io函数中添加:
set_s
第四:在/linux-2.6.14/arch/arm/mach-s
extern struct platform_device s
第五:在/linux-2.6.14/arch/arm/mach-s
#include
/* Touchscreen */
static struct s
void __init set_s
{
memcpy(&s
}
EXPORT_SYMBOL(set_s
struct platform_device s
.name = "s
.id = -1,
.dev =
{
.platform_data = &s
}
};
EXPORT_SYMBOL(s
第六:在/linux-
define S
经过这些修改,我们的触摸屏驱动已经完成,我们编译就可以了。我们的这个触摸屏驱动在内核注册为/dev/input/ts0。
在我有板子上/dev/input/有:
# ls -al /dev/input/
drwxr-xr-x 1 0 0 0 Jan 1 00:00 .
drwxr-xr-x 1 0 0 0 Jan 1 00:00 ..
crw-r--r-- 1 0 0 13, 64 Jan 1 00:00 event0
crw-r--r-- 1 0 0 13, 128 Jan 1 00:00 ts0
crw-r--r-- 1 0 0 13, 144 Jan 1 00:00 tsraw0
这三个设备文件不知道有什么区别,我自己写了个测试程序(源码见附件)用的是/dev/ts0,可以把坐标值读出来。初步打算移植MiniGUI1.6来当GUI。好像MiniGUI中的触摸屏的校正程序呢。
未加载QT之前,系统启动完后,按触摸屏,能够响应中断,并且能看到坐标,但是之后再去按,就没反应了。
如果在内核配置中没有这几项的话会的一些让人很难以理解的问题出现:
<*> Touchscreen interface
(480) Horizontal screen resolution
(640) Vertical screen resolution
<*> Event interface
<*> Event debugging
出现问题有:
1.在/dev/input下没有正常的那三个设备文件,而只有
crw-r--r-- 1 0 0 13, 32 Jan 1 00:00 mouse0
2.用我测试程序获得到的坐标值X有值(一些很大的数),而Y为0。
3.drivers/input/tsdev.c中的程序没有使用,而同目录中的mousedev.c却使用了,我估计前面的两个错误也是因此而出现的。而至于为什么会用到mousedev.c我还没有搞清楚。
在解决这个问题的过程中,也看了不少的文章,主要是关于linux 2.6内核中input subsystem的一些内容。总体感觉内核为我们作了不少的工作,写这方面的驱动应该比较省事些,以下为某本书的一段话。
Linux系统 2.6内核 提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动。在Linux 2.6内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event 结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
通过input子系统,具体的输入设备驱动只需要完成如下工作。
1 在模块加载函数中告知input子系统它可以报告的事件。
设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit);
2 在模块加载函数中注册输入设备。
注册输入设备的函数为:
int input_register_device(struct input_dev *dev);
3 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。
主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。
用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别为:
void input_report_key(struct input_dev *dev, unsigned int code, int value);
void input_report_rel(struct input_dev *dev, unsigned int code, int value);
void input_report_abs(struct input_dev *dev, unsigned int code, int value);
input_sync()用于事件同步,它告知事件的接收者驱动已经发出了一个完整的报告。
输入子系统分析: http://blog.csdn.net/hecant/archive/
s