转载: linux2.6.37.4内核在XC2440开发板上移植(六)之触摸屏驱动移植

来自:http://blog.chinaunix.net/uid-22030783-id-3023527.html
 
内核自带s3c2440的触摸屏控制器驱动,属于input子系统的驱动,触摸屏驱动需要ADC驱动的支持,触摸屏驱动文件为:drivers/input/touchscreen/s3c2410_ts.c
 
在mach-xc2440.c文件中加入对触摸屏驱动的支持, 创建s3c2410_ts_mach_info平台数据
 
加入必要的头文件:
#include <plat/ts.h>
 
xc2440_devices[ ]结构体中加入:
&s3c_device_ts,
 
构建触摸屏设备的平台数据:
  1. /* TouchPanel */
  2. static struct s3c2410_ts_mach_info xc2440_ts_cfg __initdata = {
  3.     .delay = 10000,
  4.     .presc = 49,
  5.     .oversampling_shift = 2,
  6. };
 
在xc2440_machine_init函数中加入:
s3c24xx_ts_set_platdata(&xc2440_ts_cfg);
 
修改s3c2410_ts.c文件:
在s3c2410ts_probe函数中,318行开始
  1. ts.input = input_dev;
  2. ts.input->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_SYN);
  3. ts.input->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);
  4. input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0);
  5. input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0);
  6. input_set_abs_params(ts.input, ABS_PRESSURE, 0, 1, 0, 0);
 
touch_timer_fire函数中:
  1. input_report_abs(ts.input, ABS_X, ts.xp);
  2. input_report_abs(ts.input, ABS_Y, ts.yp);
  3. input_report_key(ts.input, BTN_TOUCH, 1);
  4. input_report_abs(ts.input, ABS_PRESSURE, 1);
  5. input_sync(ts.input);
  6. input_report_key(ts.input, BTN_TOUCH, 0);
  7. input_report_abs(ts.input, ABS_PRESSURE, 0);
  8. input_sync(ts.input);
  9. writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC);
 
配置内核,支持触摸屏:
  1. Device Drivers --->
  2.     Input devices support --->
  3.         <*> Event interface
  4. [*] Touchscreens --->
  5. <*> Samsung S3C2410/generic touchscreen input driver
 
启动时输出:
samsung-ts s3c2440-ts: driver attached, registering input device
input: S3C24XX TouchScreen as /devices/virtual/input/input0
 
查看设备:
/dev/event0
 
说明: 
1. 内核自带的触摸屏驱动有BUG,需要修改才能正常使用,具体修改内容请参考XC2440的linux源码包中的s3c2410_ts.c文件。
2. Input子系统设备的设备名可能会随着内核中input设备的增加而改变,比如内核中加入一个按键驱动,那么触摸屏的设备名可能会从event0变为event1。后面移植的input子系统驱动也是同样的原理,这点请注意。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。