Linux2.6内核TouchScreen驱动移植

在 linux2.6.14.1 中没有提供 s3c2410 的驱动,所以我们要新建驱动文件,从网上下载s3c2410_ts.c与s3c2410_ts.h两个文件,将s3c2410_ts.c 文件拷到 linux2.6.14.1/drivers/input/touchscreen 目录下,头文件则拷到源码包的include/asm/arch下,
   首先:我们需要修改 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 -->

                     Touchscreens -->

                      <*>Samsung S3C2410 touchscreen input driver

                      []Samsung s3c2410 touchscreen debug message

第三:在 /linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c, 中增加如下内容:

#include <asm/arch/s3c2410_ts.h>

     static struct s3c2410_ts_mach_info s3c2410_ts_cfg __initdata = {

     .delay = 10000,

     .presc = 49,

     .oversampling_shift = 2,

     };

     在smdk2410_devices结构中,添加:

     &s3c_device_ts,

     在smdk2410_map_io函数中添加:

     set_s3c2410ts_info(&s3c2410_ts_cfg);

第四:在 /linux-2.6.14/ arch/arm/mach-s3c2410/devs.h 文件中添加:

     extern struct platform_device s3c_device_ts;

第五:在arch/arm/mach-s3c2410/devs.c文件中添加如下几行:

    /* Touchscreen */

#include <asm/arch/s3c2410_ts.h>

    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);


以上是参考网上的文章的,但仅此还不够,编译内核会出错,出错信息如下:
[arm@localhost linux-2.6.14.1]$ make zImage
  CHK     include/linux/version.h
make[1]: `include/asm-arm/mach-types.h' is up to date.
  CHK     include/linux/compile.h
  CHK     usr/initramfs_list
  CC      drivers/input/touchscreen/s3c2410_ts.o
drivers/input/touchscreen/s3c2410_ts.c: In function `touch_timer_fire':
drivers/input/touchscreen/s3c2410_ts.c:137: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c:146: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `stylus_action':
drivers/input/touchscreen/s3c2410_ts.c:189: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c:193: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `s3c2410ts_probe':
drivers/input/touchscreen/s3c2410_ts.c:254: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `touch_timer_fire':
drivers/input/touchscreen/s3c2410_ts.c:137: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c:146: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c: In function `stylus_action':
drivers/input/touchscreen/s3c2410_ts.c:189: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c:193: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c: In function `s3c2410ts_probe':
drivers/input/touchscreen/s3c2410_ts.c:254: warning: statement with no effect
make[3]: *** [drivers/input/touchscreen/s3c2410_ts.o] Error 1
make[2]: *** [drivers/input/touchscreen] Error 2
make[1]: *** [drivers/input] Error 2
make: *** [drivers] Error 2
在网上搜也找不到解决方法,后来又搜到了一篇触摸屏驱动移植的文章,里面有说要新建regs-adc.h这个头文件的(言下之意他的linux2.6里没有这个),但我的里面有这个文件,经过对比,发现这个头文件里的一句:#define S3C2410_ADCTSC_XY_PST(x) (((x)&0x3)<<0),而我的2.6里自带的是#define S3C2410_ADCTSC_XY_PST (0x3<<0),改过之后,终于通过了,进入控制台后可以触摸了,并且可以看到这个触摸屏驱动在内核注册为 /dev/input/mouse0
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里是一个Linux内核下UART触摸屏驱动的代码示例: ``` #include <linux/module.h> #include <linux/kernel.h> #include <linux/input.h> #include <linux/serio.h> #define TOUCHSCREEN_NAME "MyTouchscreen" #define TOUCHSCREEN_PHYS "mytouchscreen/input0" static struct serio *serio; static int mytouchscreen_connect(struct serio *serio, struct serio_driver *drv) { int err; printk(KERN_INFO "MyTouchscreen: Connecting to serio...\n"); // 初始化触摸屏 err = serio_open(serio, drv); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to open serio: %d\n", err); return err; } // 注册输入设备 err = input_register_device(input_dev); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to register input device: %d\n", err); serio_close(serio); return err; } printk(KERN_INFO "MyTouchscreen: Touchscreen successfully connected\n"); return 0; } static void mytouchscreen_disconnect(struct serio *serio) { printk(KERN_INFO "MyTouchscreen: Disconnecting from serio...\n"); // 取消注册输入设备 input_unregister_device(input_dev); // 关闭触摸屏 serio_close(serio); printk(KERN_INFO "MyTouchscreen: Touchscreen successfully disconnected\n"); } static const struct serio_device_id mytouchscreen_serio_ids[] = { { .type = SERIO_RS232, .proto = SERIO_PROTO_TOUCHSCREEN, .id = SERIO_ANY_ID, .extra = SERIO_ANY_EXTRA, }, { } }; MODULE_DEVICE_TABLE(serio, mytouchscreen_serio_ids); static struct serio_driver mytouchscreen_drv = { .driver = { .name = TOUCHSCREEN_NAME, .owner = THIS_MODULE, }, .description = "My Touchscreen Driver", .id_table = mytouchscreen_serio_ids, .connect = mytouchscreen_connect, .disconnect = mytouchscreen_disconnect, }; static int __init mytouchscreen_init(void) { int err; // 分配输入设备结构体 input_dev = input_allocate_device(); if (!input_dev) { printk(KERN_ERR "MyTouchscreen: Failed to allocate input device\n"); return -ENOMEM; } // 设置输入设备的属性 input_dev->name = TOUCHSCREEN_NAME; input_dev->phys = TOUCHSCREEN_PHYS; // 设置输入事件 input_set_capability(input_dev, EV_KEY, BTN_TOUCH); input_set_abs_params(input_dev, ABS_X, 0, 1023, 0, 0); input_set_abs_params(input_dev, ABS_Y, 0, 767, 0, 0); // 注册serio驱动 err = serio_register_driver(&mytouchscreen_drv); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to register serio driver: %d\n", err); input_free_device(input_dev); return err; } printk(KERN_INFO "MyTouchscreen: Driver successfully loaded\n"); return 0; } static void __exit mytouchscreen_exit(void) { serio_unregister_driver(&mytouchscreen_drv); input_free_device(input_dev); printk(KERN_INFO "MyTouchscreen: Driver successfully unloaded\n"); } module_init(mytouchscreen_init); module_exit(mytouchscreen_exit); MODULE_AUTHOR("Your Name Here"); MODULE_DESCRIPTION("My Touchscreen Driver"); MODULE_LICENSE("GPL"); ``` 这个驱动使用了Serio子系统来与UART接口通信,并将触摸屏识别为一个输入设备。在触摸屏被连接时,将初始化输入设备并注册到输入子系统;当触摸屏被断开时,将取消注册输入设备并关闭Serio接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值