linux2.6.37.4内核在2440开发板上移植 触摸屏驱动移植

内核自带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子系统驱动也是同样的原理,这点请注意。

http://blog.chinaunix.net/uid-22030783-id-3023527.html

你可能感兴趣的:(linux2.6.37.4内核在2440开发板上移植 触摸屏驱动移植)