Chinaunix首页 | 论坛 | 博客
  • 博客访问: 401589
  • 博文数量: 107
  • 博客积分: 2536
  • 博客等级: 少校
  • 技术积分: 783
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-14 15:19
文章分类

全部博文(107)

文章存档

2017年(11)

2016年(8)

2015年(14)

2014年(32)

2012年(1)

2011年(1)

2010年(7)

2009年(33)

我的朋友

分类: LINUX

2009-07-23 17:25:51

移植 JXARM9-2410触摸屏驱动

之前参考网上有关S3C2410的触摸屏驱动,大家好像都是这不是很难,但是我照着做,就不是很成功呢。

 

工作环境:

Host Linux: 2.4.20-8

arm-linux-gcc version 3.4.4

Target Linux: 2.6.14

Target Board: JXARM9-2410

 

主要参考以下内容:

S3c2410触摸屏驱动移植 for linux2.6.14内核

蓝色字是我加上去的。

 

linux2.6.14中没有提供s3c2410_ts的驱动,所以我们要新建驱动文件,我们在

linux2.6.14/drivers/input/touchscreen目录下建立新的文件s3c2410_ts.c文件,在include/asm/arch/s3c2410_ts.h文件(源码见附件)

首先:我们需要修改linux2.6.14/drivers/input/touchscreen目录下的makefile文件,在文件的最后添加:
obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
第二:我们需要修改linux2.6.14/drivers/input/touchscreen/Kconfig中添加:
config TOUCHSCREEN_S3C2410
tristate "Samsung S3C2410 touchscreen input driver"
depends on ARCH_SMDK2410 && INPUT && INPUT_TOUCHSCREEN
select SERIO
help
Say Y here if you have the s3c2410 touchscreen.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called s3c2410_ts.
config TOUCHSCREEN_S3C2410_DEBUG
boolean "Samsung S3C2410 touchscreen debug messages"
depends on TOUCHSCREEN_S3C2410
help
Select this if you want debug messages
修改完成以后,在我们配置内核的时候,就会增加关系s3c2410的触摸屏配置,我们选择上这些配置就可以把驱动增加进去了
Device drivers –>
Input device support –>

    <*>   Touchscreen interface         
    (480)   Horizontal screen resolution 
    (640)   Vertical screen resolution   
    <*>   Event interface                
    <*>   Event debugging

          如果不加几项的话会的一些让人很难以理解的问题出现:(见最后) 
Touchscreens –>
    <*>Samsung S3C2410 touchscreen input driver
    []Samsung s3c2410 touchscreen debug message            

第三:在/linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c,中增加如下内容:
static struct s3c2410_ts_mach_info sbc2410_ts_cfg __initdata = {
.delay = 10000,
.presc = 49,
.oversampling_shift = 2,
};
smdk2410_devices结构中添加:
&s3c_device_ts,
smdk2410_map_io函数中添加:
set_s3c2410ts_info(&sbc2410_ts_cfg);
第四:在/linux-2.6.14/arch/arm/mach-s3c2410/devs.h文件中添加:
extern struct platform_device s3c_device_ts;
第五:在/linux-2.6.14/arch/arm/mach-s3c2410/devs.c文件中添加如下几行:
#include 3c2410_ts.h>


/* Touchscreen */
static struct s3c2410_ts_mach_info s3c2410ts_info;
void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
{
   memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));
}
EXPORT_SYMBOL(set_s3c2410ts_info);
struct platform_device s3c_device_ts = {
   .name = "s3c2410-ts",
   .id = -1,
   .dev =
   {
       .platform_data = &s3c2410ts_info,
   }
};
EXPORT_SYMBOL(s3c_device_ts);

 

第六:在/linux-2.6.14/include/asm-arm/arch-s3c2410/regs-adc.h文件中添加如下几行:
define S3C2410_ADCTSC_XY_PST(x)        (((x)&0x3)<<0)      // wbzh


经过这些修改,我们的触摸屏驱动已经完成,我们编译就可以了。我们的这个触摸屏驱动在内核注册为/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有值(一些很大的数),而Y0

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_KEYEV_RELEV_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/2008/03/24/2213976.aspx
s3c2410触摸屏驱动(2.6内核)分析:http://blog.csdn.net/hecant/archive/2008/03/24/2213985.aspx

阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~