转载: 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,
构建触摸屏设备的平台数据:
- /* TouchPanel */
-
static struct s3c2410_ts_mach_info xc2440_ts_cfg __initdata = {
-
.delay = 10000,
-
.presc = 49,
-
.oversampling_shift = 2,
- };
在xc2440_machine_init函数中加入:
s3c24xx_ts_set_platdata(&xc2440_ts_cfg);
修改s3c2410_ts.c文件:
在s3c2410ts_probe函数中,318行开始
- ts.input = input_dev;
-
ts.input->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_SYN);
-
ts.input->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);
-
input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0);
-
input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0);
- input_set_abs_params(ts.input, ABS_PRESSURE, 0, 1, 0, 0);
touch_timer_fire函数中:
- input_report_abs(ts.input, ABS_X, ts.xp);
-
input_report_abs(ts.input, ABS_Y, ts.yp);
-
input_report_key(ts.input, BTN_TOUCH, 1);
- input_report_abs(ts.input, ABS_PRESSURE, 1);
-
input_sync(ts.input);
-
input_report_key(ts.input, BTN_TOUCH, 0);
- input_report_abs(ts.input, ABS_PRESSURE, 0);
-
input_sync(ts.input);
- writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC);
配置内核,支持触摸屏:
- Device Drivers --->
- Input devices support --->
- <*> Event interface
- [*] Touchscreens --->
- <*> 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子系统驱动也是同样的原理,这点请注意。