触摸屏驱动的移植

流程

注意:看框架图

1.添加input.c组件

Device Drivers  --->
 Input device support  --->
  Generic input layer (needed for keyboard, mouse, ...)

2.添加evdev.c组件

Device Drivers  --->
 Input device support  --->
  <*>   Event interface

3.添加s3c2410_ts.c触摸屏驱动

修改driver/input/touchscreen/Kconfig

config TOUCHSCREEN_S3C2410
         tristate "Samsung S3C2410/generic touchscreen input driver"
         depends on ARCH_S3C2410 || SAMSUNG_DEV_TS || ARCH_S5PC100  //后面的ARCH_S5PC100为新添加的
         select S3C_ADC
         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

配置内核选项

Device Drivers--->
 Input device support  --->
   -*- Generic input layer (needed for keyboard, mouse, ...)
   [*] Touchscreens  --->
        <*>Samsung S3C2410/generic touchscreen input driver

4.添加设备资源(dev-ts.c)

vi arch/arm/mach-s5pc100/Kconfig

config MACH_SMDKC100
          bool "SMDKC100"
          select CPU_S5PC100
          select S3C_DEV_FB
          select S3C_DEV_I2C1
          select S3C_DEV_HSMMC
          select S3C_DEV_HSMMC1
         select S3C_DEV_HSMMC2
          select S5PC100_SETUP_FB_24BPP
          select S5PC100_SETUP_I2C1
          select S5PC100_SETUP_SDHCI
          select S3C_DEV_LED
          select S3C_DEV_RTC
         select SAMSUNG_DEV_TS    //添加的内容
        help
           Machine support for the Samsung SMDKC100

vi arch/arm/mach-s5pc100/mach-smdkc100.c

#,
 .oversampling_shift ,
};
static struct platform_device *smdkc100_devices[] __initdata = {
         &s3c_device_i2c0,
         &s3c_device_i2c1,
         &s3c_device_fb,
         &s3c_device_hsmmc0,
         &s3c_device_hsmmc1,
         &s3c_device_hsmmc2,
         &smdkc100_lcd_powerdev,
         &s5pc100_device_iis0,
         &s5pc100_device_ac97,
 
 #ifdef  CONFIG_DM9000
         &s5pc100_device_dm9000,
 #endif
 
  &fsled_device,
         &s3c_device_rtc,
         &s3c_device_ts,    //添加的内容
 };
 
static void __init smdkc100_machine_init(void)
{
 ...
 s3c24xx_ts_set_platdata(&s5pc_tscfg);     //s3c_device_ts.dev.platform_data =&s5pc_tscfg 
 ...
}

5.修改头文件

vi arch/arm/mach-s5pc100/include/mach/map.h

6.添加adc资源(dev-adc.c)

vi arch/arm/mach-s5pc100/Kconfig

config MACH_SMDKC100
          bool "SMDKC100"
          select CPU_S5PC100
          select S3C_DEV_FB
          select S3C_DEV_I2C1
          select S3C_DEV_HSMMC
          select S3C_DEV_HSMMC1
   select S3C_DEV_HSMMC2
          select S5PC100_SETUP_FB_24BPP
          select S5PC100_SETUP_I2C1
          select S5PC100_SETUP_SDHCI
          select S3C_DEV_LED
          select S3C_DEV_RTC
   select SAMSUNG_DEV_TS    
    select SAMSUNG_DEV_ADC //添加的内容
        help
           Machine support for the Samsung SMDKC100

vi arch/arm/mach-s5pc100/mach-smdkc100.c

static struct platform_device *smdkc100_devices[] __initdata = {
         &s3c_device_i2c0,
         &s3c_device_i2c1,
         &s3c_device_fb,
         &s3c_device_hsmmc0,
         &s3c_device_hsmmc1,
         &s3c_device_hsmmc2,
         &smdkc100_lcd_powerdev,
         &s5pc100_device_iis0,
         &s5pc100_device_ac97,
 
 #ifdef  CONFIG_DM9000
         &s5pc100_device_dm9000,
 #endif
 
   &fsled_device,
         &s3c_device_rtc,
         &s3c_device_ts,    
   &s3c_device_adc //添加的内容 
 };

测试方式

测试方法1.驱动调试

在触摸屏驱动中s3c2410_ts.c文件的,触摸屏中断服务程序中添加如下代码

static irqreturn_t stylus_irq(int irq, void *dev_id)
{
 printk(KERN_INFO "%s():%d\n",__func__,__LINE__);
 ...
}

当点击触摸屏的时候,出现如下现象:

stylus_irq()
s3c_adc_start: failed to find adc  //找不到ADC

问题解决:分析s3c_adc_start函数

struct adc_device *adc = adc_dev;  //说明adc_dev为空
if (!adc) {
 printk(KERN_ERR "%s: failed to find adc\n", __func__);
 return -EINVAL;
}

搜索adc_dev

int s3c_adc_probe(struct platform_device *pdev)   //由此可见,probe函数没执行,猜测,匹配不成功
 adc_dev = adc;
static struct platform_device_id s3c_adc_driver_ids[] = {
 {
  .name           = "s3c24xx-adc",
  .driver_data    = TYPE_S3C24XX,
 },{
  .name           = "s3c64xx-adc",
  .driver_data    = TYPE_S3C64XX,
 },
 { }
};
static struct platform_driver s3c_adc_driver = {
 .id_table = s3c_adc_driver_ids,   //按id.name匹配
 .driver  = {
  .name = "s3c-adc",
  .owner = THIS_MODULE,
 },
 .probe  = s3c_adc_probe,
 .remove  = __devexit_p(s3c_adc_remove),
 .suspend = s3c_adc_suspend,
 .resume  = s3c_adc_resume,
};

但是在dev-adc.c文件

,
 .num_resources = ARRAY_SIZE(s3c_adc_resource),
 .resource = s3c_adc_resource,
};

解决方法:

static struct platform_device_id s3c_adc_driver_ids[] = {
 {
  .name           = "s3c24xx-adc",
  .driver_data    = TYPE_S3C24XX,
 },{
  .name           = "s3c64xx-adc",
  .driver_data    = TYPE_S3C64XX,
 },{
  .name           = "samsung-adc",
  .driver_data    = TYPE_S3C64XX,
 },
 { }
};

测试方法2:移植tslib库:校准程序

2.1 tslib库的移植

1.拷贝tslib-1.4.tar.gz到ubutun的工作目录,如/home/jason/project

2.解压缩
        tar -xvf tslib-1.4.tar.gz

3.配置

 sudo apt-get install autoconf
 sudo apt-get install libtool
 cd tslib
 ./autogen.sh
 mkdir tmp
 echo "ac_cv_func_mallo_0_nonnull=yes">arm-unknown-linux-gnueabi.cache
 ./configure --host=arm-unknown-linux-gnueabi --prefix=$(pwd)/tmp --cache-file=arm-unknown-linux-gnueabi.cache

4.编译(make)

make的时候会出现如下错误:
 ts_test.c:(.text+0x1e4): undefined reference to `rpl_malloc'
 解决方法:将config.h.in里的 #undef malloc屏蔽掉  

5.安装
      make install

6.cd tmp 
      cp * /opt/rootfs

7.cd /opt/rootfs/lib
      mkdir ts

8.cp tslib/plugins  /opt/wlwfs/lib/ts

9.修改/opt/wlwfs/etc/ts.conf第一行(去掉#号和第一个空格)
      #module_raw input
      改为
      module_raw input

10.修改etc/profile文件
      vi  etc/profile
      在其中添加如下代码

export TSLIB_TSDEVICE=/dev/event0   
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=/dev/tty
export TSLIB_FBDEVICE=/dev/fb0    //lcd   

记得执行:
        source etc/profile

2.2 移植LCD驱动

vi linux-2.6.35.5/driver/video/Kconfig

config FB_S3C
         tristate hardware windows whereas the S3C24XX series
           currently only have two.
           Currently the support is only for the S3C6400 and S3C6410 SoCs.

make menuconfig

Location-color Linux logo (NEW)

编译内核:
        make zImage

2.3 运行tslib库

ts_calibrate    , yres    //现象
selected device is not a touchscreen I understand

问题1:屏幕大小不对(480*272)
    问题2:tslib库认为我们的设备不是触摸屏设备

解决问题1:

修改大小 
    vi arch/arm/mach_s5pc100/mach_smdkc100.c

))),
                 .left_margin    ,
                 .right_margin   ,
                 .upper_margin   ,
                 .lower_margin   ,
                 .hsync_len      ,
                 .vsync_len      ,
                 .xres           ,  
                 .yres           ,  
         },
         .max_bpp        ,
         .default_bpp    ,
};
解决问题2:

到tslib库里面,搜索selected device is not a touchscreen I understand看它怎么样认为才是一个触摸屏设备

plugins/input-raw.c:61:         fprintf(stderr, "selected device is not a touchscreen I understand\n");
    vi plugins/input-raw.c +61

) , sizeof(bit) ), ) ), ) << ABS_PRESSURE)))) {
                  fprintf(stderr, "selected device is not a touchscreen I understand\n");
          }

由上面的代码可知,触摸屏应该还要产生压力事件
    所以,我们应该修改触摸屏驱动,
    vi driver/input/touchsrceen/s3c2410_ts.c

static int __devinit s3c2410ts_probe(struct platform_device , , , );
 input_set_abs_params(ts.input, ABS_Y, , , , );
 input_set_abs_params(ts.input, ABS_PRESSURE, , , , );   ); );
 input_sync(ts.input);
 ...
 ...
}); );
 input_sync(ts.input);
 ...
}

2.4 再次运行tslib库

ts_calibrate   //需要分别点击5次
    ts_test

@成鹏致远

(blogs:http://lcw.cnblogs.com)

(email:wwwlllll@126.com)

(qq:552158509)

【Linux高级驱动】触摸屏驱动的移植的更多相关文章

  1. ARM-Linux驱动-触摸屏驱动分析

    出处:http://blog.csdn.net/geekcome/article/details/6580981 硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内 ...

  2. Linux/Android——usb触摸屏驱动 - usbtouchscreen (一)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/41827495 最近需要往TV上装一个触摸屏设备,现在比较常见的就是使用usb接口的触摸框,适用于 ...

  3. Linux高级字符设备驱动

    转载:http://www.linuxidc.com/Linux/2012-05/60469p4.htm 1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select ...

  4. linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】

    转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...

  5. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  6. linux 触摸屏驱动

    目录 linux 触摸屏驱动 输入子系统怎么写? 触摸屏事件 事件分类 事件设置 硬件配置 设计思路 完整程序 测试 ts_lib 使用 问题小结 title: linux 触摸屏驱动 tags: l ...

  7. 基于FT5x06嵌入式Linux电容触摸屏驱动

    **************************************************************************************************** ...

  8. 基于设备树的TQ2440触摸屏驱动移植

    平台 开发板:tq2440 内核:Linux-4.9 u-boot:u-boot-2015.04   概述 之前移植了LCD驱动,下面继续移植触摸屏驱动,然后将tslib也移植上去. 正文 一.移植触 ...

  9. Linux学习: 触摸屏驱动

    一.Linux输入子系统的结构: 二.触摸屏驱动代码: s3c_ts.c #include <linux/errno.h> #include <linux/kernel.h> ...

随机推荐

  1. POJ 2923 Relocation 装车问题 【状态压缩DP】+【01背包】

    题目链接:https://vjudge.net/contest/103424#problem/I 转载于:>>>大牛博客 题目大意: 有 n 个货物,并且知道了每个货物的重量,每次用 ...

  2. hdu1003 Max Sum【最大连续子序列之和】

    题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...

  3. 【猿分享第10期】微信小程序Meetup扫盲专场回顾(转载)

    首先感谢答疑师:子慕 前端工程师,目前就职于医联,偶尔写点博客,吐槽总结,偶尔吟“湿”作对,润滑万物,江湖人称子慕大诗人. 直播间语音回放收听,请微信扫描下图二维码授权进入即可. 以下为本次直播的全部 ...

  4. 洛谷.3273.[SCOI2011]棘手的操作(左偏树)

    题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数 ...

  5. PyPDF2详解

    工作中可能会涉及处理pdf文件,PyPDF2就是这样一个库, 使用它可以轻松的处理pdf文件,它提供了读.写.分割.合并.文件转换等多种操作.官方地址:http://mstamy2.github.io ...

  6. 潭州课堂25班:Ph201805201 爬虫基础 第十一课 点触验证码 (课堂笔记)

    打开 网易盾 http://dun.163.com/trial/picture-click  ——在线体验——图中点选 打码平台 ——超级鹰    http://www.chaojiying.com/ ...

  7. 在Windows系统配置Jekyll

    Jekyll 是一个简单的网站静态页面生成工具.由于是用Ruby语音编写的,所以在Windows系统上配置起来还是稍微有点繁琐的.具体过程如下: 安装Ruby:在Windows系统上当然使用rubyi ...

  8. JavaScript_原型和继承(2017-03-15)

    一.函数创建过程 在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子: function A() {}; 当我们在代码里面声明这么一个空函数,js解析的本质是(肤浅理解有 ...

  9. SpringMVC统一转换null值为空字符串的方法

    在SpringMVC中,可以通过在<mvc:annotation-driven>中配置<mvc:message-converters>,把null值统一转换为空字符串,解决这个 ...

  10. 在Springboot2.0项目中使用Druid配置多数据源

    在Springboot出现之前配置数据源以及相关的事物,缓存等内容一直是个繁琐的工作,但是Springboot出现后这些基本都可以靠默认配置搞定,就变得很轻松了.这就是现在推崇模板>配置的原因, ...